igv 2.13.1 → 2.13.3

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.
package/dist/igv.js CHANGED
@@ -7291,7 +7291,7 @@
7291
7291
  * @param x
7292
7292
  * @returns {boolean}
7293
7293
  */
7294
- function isString$3(x) {
7294
+ function isString$2(x) {
7295
7295
  return typeof x === "string" || x instanceof String;
7296
7296
  } // StackOverflow: http://stackoverflow.com/a/10810674/116169
7297
7297
 
@@ -7353,13 +7353,6 @@
7353
7353
  return str;
7354
7354
  }
7355
7355
 
7356
- function hashCode$1(s) {
7357
- return s.split("").reduce(function (a, b) {
7358
- a = (a << 5) - a + b.charCodeAt(0);
7359
- return a & a;
7360
- }, 0);
7361
- }
7362
-
7363
7356
  function capitalize(str) {
7364
7357
  return str.length > 0 ? str.charAt(0).toUpperCase() + str.slice(1) : str;
7365
7358
  }
@@ -7821,7 +7814,7 @@
7821
7814
  function getFilename$1(urlOrFile) {
7822
7815
  if (urlOrFile.name !== undefined) {
7823
7816
  return urlOrFile.name;
7824
- } else if (isString$3(urlOrFile)) {
7817
+ } else if (isString$2(urlOrFile)) {
7825
7818
  let index = urlOrFile.lastIndexOf("/");
7826
7819
  let filename = index < 0 ? urlOrFile : urlOrFile.substr(index + 1); //Strip parameters -- handle local files later
7827
7820
 
@@ -18184,11 +18177,14 @@
18184
18177
  trackView,
18185
18178
  label: "Unset track color"
18186
18179
  }));
18187
- menuItems.push(colorPickerMenuItem({
18188
- trackView,
18189
- label: "Set alt color",
18190
- option: "altColor"
18191
- }));
18180
+
18181
+ if (trackView.track.config.type === 'wig' || trackView.track.config.type === 'annotation') {
18182
+ menuItems.push(colorPickerMenuItem({
18183
+ trackView,
18184
+ label: "Set alt color",
18185
+ option: "altColor"
18186
+ }));
18187
+ }
18192
18188
  }
18193
18189
 
18194
18190
  if (trackView.track.menuItemList) {
@@ -18448,6 +18444,446 @@
18448
18444
  return txt;
18449
18445
  }
18450
18446
 
18447
+ /*
18448
+ * The MIT License (MIT)
18449
+ *
18450
+ * Copyright (c) 2016-2017 The Regents of the University of California
18451
+ * Author: Jim Robinson
18452
+ *
18453
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
18454
+ * of this software and associated documentation files (the "Software"), to deal
18455
+ * in the Software without restriction, including without limitation the rights
18456
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18457
+ * copies of the Software, and to permit persons to whom the Software is
18458
+ * furnished to do so, subject to the following conditions:
18459
+ *
18460
+ * The above copyright notice and this permission notice shall be included in
18461
+ * all copies or substantial portions of the Software.
18462
+ *
18463
+ *
18464
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18465
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18466
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18467
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18468
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18469
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
18470
+ * THE SOFTWARE.
18471
+ */
18472
+
18473
+ class DataRangeDialog {
18474
+ constructor(browser, $parent, alert) {
18475
+ this.browser = browser; // dialog container
18476
+
18477
+ this.$container = $$1("<div>", {
18478
+ class: 'igv-generic-dialog-container'
18479
+ });
18480
+ $parent.append(this.$container);
18481
+ this.$container.offset({
18482
+ left: 0,
18483
+ top: 0
18484
+ }); // dialog header
18485
+
18486
+ const $header = $$1("<div>", {
18487
+ class: 'igv-generic-dialog-header'
18488
+ });
18489
+ this.$container.append($header);
18490
+ attachDialogCloseHandlerWithParent$1($header[0], () => {
18491
+ this.$minimum_input.val(undefined);
18492
+ this.$maximum_input.val(undefined);
18493
+ this.$container.offset({
18494
+ left: 0,
18495
+ top: 0
18496
+ });
18497
+ this.$container.hide();
18498
+ }); // minimun
18499
+
18500
+ this.$minimum = $$1("<div>", {
18501
+ class: 'igv-generic-dialog-label-input'
18502
+ });
18503
+ this.$container.append(this.$minimum);
18504
+ const $mindiv = $$1('<div>');
18505
+ $mindiv.text('Minimum');
18506
+ this.$minimum.append($mindiv);
18507
+ this.$minimum_input = $$1("<input>");
18508
+ this.$minimum.append(this.$minimum_input); // maximum
18509
+
18510
+ this.$maximum = $$1("<div>", {
18511
+ class: 'igv-generic-dialog-label-input'
18512
+ });
18513
+ this.$container.append(this.$maximum);
18514
+ const $maxdiv = $$1('<div>');
18515
+ $maxdiv.text('Maximum');
18516
+ this.$maximum.append($maxdiv);
18517
+ this.$maximum_input = $$1("<input>");
18518
+ this.$maximum.append(this.$maximum_input); // ok | cancel
18519
+
18520
+ const $buttons = $$1("<div>", {
18521
+ class: 'igv-generic-dialog-ok-cancel'
18522
+ });
18523
+ this.$container.append($buttons); // ok
18524
+
18525
+ this.$ok = $$1("<div>");
18526
+ $buttons.append(this.$ok);
18527
+ this.$ok.text('OK'); // cancel
18528
+
18529
+ this.$cancel = $$1("<div>");
18530
+ $buttons.append(this.$cancel);
18531
+ this.$cancel.text('Cancel');
18532
+ this.$cancel.on('click', () => {
18533
+ this.$minimum_input.val(undefined);
18534
+ this.$maximum_input.val(undefined);
18535
+ this.$container.offset({
18536
+ left: 0,
18537
+ top: 0
18538
+ });
18539
+ this.$container.hide();
18540
+ }); //this.$container.draggable({ handle:$header.get(0) });
18541
+
18542
+ makeDraggable$1(this.$container.get(0), $header.get(0));
18543
+ this.$container.hide();
18544
+ }
18545
+
18546
+ configure(trackView) {
18547
+ const dataRange = trackView.dataRange();
18548
+ let min;
18549
+ let max;
18550
+
18551
+ if (dataRange) {
18552
+ min = dataRange.min;
18553
+ max = dataRange.max;
18554
+ } else {
18555
+ min = 0;
18556
+ max = 100;
18557
+ }
18558
+
18559
+ this.$minimum_input.val(min);
18560
+ this.$maximum_input.val(max);
18561
+ this.$minimum_input.unbind();
18562
+ this.$minimum_input.on('keyup', e => {
18563
+ if (13 === e.keyCode) {
18564
+ this.processResults(trackView);
18565
+ }
18566
+ });
18567
+ this.$maximum_input.unbind();
18568
+ this.$maximum_input.on('keyup', e => {
18569
+ if (13 === e.keyCode) {
18570
+ this.processResults(trackView);
18571
+ }
18572
+ });
18573
+ this.$ok.unbind();
18574
+ this.$ok.on('click', e => {
18575
+ this.processResults(trackView);
18576
+ });
18577
+ }
18578
+
18579
+ processResults(trackView) {
18580
+ const min = Number(this.$minimum_input.val());
18581
+ const max = Number(this.$maximum_input.val());
18582
+
18583
+ if (isNaN(min) || isNaN(max)) {
18584
+ this.browser.alert.present(new Error('Must input numeric values'), undefined);
18585
+ } else {
18586
+ trackView.setDataRange(min, max);
18587
+ }
18588
+
18589
+ this.$minimum_input.val(undefined);
18590
+ this.$maximum_input.val(undefined);
18591
+ this.$container.offset({
18592
+ left: 0,
18593
+ top: 0
18594
+ });
18595
+ this.$container.hide();
18596
+ }
18597
+
18598
+ present($parent) {
18599
+ const offset_top = $parent.offset().top;
18600
+ const scroll_top = $$1('body').scrollTop();
18601
+ this.$container.offset({
18602
+ left: $parent.width() - this.$container.width(),
18603
+ top: offset_top + scroll_top
18604
+ });
18605
+ this.$container.show();
18606
+ }
18607
+
18608
+ }
18609
+
18610
+ /*
18611
+ * The MIT License (MIT)
18612
+ *
18613
+ * Copyright (c) 2014 Broad Institute
18614
+ *
18615
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
18616
+ * of ctx software and associated documentation files (the "Software"), to deal
18617
+ * in the Software without restriction, including without limitation the rights
18618
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18619
+ * copies of the Software, and to permit persons to whom the Software is
18620
+ * furnished to do so, subject to the following conditions:
18621
+ *
18622
+ * The above copyright notice and ctx permission notice shall be included in
18623
+ * all copies or substantial portions of the Software.
18624
+ *
18625
+ *
18626
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18627
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18628
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18629
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18630
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18631
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
18632
+ * THE SOFTWARE.
18633
+ */
18634
+
18635
+ const IGVGraphics = {
18636
+ configureHighDPICanvas: function (ctx, w, h) {
18637
+ const scaleFactor = window.devicePixelRatio; // const scaleFactor = 1
18638
+
18639
+ ctx.canvas.style.width = `${w}px`;
18640
+ ctx.canvas.width = Math.floor(scaleFactor * w);
18641
+ ctx.canvas.style.height = `${h}px`;
18642
+ ctx.canvas.height = Math.floor(scaleFactor * h);
18643
+ ctx.scale(scaleFactor, scaleFactor);
18644
+ },
18645
+ setProperties: function (ctx, properties) {
18646
+ for (var key in properties) {
18647
+ if (properties.hasOwnProperty(key)) {
18648
+ var value = properties[key];
18649
+ ctx[key] = value;
18650
+ }
18651
+ }
18652
+ },
18653
+ strokeLine: function (ctx, x1, y1, x2, y2, properties) {
18654
+ x1 = Math.floor(x1) + 0.5;
18655
+ y1 = Math.floor(y1) + 0.5;
18656
+ x2 = Math.floor(x2) + 0.5;
18657
+ y2 = Math.floor(y2) + 0.5;
18658
+
18659
+ if (properties) {
18660
+ ctx.save();
18661
+ IGVGraphics.setProperties(ctx, properties);
18662
+ }
18663
+
18664
+ ctx.beginPath();
18665
+ ctx.moveTo(x1, y1);
18666
+ ctx.lineTo(x2, y2);
18667
+ ctx.stroke();
18668
+ if (properties) ctx.restore();
18669
+ },
18670
+ fillRect: function (ctx, x, y, w, h, properties) {
18671
+ x = Math.round(x);
18672
+ y = Math.round(y);
18673
+
18674
+ if (properties) {
18675
+ ctx.save();
18676
+ IGVGraphics.setProperties(ctx, properties);
18677
+ }
18678
+
18679
+ ctx.fillRect(x, y, w, h);
18680
+ if (properties) ctx.restore();
18681
+ },
18682
+ fillPolygon: function (ctx, x, y, properties) {
18683
+ if (properties) {
18684
+ ctx.save();
18685
+ IGVGraphics.setProperties(ctx, properties);
18686
+ }
18687
+
18688
+ doPath(ctx, x, y);
18689
+ ctx.fill();
18690
+ if (properties) ctx.restore();
18691
+ },
18692
+ strokePolygon: function (ctx, x, y, properties) {
18693
+ if (properties) {
18694
+ ctx.save();
18695
+ IGVGraphics.setProperties(ctx, properties);
18696
+ }
18697
+
18698
+ doPath(ctx, x, y);
18699
+ ctx.stroke();
18700
+ if (properties) ctx.restore();
18701
+ },
18702
+ fillText: function (ctx, text, x, y, properties, transforms) {
18703
+ if (properties || transforms) {
18704
+ ctx.save();
18705
+ }
18706
+
18707
+ if (properties) {
18708
+ IGVGraphics.setProperties(ctx, properties);
18709
+ }
18710
+
18711
+ if (transforms) {
18712
+ // Slow path with context saving and extra translate
18713
+ ctx.translate(x, y);
18714
+
18715
+ for (var transform in transforms) {
18716
+ var value = transforms[transform]; // TODO: Add error checking for robustness
18717
+
18718
+ if (transform === 'translate') {
18719
+ ctx.translate(value['x'], value['y']);
18720
+ }
18721
+
18722
+ if (transform === 'rotate') {
18723
+ ctx.rotate(value['angle'] * Math.PI / 180);
18724
+ }
18725
+ }
18726
+
18727
+ ctx.fillText(text, 0, 0);
18728
+ } else {
18729
+ ctx.fillText(text, x, y);
18730
+ }
18731
+
18732
+ if (properties || transforms) ctx.restore();
18733
+ },
18734
+ strokeText: function (ctx, text, x, y, properties, transforms) {
18735
+ if (properties || transforms) {
18736
+ ctx.save();
18737
+ }
18738
+
18739
+ if (properties) {
18740
+ IGVGraphics.setProperties(ctx, properties);
18741
+ }
18742
+
18743
+ if (transforms) {
18744
+ ctx.translate(x, y);
18745
+
18746
+ for (var transform in transforms) {
18747
+ var value = transforms[transform]; // TODO: Add error checking for robustness
18748
+
18749
+ if (transform === 'translate') {
18750
+ ctx.translate(value['x'], value['y']);
18751
+ }
18752
+
18753
+ if (transform === 'rotate') {
18754
+ ctx.rotate(value['angle'] * Math.PI / 180);
18755
+ }
18756
+ }
18757
+
18758
+ ctx.strokeText(text, 0, 0);
18759
+ } else {
18760
+ ctx.strokeText(text, x, y);
18761
+ }
18762
+
18763
+ if (properties || transforms) ctx.restore();
18764
+ },
18765
+ strokeCircle: function (ctx, x, y, radius, properties) {
18766
+ if (properties) {
18767
+ ctx.save();
18768
+ IGVGraphics.setProperties(ctx, properties);
18769
+ }
18770
+
18771
+ ctx.beginPath();
18772
+ ctx.arc(x, y, radius, 0, 2 * Math.PI);
18773
+ ctx.stroke();
18774
+ if (properties) ctx.restore();
18775
+ },
18776
+ fillCircle: function (ctx, x, y, radius, properties) {
18777
+ if (properties) {
18778
+ ctx.save();
18779
+ IGVGraphics.setProperties(ctx, properties);
18780
+ }
18781
+
18782
+ ctx.beginPath();
18783
+ ctx.arc(x, y, radius, 0, 2 * Math.PI);
18784
+ ctx.fill();
18785
+ if (properties) ctx.restore();
18786
+ },
18787
+ drawArrowhead: function (ctx, x, y, size, lineWidth) {
18788
+ ctx.save();
18789
+
18790
+ if (!size) {
18791
+ size = 5;
18792
+ }
18793
+
18794
+ if (lineWidth) {
18795
+ ctx.lineWidth = lineWidth;
18796
+ }
18797
+
18798
+ ctx.beginPath();
18799
+ ctx.moveTo(x, y - size / 2);
18800
+ ctx.lineTo(x, y + size / 2);
18801
+ ctx.lineTo(x + size, y);
18802
+ ctx.lineTo(x, y - size / 2);
18803
+ ctx.closePath();
18804
+ ctx.fill();
18805
+ ctx.restore();
18806
+ },
18807
+ dashedLine: function (ctx, x1, y1, x2, y2, dashLen) {
18808
+ let properties = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
18809
+ if (dashLen === undefined) dashLen = 2;
18810
+ ctx.setLineDash([dashLen, dashLen]);
18811
+ IGVGraphics.strokeLine(ctx, x1, y1, x2, y2, properties);
18812
+ ctx.setLineDash([]);
18813
+ },
18814
+ roundRect: function (ctx, x, y, width, height, radius, fill, stroke) {
18815
+ if (typeof stroke == "undefined") {
18816
+ stroke = true;
18817
+ }
18818
+
18819
+ if (typeof radius === "undefined") {
18820
+ radius = 5;
18821
+ }
18822
+
18823
+ ctx.beginPath();
18824
+ ctx.moveTo(x + radius, y);
18825
+ ctx.lineTo(x + width - radius, y);
18826
+ ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
18827
+ ctx.lineTo(x + width, y + height - radius);
18828
+ ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
18829
+ ctx.lineTo(x + radius, y + height);
18830
+ ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
18831
+ ctx.lineTo(x, y + radius);
18832
+ ctx.quadraticCurveTo(x, y, x + radius, y);
18833
+ ctx.closePath();
18834
+
18835
+ if (stroke) {
18836
+ ctx.stroke();
18837
+ }
18838
+
18839
+ if (fill) {
18840
+ ctx.fill();
18841
+ }
18842
+ },
18843
+ polygon: function (ctx, x, y, fill, stroke) {
18844
+ if (typeof stroke == "undefined") {
18845
+ stroke = true;
18846
+ }
18847
+
18848
+ ctx.beginPath();
18849
+ var len = x.length;
18850
+ ctx.moveTo(x[0], y[0]);
18851
+
18852
+ for (var i = 1; i < len; i++) {
18853
+ ctx.lineTo(x[i], y[i]); // this.moveTo(x[i], y[i]);
18854
+ }
18855
+
18856
+ ctx.closePath();
18857
+
18858
+ if (stroke) {
18859
+ ctx.stroke();
18860
+ }
18861
+
18862
+ if (fill) {
18863
+ ctx.fill();
18864
+ }
18865
+ }
18866
+ };
18867
+
18868
+ function doPath(ctx, x, y) {
18869
+ var i,
18870
+ len = x.length;
18871
+
18872
+ for (i = 0; i < len; i++) {
18873
+ x[i] = Math.round(x[i]);
18874
+ y[i] = Math.round(y[i]);
18875
+ }
18876
+
18877
+ ctx.beginPath();
18878
+ ctx.moveTo(x[0], y[0]);
18879
+
18880
+ for (i = 1; i < len; i++) {
18881
+ ctx.lineTo(x[i], y[i]);
18882
+ }
18883
+
18884
+ ctx.closePath();
18885
+ }
18886
+
18451
18887
  function div(options) {
18452
18888
  return create("div", options);
18453
18889
  }
@@ -18810,22 +19246,6 @@
18810
19246
 
18811
19247
  }
18812
19248
 
18813
- let alertDialog;
18814
- const Alert = {
18815
- init(root, config = {}) {
18816
- alertDialog = new AlertDialog(root, config);
18817
- },
18818
-
18819
- presentAlert(alert, callback) {
18820
- if (!alertDialog) {
18821
- this.init(document.body);
18822
- }
18823
-
18824
- alertDialog.present(alert, callback);
18825
- }
18826
-
18827
- };
18828
-
18829
19249
  class InputDialog {
18830
19250
  constructor(parent) {
18831
19251
  this.parent = parent; // dialog container
@@ -20191,11 +20611,58 @@
20191
20611
  }
20192
20612
  }
20193
20613
 
20614
+ class Alert {
20615
+ constructor(parent) {
20616
+ this.dialog = new AlertDialog(parent);
20617
+ }
20618
+
20619
+ present(alert, callback) {
20620
+ this.dialog.present(alert, callback);
20621
+ }
20622
+
20623
+ }
20624
+
20625
+ const FileFormats = {
20626
+ gwascatalog: {
20627
+ fields: ['bin', 'chr', 'start', 'end', 'name', 'pubMedID', 'author', 'pubDate', 'journal', 'title', 'trait', 'initSample', 'replSample', 'region', 'genes', 'riskAllele', 'riskAlFreq', 'pValue', 'pValueDesc', 'orOrBeta', 'ci95', 'platform', 'cnv']
20628
+ },
20629
+ wgrna: {
20630
+ fields: ['bin', 'chr', 'start', 'end', 'name', 'score', 'strand', 'thickStart', 'thickEnd', 'type']
20631
+ },
20632
+ cpgislandext: {
20633
+ fields: ['bin', 'chr', 'start', 'end', 'name', 'length', 'cpgNum', 'gcNum', 'perCpg', 'perGc', 'obsExp']
20634
+ },
20635
+ clinVarMain: {
20636
+ fields: ['chr1', 'start', 'end', 'name', 'score', 'strand', 'thickStart', 'thickEnd', 'reserved', 'blockCount', // Number of blocks
20637
+ 'blockSizes', // Comma separated list of block sizes
20638
+ 'chromStarts', // Start positions relative to chromStart
20639
+ 'origName', // NM_198053.2(CD247):c.462C>T (p.Asp154=) ClinVar Variation Report
20640
+ 'clinSign', // Likely benign Clinical significance
20641
+ 'reviewStatus', // based on: criteria provided,single submitter Review Status
20642
+ 'type', // single nucleotide variant Type of Variant
20643
+ 'geneId', // CD247 Gene Symbol
20644
+ 'snpId', // 181656780 dbSNP ID
20645
+ 'nsvId', // dbVar ID
20646
+ 'rcvAcc', // RCV000642347 ClinVar Allele Submission
20647
+ 'testedInGtr', // N Genetic Testing Registry
20648
+ 'phenotypeList', // Immunodeficiency due to defect in cd3-zeta Phenotypes
20649
+ 'phenotype', // MedGen:C1857798, OMIM:610163 Phenotype identifiers
20650
+ 'origin', // germline Data origin
20651
+ 'assembly', // GRCh37 Genome assembly
20652
+ 'cytogenetic', // 1q24.2 Cytogenetic status
20653
+ 'hgvsCod', // NM_198053.2:c.462C>T Nucleotide HGVS
20654
+ 'hgvsProt', // NP_932170.1:p.Asp154= Protein HGVS
20655
+ 'numSubmit', // 1 Number of submitters
20656
+ 'lastEval', // Dec 19,2017 Last evaluation
20657
+ 'guidelines', // Guidelines
20658
+ 'otherIds']
20659
+ }
20660
+ };
20661
+
20194
20662
  /*
20195
20663
  * The MIT License (MIT)
20196
20664
  *
20197
- * Copyright (c) 2016-2017 The Regents of the University of California
20198
- * Author: Jim Robinson
20665
+ * Copyright (c) 2014 Broad Institute
20199
20666
  *
20200
20667
  * Permission is hereby granted, free of charge, to any person obtaining a copy
20201
20668
  * of this software and associated documentation files (the "Software"), to deal
@@ -20216,1436 +20683,360 @@
20216
20683
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20217
20684
  * THE SOFTWARE.
20218
20685
  */
20686
+ /**
20687
+ * Test if the given value is a string or number. Not using typeof as it fails on boxed primitives.
20688
+ *
20689
+ * @param value
20690
+ * @returns boolean
20691
+ */
20219
20692
 
20220
- class DataRangeDialog {
20221
- constructor($parent, alert) {
20222
- // dialog container
20223
- this.$container = $$1("<div>", {
20224
- class: 'igv-generic-dialog-container'
20225
- });
20226
- $parent.append(this.$container);
20227
- this.$container.offset({
20228
- left: 0,
20229
- top: 0
20230
- }); // dialog header
20231
-
20232
- const $header = $$1("<div>", {
20233
- class: 'igv-generic-dialog-header'
20234
- });
20235
- this.$container.append($header);
20236
- attachDialogCloseHandlerWithParent$1($header[0], () => {
20237
- this.$minimum_input.val(undefined);
20238
- this.$maximum_input.val(undefined);
20239
- this.$container.offset({
20240
- left: 0,
20241
- top: 0
20242
- });
20243
- this.$container.hide();
20244
- }); // minimun
20245
20693
 
20246
- this.$minimum = $$1("<div>", {
20247
- class: 'igv-generic-dialog-label-input'
20248
- });
20249
- this.$container.append(this.$minimum);
20250
- const $mindiv = $$1('<div>');
20251
- $mindiv.text('Minimum');
20252
- this.$minimum.append($mindiv);
20253
- this.$minimum_input = $$1("<input>");
20254
- this.$minimum.append(this.$minimum_input); // maximum
20694
+ function isSimpleType(value) {
20695
+ const simpleTypes = new Set(["boolean", "number", "string", "symbol"]);
20696
+ const valueType = typeof value;
20697
+ return value !== undefined && (simpleTypes.has(valueType) || value.substring || value.toFixed);
20698
+ }
20255
20699
 
20256
- this.$maximum = $$1("<div>", {
20257
- class: 'igv-generic-dialog-label-input'
20258
- });
20259
- this.$container.append(this.$maximum);
20260
- const $maxdiv = $$1('<div>');
20261
- $maxdiv.text('Maximum');
20262
- this.$maximum.append($maxdiv);
20263
- this.$maximum_input = $$1("<input>");
20264
- this.$maximum.append(this.$maximum_input); // ok | cancel
20700
+ function buildOptions(config, options) {
20701
+ var defaultOptions = {
20702
+ oauthToken: config.oauthToken,
20703
+ headers: config.headers,
20704
+ withCredentials: config.withCredentials,
20705
+ filename: config.filename
20706
+ };
20707
+ return Object.assign(defaultOptions, options);
20708
+ }
20709
+ /**
20710
+ * isMobile test from http://detectmobilebrowsers.com
20711
+ * TODO -- improve UI design so this isn't neccessary
20712
+ * @returns {boolean}
20713
+ */
20714
+ // igv.isMobile = function () {
20715
+ //
20716
+ // const a = (navigator.userAgent || navigator.vendor || window.opera);
20717
+ // return (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) ||
20718
+ // /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)))
20719
+ //
20720
+ // }
20265
20721
 
20266
- const $buttons = $$1("<div>", {
20267
- class: 'igv-generic-dialog-ok-cancel'
20268
- });
20269
- this.$container.append($buttons); // ok
20270
20722
 
20271
- this.$ok = $$1("<div>");
20272
- $buttons.append(this.$ok);
20273
- this.$ok.text('OK'); // cancel
20723
+ const doAutoscale = function (features) {
20724
+ var min, max;
20274
20725
 
20275
- this.$cancel = $$1("<div>");
20276
- $buttons.append(this.$cancel);
20277
- this.$cancel.text('Cancel');
20278
- this.$cancel.on('click', () => {
20279
- this.$minimum_input.val(undefined);
20280
- this.$maximum_input.val(undefined);
20281
- this.$container.offset({
20282
- left: 0,
20283
- top: 0
20284
- });
20285
- this.$container.hide();
20286
- }); //this.$container.draggable({ handle:$header.get(0) });
20726
+ if (features.length > 0) {
20727
+ min = Number.MAX_VALUE;
20728
+ max = -Number.MAX_VALUE;
20729
+ features.forEach(function (f) {
20730
+ if (!Number.isNaN(f.value)) {
20731
+ min = Math.min(min, f.value);
20732
+ max = Math.max(max, f.value);
20733
+ }
20734
+ }); // Insure we have a zero baseline
20287
20735
 
20288
- makeDraggable$1(this.$container.get(0), $header.get(0));
20289
- this.$container.hide();
20736
+ if (max > 0) min = Math.min(0, min);
20737
+ if (max < 0) max = 0;
20738
+ } else {
20739
+ // No features -- default
20740
+ min = 0;
20741
+ max = 100;
20290
20742
  }
20291
20743
 
20292
- configure(trackView) {
20293
- const dataRange = trackView.dataRange();
20294
- let min;
20295
- let max;
20744
+ return {
20745
+ min: min,
20746
+ max: max
20747
+ };
20748
+ };
20296
20749
 
20297
- if (dataRange) {
20298
- min = dataRange.min;
20299
- max = dataRange.max;
20750
+ const validateGenomicExtent = function (chromosomeLengthBP, genomicExtent, minimumBP) {
20751
+ let ss = genomicExtent.start;
20752
+ let ee = genomicExtent.end;
20753
+
20754
+ if (undefined === ee) {
20755
+ ss -= minimumBP / 2;
20756
+ ee = ss + minimumBP;
20757
+
20758
+ if (ee > chromosomeLengthBP) {
20759
+ ee = chromosomeLengthBP;
20760
+ ss = ee - minimumBP;
20761
+ } else if (ss < 0) {
20762
+ ss = 0;
20763
+ ee = minimumBP;
20764
+ }
20765
+ } else if (ee - ss < minimumBP) {
20766
+ const center = (ee + ss) / 2;
20767
+
20768
+ if (center - minimumBP / 2 < 0) {
20769
+ ss = 0;
20770
+ ee = ss + minimumBP;
20771
+ } else if (center + minimumBP / 2 > chromosomeLengthBP) {
20772
+ ee = chromosomeLengthBP;
20773
+ ss = ee - minimumBP;
20300
20774
  } else {
20301
- min = 0;
20302
- max = 100;
20775
+ ss = center - minimumBP / 2;
20776
+ ee = ss + minimumBP;
20303
20777
  }
20778
+ }
20304
20779
 
20305
- this.$minimum_input.val(min);
20306
- this.$maximum_input.val(max);
20307
- this.$minimum_input.unbind();
20308
- this.$minimum_input.on('keyup', e => {
20309
- if (13 === e.keyCode) {
20310
- this.processResults(trackView);
20311
- }
20312
- });
20313
- this.$maximum_input.unbind();
20314
- this.$maximum_input.on('keyup', e => {
20315
- if (13 === e.keyCode) {
20316
- this.processResults(trackView);
20317
- }
20318
- });
20319
- this.$ok.unbind();
20320
- this.$ok.on('click', e => {
20321
- this.processResults(trackView);
20322
- });
20780
+ genomicExtent.start = Math.ceil(ss);
20781
+ genomicExtent.end = Math.floor(ee);
20782
+ };
20783
+ /*!
20784
+ * is-number <https://github.com/jonschlinkert/is-number>
20785
+ *
20786
+ * Copyright (c) 2014-present, Jon Schlinkert.
20787
+ * Released under the MIT License.
20788
+ */
20789
+
20790
+
20791
+ const isNumber = function (num) {
20792
+ if (typeof num === 'number') {
20793
+ return num - num === 0;
20323
20794
  }
20324
20795
 
20325
- processResults(trackView) {
20326
- const min = Number(this.$minimum_input.val());
20327
- const max = Number(this.$maximum_input.val());
20796
+ if (typeof num === 'string' && num.trim() !== '') {
20797
+ return Number.isFinite ? Number.isFinite(+num) : isFinite(+num);
20798
+ }
20328
20799
 
20329
- if (isNaN(min) || isNaN(max)) {
20330
- Alert.presentAlert(new Error('Must input numeric values'), undefined);
20331
- } else {
20332
- trackView.setDataRange(min, max);
20800
+ return false;
20801
+ };
20802
+
20803
+ async function getFilename(url) {
20804
+ if (isString$2(url) && url.startsWith("https://drive.google.com")) {
20805
+ // This will fail if Google API key is not defined
20806
+ if (getApiKey() === undefined) {
20807
+ throw Error("Google drive is referenced, but API key is not defined. An API key is required for Google Drive access");
20333
20808
  }
20334
20809
 
20335
- this.$minimum_input.val(undefined);
20336
- this.$maximum_input.val(undefined);
20337
- this.$container.offset({
20338
- left: 0,
20339
- top: 0
20340
- });
20341
- this.$container.hide();
20810
+ const json = await getDriveFileInfo(url);
20811
+ return json.originalFileName || json.name;
20812
+ } else {
20813
+ return getFilename$1(url);
20342
20814
  }
20815
+ }
20343
20816
 
20344
- present($parent) {
20345
- const offset_top = $parent.offset().top;
20346
- const scroll_top = $$1('body').scrollTop();
20347
- this.$container.offset({
20348
- left: $parent.width() - this.$container.width(),
20349
- top: offset_top + scroll_top
20350
- });
20351
- this.$container.show();
20817
+ function prettyBasePairNumber(raw) {
20818
+ var denom, units, value, floored;
20819
+
20820
+ if (raw > 1e7) {
20821
+ denom = 1e6;
20822
+ units = " mb";
20823
+ } else if (raw > 1e4) {
20824
+ denom = 1e3;
20825
+ units = " kb";
20826
+ value = raw / denom;
20827
+ floored = Math.floor(value);
20828
+ return numberFormatter$1(floored) + units;
20829
+ } else {
20830
+ return numberFormatter$1(raw) + " bp";
20352
20831
  }
20353
20832
 
20833
+ value = raw / denom;
20834
+ floored = Math.floor(value);
20835
+ return floored.toString() + units;
20354
20836
  }
20355
20837
 
20356
- /*
20357
- * The MIT License (MIT)
20838
+ function isDataURL(obj) {
20839
+ return isString$2(obj) && obj.startsWith("data:");
20840
+ }
20841
+
20842
+ function createColumn(columnContainer, className) {
20843
+ const column = div$1({
20844
+ class: className
20845
+ });
20846
+ columnContainer.appendChild(column);
20847
+ }
20848
+
20849
+ function insertElementBefore(element, referenceNode) {
20850
+ referenceNode.parentNode.insertBefore(element, referenceNode);
20851
+ }
20852
+
20853
+ function insertElementAfter(element, referenceNode) {
20854
+ referenceNode.parentNode.insertBefore(element, referenceNode.nextSibling);
20855
+ }
20856
+ /**
20857
+ * Test to see if page is loaded in a secure context, that is by https or is localhost.
20858
+ */
20859
+
20860
+
20861
+ function isSecureContext() {
20862
+ return window.location.protocol === "https:" || window.location.hostname === "localhost";
20863
+ } // reference: https://pretagteam.com/question/find-element-height-including-margin
20864
+
20865
+
20866
+ function getElementAbsoluteHeight(element) {
20867
+ // Get the DOM Node if you pass in a string
20868
+ element = typeof element === 'string' ? document.querySelector(element) : element;
20869
+ const styles = window.getComputedStyle(element);
20870
+ const margin = parseFloat(styles['marginTop']) + parseFloat(styles['marginBottom']);
20871
+ const height = element.offsetHeight;
20872
+ return Math.ceil(margin + height);
20873
+ }
20874
+
20875
+ /**
20876
+ * Decoder for bedpe records.
20358
20877
  *
20359
- * Copyright (c) 2014 Broad Institute
20878
+ * Bedpe format was created by Aaron Quinlan et al as part of the bedtools project.
20879
+ * The spec is here: https://bedtools.readthedocs.io/en/latest/content/general-usage.html,
20360
20880
  *
20361
- * Permission is hereby granted, free of charge, to any person obtaining a copy
20362
- * of ctx software and associated documentation files (the "Software"), to deal
20363
- * in the Software without restriction, including without limitation the rights
20364
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
20365
- * copies of the Software, and to permit persons to whom the Software is
20366
- * furnished to do so, subject to the following conditions:
20881
+ * 1 2 3 4 5 6 7 8 9 10 11-
20882
+ * chrom1 start1 end1 chrom2 start2 end2 name score strand1 strand2 <Any number of additional, user-defined fields>
20367
20883
  *
20368
- * The above copyright notice and ctx permission notice shall be included in
20369
- * all copies or substantial portions of the Software.
20884
+ * However there are off spec variants, an important one being a 7 column format with score in place of the standard
20885
+ * name column.
20370
20886
  *
20887
+ * A common variant is a "hiccups" output file, which is standard bedpe with the exception of a header line
20888
+ * of the form
20371
20889
  *
20372
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20373
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20374
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20375
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20376
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20377
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20378
- * THE SOFTWARE.
20890
+ * chr1 x1 x2 chr2 y1 y2 name score strand1 strand2 color observed expectedBL expectedDonut expectedH expectedV fdrBL fdrDonut fdrH fdrV
20891
+ *
20892
+ * The "hiccups" output is apparently not standardized as this is found at ENCODE, with a non-helpful "tsv" extension
20893
+ *
20894
+ * chr1 x1 x2 chr2 y1 y2 color observed expectedBL expectedDonut expectedH expectedV fdrBL fdrDonut fdrH fdrV numCollapsed centroid1 centroid2 radius
20895
+ * chr9 136790000 136795000 chr9 136990000 136995000 0,255,255 101.0 31.100368 38.40316 56.948116 34.040756 1.1876738E-13 1.05936405E-13 2.5148233E-4 1.7220993E-13 1 136792500 136992500 25590
20896
+ *
20897
+ * The "hiccups" documentation specfies yet another set of column headers
20898
+ * chromosome1 x1 x2 chromosome2 y1 y2 color observed expected_bottom_left expected_donut expected_horizontal expected_vertical fdr_bottom_left fdr_donut fdr_horizontal fdr_vertical number_collapsed centroid1 centroid2 radius
20899
+ *
20900
+ * @param tokens
20901
+ * @param ignore
20902
+ * @returns {{start1: number, end2: number, end1: number, chr1: *, chr2: *, start2: number}|undefined}
20379
20903
  */
20380
20904
 
20381
- const IGVGraphics = {
20382
- configureHighDPICanvas: function (ctx, w, h) {
20383
- const scaleFactor = window.devicePixelRatio; // const scaleFactor = 1
20905
+ function decodeBedpe(tokens, header) {
20906
+ if (tokens.length < 6) {
20907
+ console.log("Skipping line: " + tokens.join(' '));
20908
+ return undefined;
20909
+ }
20384
20910
 
20385
- ctx.canvas.style.width = `${w}px`;
20386
- ctx.canvas.width = Math.floor(scaleFactor * w);
20387
- ctx.canvas.style.height = `${h}px`;
20388
- ctx.canvas.height = Math.floor(scaleFactor * h);
20389
- ctx.scale(scaleFactor, scaleFactor);
20390
- },
20391
- setProperties: function (ctx, properties) {
20392
- for (var key in properties) {
20393
- if (properties.hasOwnProperty(key)) {
20394
- var value = properties[key];
20395
- ctx[key] = value;
20396
- }
20397
- }
20398
- },
20399
- strokeLine: function (ctx, x1, y1, x2, y2, properties) {
20400
- x1 = Math.floor(x1) + 0.5;
20401
- y1 = Math.floor(y1) + 0.5;
20402
- x2 = Math.floor(x2) + 0.5;
20403
- y2 = Math.floor(y2) + 0.5;
20911
+ var feature = {
20912
+ chr1: tokens[0],
20913
+ start1: Number.parseInt(tokens[1]),
20914
+ end1: Number.parseInt(tokens[2]),
20915
+ chr2: tokens[3],
20916
+ start2: Number.parseInt(tokens[4]),
20917
+ end2: Number.parseInt(tokens[5])
20918
+ };
20404
20919
 
20405
- if (properties) {
20406
- ctx.save();
20407
- IGVGraphics.setProperties(ctx, properties);
20408
- }
20920
+ if (isNaN(feature.start1) || isNaN(feature.end1) || isNaN(feature.start2) || isNaN(feature.end2)) {
20921
+ //throw Error(`Error parsing line: ${tokens.join('\t')}`);
20922
+ return undefined;
20923
+ } // Determine if this is a "hiccups" file. Store result on "header" so it doesn't need repeated for every feature
20409
20924
 
20410
- ctx.beginPath();
20411
- ctx.moveTo(x1, y1);
20412
- ctx.lineTo(x2, y2);
20413
- ctx.stroke();
20414
- if (properties) ctx.restore();
20415
- },
20416
- fillRect: function (ctx, x, y, w, h, properties) {
20417
- x = Math.round(x);
20418
- y = Math.round(y);
20419
20925
 
20420
- if (properties) {
20421
- ctx.save();
20422
- IGVGraphics.setProperties(ctx, properties);
20423
- }
20926
+ if (header && header.hiccups === undefined) {
20927
+ header.hiccups = header.columnNames ? isHiccups(header.columnNames) : false;
20928
+ }
20424
20929
 
20425
- ctx.fillRect(x, y, w, h);
20426
- if (properties) ctx.restore();
20427
- },
20428
- fillPolygon: function (ctx, x, y, properties) {
20429
- if (properties) {
20430
- ctx.save();
20431
- IGVGraphics.setProperties(ctx, properties);
20432
- }
20930
+ const hiccups = header && header.hiccups;
20931
+ const stdColumns = hiccups ? 6 : 10;
20433
20932
 
20434
- doPath(ctx, x, y);
20435
- ctx.fill();
20436
- if (properties) ctx.restore();
20437
- },
20438
- strokePolygon: function (ctx, x, y, properties) {
20439
- if (properties) {
20440
- ctx.save();
20441
- IGVGraphics.setProperties(ctx, properties);
20933
+ if (!hiccups) {
20934
+ if (tokens.length > 6 && tokens[6] !== ".") {
20935
+ feature.name = tokens[6];
20442
20936
  }
20443
20937
 
20444
- doPath(ctx, x, y);
20445
- ctx.stroke();
20446
- if (properties) ctx.restore();
20447
- },
20448
- fillText: function (ctx, text, x, y, properties, transforms) {
20449
- if (properties || transforms) {
20450
- ctx.save();
20938
+ if (tokens.length > 7 && tokens[7] !== ".") {
20939
+ feature.score = Number(tokens[7]);
20451
20940
  }
20452
20941
 
20453
- if (properties) {
20454
- IGVGraphics.setProperties(ctx, properties);
20942
+ if (tokens.length > 8 && tokens[8] !== ".") {
20943
+ feature.strand1 = tokens[8];
20455
20944
  }
20456
20945
 
20457
- if (transforms) {
20458
- // Slow path with context saving and extra translate
20459
- ctx.translate(x, y);
20460
-
20461
- for (var transform in transforms) {
20462
- var value = transforms[transform]; // TODO: Add error checking for robustness
20946
+ if (tokens.length > 9 && tokens[9] !== ".") {
20947
+ feature.strand2 = tokens[9];
20948
+ }
20949
+ } // Optional extra columns
20463
20950
 
20464
- if (transform === 'translate') {
20465
- ctx.translate(value['x'], value['y']);
20466
- }
20467
20951
 
20468
- if (transform === 'rotate') {
20469
- ctx.rotate(value['angle'] * Math.PI / 180);
20470
- }
20471
- }
20952
+ if (header) {
20953
+ const colorColumn = header.colorColumn;
20472
20954
 
20473
- ctx.fillText(text, 0, 0);
20474
- } else {
20475
- ctx.fillText(text, x, y);
20955
+ if (colorColumn && colorColumn < tokens.length) {
20956
+ feature.color = IGVColor.createColorString(tokens[colorColumn]);
20476
20957
  }
20477
20958
 
20478
- if (properties || transforms) ctx.restore();
20479
- },
20480
- strokeText: function (ctx, text, x, y, properties, transforms) {
20481
- if (properties || transforms) {
20482
- ctx.save();
20959
+ const thicknessColumn = header.thicknessColumn;
20960
+
20961
+ if (thicknessColumn && thicknessColumn < tokens.length) {
20962
+ feature.thickness = tokens[thicknessColumn];
20483
20963
  }
20484
20964
 
20485
- if (properties) {
20486
- IGVGraphics.setProperties(ctx, properties);
20965
+ if (tokens.length > stdColumns && header.columnNames && header.columnNames.length === tokens.length) {
20966
+ feature.extras = tokens.slice(stdColumns);
20487
20967
  }
20968
+ } // Set total extent of feature
20488
20969
 
20489
- if (transforms) {
20490
- ctx.translate(x, y);
20491
20970
 
20492
- for (var transform in transforms) {
20493
- var value = transforms[transform]; // TODO: Add error checking for robustness
20971
+ if (feature.chr1 === feature.chr2) {
20972
+ feature.chr = feature.chr1;
20973
+ feature.start = Math.min(feature.start1, feature.start2);
20974
+ feature.end = Math.max(feature.end1, feature.end2);
20975
+ }
20494
20976
 
20495
- if (transform === 'translate') {
20496
- ctx.translate(value['x'], value['y']);
20497
- }
20498
-
20499
- if (transform === 'rotate') {
20500
- ctx.rotate(value['angle'] * Math.PI / 180);
20501
- }
20502
- }
20503
-
20504
- ctx.strokeText(text, 0, 0);
20505
- } else {
20506
- ctx.strokeText(text, x, y);
20507
- }
20508
-
20509
- if (properties || transforms) ctx.restore();
20510
- },
20511
- strokeCircle: function (ctx, x, y, radius, properties) {
20512
- if (properties) {
20513
- ctx.save();
20514
- IGVGraphics.setProperties(ctx, properties);
20515
- }
20516
-
20517
- ctx.beginPath();
20518
- ctx.arc(x, y, radius, 0, 2 * Math.PI);
20519
- ctx.stroke();
20520
- if (properties) ctx.restore();
20521
- },
20522
- fillCircle: function (ctx, x, y, radius, properties) {
20523
- if (properties) {
20524
- ctx.save();
20525
- IGVGraphics.setProperties(ctx, properties);
20526
- }
20527
-
20528
- ctx.beginPath();
20529
- ctx.arc(x, y, radius, 0, 2 * Math.PI);
20530
- ctx.fill();
20531
- if (properties) ctx.restore();
20532
- },
20533
- drawArrowhead: function (ctx, x, y, size, lineWidth) {
20534
- ctx.save();
20535
-
20536
- if (!size) {
20537
- size = 5;
20538
- }
20539
-
20540
- if (lineWidth) {
20541
- ctx.lineWidth = lineWidth;
20542
- }
20543
-
20544
- ctx.beginPath();
20545
- ctx.moveTo(x, y - size / 2);
20546
- ctx.lineTo(x, y + size / 2);
20547
- ctx.lineTo(x + size, y);
20548
- ctx.lineTo(x, y - size / 2);
20549
- ctx.closePath();
20550
- ctx.fill();
20551
- ctx.restore();
20552
- },
20553
- dashedLine: function (ctx, x1, y1, x2, y2, dashLen) {
20554
- let properties = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {};
20555
- if (dashLen === undefined) dashLen = 2;
20556
- ctx.setLineDash([dashLen, dashLen]);
20557
- IGVGraphics.strokeLine(ctx, x1, y1, x2, y2, properties);
20558
- ctx.setLineDash([]);
20559
- },
20560
- roundRect: function (ctx, x, y, width, height, radius, fill, stroke) {
20561
- if (typeof stroke == "undefined") {
20562
- stroke = true;
20563
- }
20564
-
20565
- if (typeof radius === "undefined") {
20566
- radius = 5;
20567
- }
20568
-
20569
- ctx.beginPath();
20570
- ctx.moveTo(x + radius, y);
20571
- ctx.lineTo(x + width - radius, y);
20572
- ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
20573
- ctx.lineTo(x + width, y + height - radius);
20574
- ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
20575
- ctx.lineTo(x + radius, y + height);
20576
- ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
20577
- ctx.lineTo(x, y + radius);
20578
- ctx.quadraticCurveTo(x, y, x + radius, y);
20579
- ctx.closePath();
20580
-
20581
- if (stroke) {
20582
- ctx.stroke();
20583
- }
20584
-
20585
- if (fill) {
20586
- ctx.fill();
20587
- }
20588
- },
20589
- polygon: function (ctx, x, y, fill, stroke) {
20590
- if (typeof stroke == "undefined") {
20591
- stroke = true;
20592
- }
20977
+ return feature;
20978
+ }
20979
+ /**
20980
+ * Hack for non-standard bedPE formats, where numeric score can be in column 7 (name field from spec)
20981
+ * @param features
20982
+ */
20593
20983
 
20594
- ctx.beginPath();
20595
- var len = x.length;
20596
- ctx.moveTo(x[0], y[0]);
20597
20984
 
20598
- for (var i = 1; i < len; i++) {
20599
- ctx.lineTo(x[i], y[i]); // this.moveTo(x[i], y[i]);
20600
- }
20985
+ function fixBedPE(features) {
20986
+ if (features.length == 0) return; // Assume all features have same properties
20601
20987
 
20602
- ctx.closePath();
20988
+ const firstFeature = features[0];
20603
20989
 
20604
- if (stroke) {
20605
- ctx.stroke();
20990
+ if (firstFeature.score === undefined && firstFeature.name !== undefined) {
20991
+ // Name field (col 7) is sometimes used for score.
20992
+ for (let f of features) {
20993
+ if (!(isNumber(f.name) || f.name === '.')) return;
20606
20994
  }
20607
20995
 
20608
- if (fill) {
20609
- ctx.fill();
20996
+ for (let f of features) {
20997
+ f.score = Number(f.name);
20998
+ delete f.name;
20610
20999
  }
20611
- }
20612
- };
20613
-
20614
- function doPath(ctx, x, y) {
20615
- var i,
20616
- len = x.length;
21000
+ } // Make copies of inter-chr features, one for each chromosome
20617
21001
 
20618
- for (i = 0; i < len; i++) {
20619
- x[i] = Math.round(x[i]);
20620
- y[i] = Math.round(y[i]);
20621
- }
20622
21002
 
20623
- ctx.beginPath();
20624
- ctx.moveTo(x[0], y[0]);
21003
+ const interChrFeatures = features.filter(f => f.chr1 !== f.chr2);
20625
21004
 
20626
- for (i = 1; i < len; i++) {
20627
- ctx.lineTo(x[i], y[i]);
21005
+ for (let f1 of interChrFeatures) {
21006
+ const f2 = Object.assign({}, f1);
21007
+ f2.dup = true;
21008
+ features.push(f2);
21009
+ f1.chr = f1.chr1;
21010
+ f1.start = f1.start1;
21011
+ f1.end = f1.end1;
21012
+ f2.chr = f2.chr2;
21013
+ f2.start = f2.start2;
21014
+ f2.end = f2.end2;
20628
21015
  }
20629
-
20630
- ctx.closePath();
20631
21016
  }
21017
+ /**
21018
+ * Special decoder for Hic Domain files. In these files feature1 == feature2, they are really bed records.
21019
+ * @param tokens
21020
+ * @param ignore
21021
+ * @returns {*}
21022
+ */
20632
21023
 
20633
- var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
20634
-
20635
- function createCommonjsModule(fn) {
20636
- var module = { exports: {} };
20637
- return fn(module, module.exports), module.exports;
20638
- }
20639
-
20640
- var check = function (it) {
20641
- return it && it.Math == Math && it;
20642
- }; // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
20643
-
20644
-
20645
- var global$1 = // eslint-disable-next-line es-x/no-global-this -- safe
20646
- check(typeof globalThis == 'object' && globalThis) || check(typeof window == 'object' && window) || // eslint-disable-next-line no-restricted-globals -- safe
20647
- check(typeof self == 'object' && self) || check(typeof commonjsGlobal == 'object' && commonjsGlobal) || // eslint-disable-next-line no-new-func -- fallback
20648
- function () {
20649
- return this;
20650
- }() || Function('return this')();
20651
-
20652
- var fails = function (exec) {
20653
- try {
20654
- return !!exec();
20655
- } catch (error) {
20656
- return true;
20657
- }
20658
- };
20659
-
20660
- var descriptors = !fails(function () {
20661
- // eslint-disable-next-line es-x/no-object-defineproperty -- required for testing
20662
- return Object.defineProperty({}, 1, {
20663
- get: function () {
20664
- return 7;
20665
- }
20666
- })[1] != 7;
20667
- });
20668
-
20669
- var functionBindNative = !fails(function () {
20670
- // eslint-disable-next-line es-x/no-function-prototype-bind -- safe
20671
- var test = function () {
20672
- /* empty */
20673
- }.bind(); // eslint-disable-next-line no-prototype-builtins -- safe
20674
-
20675
-
20676
- return typeof test != 'function' || test.hasOwnProperty('prototype');
20677
- });
20678
-
20679
- var call$2 = Function.prototype.call;
20680
- var functionCall = functionBindNative ? call$2.bind(call$2) : function () {
20681
- return call$2.apply(call$2, arguments);
20682
- };
20683
-
20684
- var $propertyIsEnumerable = {}.propertyIsEnumerable; // eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe
20685
-
20686
- var getOwnPropertyDescriptor$1 = Object.getOwnPropertyDescriptor; // Nashorn ~ JDK8 bug
20687
-
20688
- var NASHORN_BUG = getOwnPropertyDescriptor$1 && !$propertyIsEnumerable.call({
20689
- 1: 2
20690
- }, 1); // `Object.prototype.propertyIsEnumerable` method implementation
20691
- // https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable
20692
-
20693
- var f$5 = NASHORN_BUG ? function propertyIsEnumerable(V) {
20694
- var descriptor = getOwnPropertyDescriptor$1(this, V);
20695
- return !!descriptor && descriptor.enumerable;
20696
- } : $propertyIsEnumerable;
20697
- var objectPropertyIsEnumerable = {
20698
- f: f$5
20699
- };
20700
21024
 
20701
- var createPropertyDescriptor = function (bitmap, value) {
21025
+ function decodeBedpeDomain(tokens, header) {
21026
+ if (tokens.length < 8) return undefined;
20702
21027
  return {
20703
- enumerable: !(bitmap & 1),
20704
- configurable: !(bitmap & 2),
20705
- writable: !(bitmap & 4),
20706
- value: value
20707
- };
20708
- };
20709
-
20710
- var FunctionPrototype$2 = Function.prototype;
20711
- var bind$1 = FunctionPrototype$2.bind;
20712
- var call$1 = FunctionPrototype$2.call;
20713
- var uncurryThis = functionBindNative && bind$1.bind(call$1, call$1);
20714
- var functionUncurryThis = functionBindNative ? function (fn) {
20715
- return fn && uncurryThis(fn);
20716
- } : function (fn) {
20717
- return fn && function () {
20718
- return call$1.apply(fn, arguments);
20719
- };
20720
- };
20721
-
20722
- var toString$1 = functionUncurryThis({}.toString);
20723
- var stringSlice = functionUncurryThis(''.slice);
20724
-
20725
- var classofRaw = function (it) {
20726
- return stringSlice(toString$1(it), 8, -1);
20727
- };
20728
-
20729
- var $Object$2 = Object;
20730
- var split = functionUncurryThis(''.split); // fallback for non-array-like ES3 and non-enumerable old V8 strings
20731
-
20732
- var indexedObject = fails(function () {
20733
- // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346
20734
- // eslint-disable-next-line no-prototype-builtins -- safe
20735
- return !$Object$2('z').propertyIsEnumerable(0);
20736
- }) ? function (it) {
20737
- return classofRaw(it) == 'String' ? split(it, '') : $Object$2(it);
20738
- } : $Object$2;
20739
-
20740
- var $TypeError$6 = TypeError; // `RequireObjectCoercible` abstract operation
20741
- // https://tc39.es/ecma262/#sec-requireobjectcoercible
20742
-
20743
- var requireObjectCoercible = function (it) {
20744
- if (it == undefined) throw $TypeError$6("Can't call method on " + it);
20745
- return it;
20746
- };
20747
-
20748
- var toIndexedObject = function (it) {
20749
- return indexedObject(requireObjectCoercible(it));
20750
- };
20751
-
20752
- // `IsCallable` abstract operation
20753
- // https://tc39.es/ecma262/#sec-iscallable
20754
- var isCallable = function (argument) {
20755
- return typeof argument == 'function';
20756
- };
20757
-
20758
- var isObject = function (it) {
20759
- return typeof it == 'object' ? it !== null : isCallable(it);
20760
- };
20761
-
20762
- var aFunction = function (argument) {
20763
- return isCallable(argument) ? argument : undefined;
20764
- };
20765
-
20766
- var getBuiltIn = function (namespace, method) {
20767
- return arguments.length < 2 ? aFunction(global$1[namespace]) : global$1[namespace] && global$1[namespace][method];
20768
- };
20769
-
20770
- var objectIsPrototypeOf = functionUncurryThis({}.isPrototypeOf);
20771
-
20772
- var engineUserAgent = getBuiltIn('navigator', 'userAgent') || '';
20773
-
20774
- var process$2 = global$1.process;
20775
- var Deno = global$1.Deno;
20776
- var versions = process$2 && process$2.versions || Deno && Deno.version;
20777
- var v8 = versions && versions.v8;
20778
- var match, version$1;
20779
-
20780
- if (v8) {
20781
- match = v8.split('.'); // in old Chrome, versions of V8 isn't V8 = Chrome / 10
20782
- // but their correct versions are not interesting for us
20783
-
20784
- version$1 = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);
20785
- } // BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`
20786
- // so check `userAgent` even if `.v8` exists, but 0
20787
-
20788
-
20789
- if (!version$1 && engineUserAgent) {
20790
- match = engineUserAgent.match(/Edge\/(\d+)/);
20791
-
20792
- if (!match || match[1] >= 74) {
20793
- match = engineUserAgent.match(/Chrome\/(\d+)/);
20794
- if (match) version$1 = +match[1];
20795
- }
20796
- }
20797
-
20798
- var engineV8Version = version$1;
20799
-
20800
- /* eslint-disable es-x/no-symbol -- required for testing */
20801
-
20802
- var nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () {
20803
- var symbol = Symbol(); // Chrome 38 Symbol has incorrect toString conversion
20804
- // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances
20805
-
20806
- return !String(symbol) || !(Object(symbol) instanceof Symbol) || // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances
20807
- !Symbol.sham && engineV8Version && engineV8Version < 41;
20808
- });
20809
-
20810
- /* eslint-disable es-x/no-symbol -- required for testing */
20811
- var useSymbolAsUid = nativeSymbol && !Symbol.sham && typeof Symbol.iterator == 'symbol';
20812
-
20813
- var $Object$1 = Object;
20814
- var isSymbol = useSymbolAsUid ? function (it) {
20815
- return typeof it == 'symbol';
20816
- } : function (it) {
20817
- var $Symbol = getBuiltIn('Symbol');
20818
- return isCallable($Symbol) && objectIsPrototypeOf($Symbol.prototype, $Object$1(it));
20819
- };
20820
-
20821
- var $String$1 = String;
20822
-
20823
- var tryToString = function (argument) {
20824
- try {
20825
- return $String$1(argument);
20826
- } catch (error) {
20827
- return 'Object';
20828
- }
20829
- };
20830
-
20831
- var $TypeError$5 = TypeError; // `Assert: IsCallable(argument) is true`
20832
-
20833
- var aCallable = function (argument) {
20834
- if (isCallable(argument)) return argument;
20835
- throw $TypeError$5(tryToString(argument) + ' is not a function');
20836
- };
20837
-
20838
- // https://tc39.es/ecma262/#sec-getmethod
20839
-
20840
- var getMethod = function (V, P) {
20841
- var func = V[P];
20842
- return func == null ? undefined : aCallable(func);
20843
- };
20844
-
20845
- var $TypeError$4 = TypeError; // `OrdinaryToPrimitive` abstract operation
20846
- // https://tc39.es/ecma262/#sec-ordinarytoprimitive
20847
-
20848
- var ordinaryToPrimitive = function (input, pref) {
20849
- var fn, val;
20850
- if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = functionCall(fn, input))) return val;
20851
- if (isCallable(fn = input.valueOf) && !isObject(val = functionCall(fn, input))) return val;
20852
- if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = functionCall(fn, input))) return val;
20853
- throw $TypeError$4("Can't convert object to primitive value");
20854
- };
20855
-
20856
- var defineProperty$1 = Object.defineProperty;
20857
-
20858
- var defineGlobalProperty = function (key, value) {
20859
- try {
20860
- defineProperty$1(global$1, key, {
20861
- value: value,
20862
- configurable: true,
20863
- writable: true
20864
- });
20865
- } catch (error) {
20866
- global$1[key] = value;
20867
- }
20868
-
20869
- return value;
20870
- };
20871
-
20872
- var SHARED = '__core-js_shared__';
20873
- var store$1 = global$1[SHARED] || defineGlobalProperty(SHARED, {});
20874
- var sharedStore = store$1;
20875
-
20876
- var shared = createCommonjsModule(function (module) {
20877
- (module.exports = function (key, value) {
20878
- return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {});
20879
- })('versions', []).push({
20880
- version: '3.24.1',
20881
- mode: 'global',
20882
- copyright: '© 2014-2022 Denis Pushkarev (zloirock.ru)',
20883
- license: 'https://github.com/zloirock/core-js/blob/v3.24.1/LICENSE',
20884
- source: 'https://github.com/zloirock/core-js'
20885
- });
20886
- });
20887
-
20888
- var $Object = Object; // `ToObject` abstract operation
20889
- // https://tc39.es/ecma262/#sec-toobject
20890
-
20891
- var toObject = function (argument) {
20892
- return $Object(requireObjectCoercible(argument));
20893
- };
20894
-
20895
- var hasOwnProperty = functionUncurryThis({}.hasOwnProperty); // `HasOwnProperty` abstract operation
20896
- // https://tc39.es/ecma262/#sec-hasownproperty
20897
- // eslint-disable-next-line es-x/no-object-hasown -- safe
20898
-
20899
- var hasOwnProperty_1 = Object.hasOwn || function hasOwn(it, key) {
20900
- return hasOwnProperty(toObject(it), key);
20901
- };
20902
-
20903
- var id = 0;
20904
- var postfix = Math.random();
20905
- var toString = functionUncurryThis(1.0.toString);
20906
-
20907
- var uid = function (key) {
20908
- return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);
20909
- };
20910
-
20911
- var WellKnownSymbolsStore = shared('wks');
20912
- var Symbol$1 = global$1.Symbol;
20913
- var symbolFor = Symbol$1 && Symbol$1['for'];
20914
- var createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid;
20915
-
20916
- var wellKnownSymbol = function (name) {
20917
- if (!hasOwnProperty_1(WellKnownSymbolsStore, name) || !(nativeSymbol || typeof WellKnownSymbolsStore[name] == 'string')) {
20918
- var description = 'Symbol.' + name;
20919
-
20920
- if (nativeSymbol && hasOwnProperty_1(Symbol$1, name)) {
20921
- WellKnownSymbolsStore[name] = Symbol$1[name];
20922
- } else if (useSymbolAsUid && symbolFor) {
20923
- WellKnownSymbolsStore[name] = symbolFor(description);
20924
- } else {
20925
- WellKnownSymbolsStore[name] = createWellKnownSymbol(description);
20926
- }
20927
- }
20928
-
20929
- return WellKnownSymbolsStore[name];
20930
- };
20931
-
20932
- var $TypeError$3 = TypeError;
20933
- var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); // `ToPrimitive` abstract operation
20934
- // https://tc39.es/ecma262/#sec-toprimitive
20935
-
20936
- var toPrimitive = function (input, pref) {
20937
- if (!isObject(input) || isSymbol(input)) return input;
20938
- var exoticToPrim = getMethod(input, TO_PRIMITIVE);
20939
- var result;
20940
-
20941
- if (exoticToPrim) {
20942
- if (pref === undefined) pref = 'default';
20943
- result = functionCall(exoticToPrim, input, pref);
20944
- if (!isObject(result) || isSymbol(result)) return result;
20945
- throw $TypeError$3("Can't convert object to primitive value");
20946
- }
20947
-
20948
- if (pref === undefined) pref = 'number';
20949
- return ordinaryToPrimitive(input, pref);
20950
- };
20951
-
20952
- // https://tc39.es/ecma262/#sec-topropertykey
20953
-
20954
- var toPropertyKey = function (argument) {
20955
- var key = toPrimitive(argument, 'string');
20956
- return isSymbol(key) ? key : key + '';
20957
- };
20958
-
20959
- var document$1 = global$1.document; // typeof document.createElement is 'object' in old IE
20960
-
20961
- var EXISTS$1 = isObject(document$1) && isObject(document$1.createElement);
20962
-
20963
- var documentCreateElement = function (it) {
20964
- return EXISTS$1 ? document$1.createElement(it) : {};
20965
- };
20966
-
20967
- var ie8DomDefine = !descriptors && !fails(function () {
20968
- // eslint-disable-next-line es-x/no-object-defineproperty -- required for testing
20969
- return Object.defineProperty(documentCreateElement('div'), 'a', {
20970
- get: function () {
20971
- return 7;
20972
- }
20973
- }).a != 7;
20974
- });
20975
-
20976
- var $getOwnPropertyDescriptor$1 = Object.getOwnPropertyDescriptor; // `Object.getOwnPropertyDescriptor` method
20977
- // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
20978
-
20979
- var f$4 = descriptors ? $getOwnPropertyDescriptor$1 : function getOwnPropertyDescriptor(O, P) {
20980
- O = toIndexedObject(O);
20981
- P = toPropertyKey(P);
20982
- if (ie8DomDefine) try {
20983
- return $getOwnPropertyDescriptor$1(O, P);
20984
- } catch (error) {
20985
- /* empty */
20986
- }
20987
- if (hasOwnProperty_1(O, P)) return createPropertyDescriptor(!functionCall(objectPropertyIsEnumerable.f, O, P), O[P]);
20988
- };
20989
- var objectGetOwnPropertyDescriptor = {
20990
- f: f$4
20991
- };
20992
-
20993
- // https://bugs.chromium.org/p/v8/issues/detail?id=3334
20994
-
20995
- var v8PrototypeDefineBug = descriptors && fails(function () {
20996
- // eslint-disable-next-line es-x/no-object-defineproperty -- required for testing
20997
- return Object.defineProperty(function () {
20998
- /* empty */
20999
- }, 'prototype', {
21000
- value: 42,
21001
- writable: false
21002
- }).prototype != 42;
21003
- });
21004
-
21005
- var $String = String;
21006
- var $TypeError$2 = TypeError; // `Assert: Type(argument) is Object`
21007
-
21008
- var anObject = function (argument) {
21009
- if (isObject(argument)) return argument;
21010
- throw $TypeError$2($String(argument) + ' is not an object');
21011
- };
21012
-
21013
- var $TypeError$1 = TypeError; // eslint-disable-next-line es-x/no-object-defineproperty -- safe
21014
-
21015
- var $defineProperty = Object.defineProperty; // eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe
21016
-
21017
- var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
21018
- var ENUMERABLE = 'enumerable';
21019
- var CONFIGURABLE$1 = 'configurable';
21020
- var WRITABLE = 'writable'; // `Object.defineProperty` method
21021
- // https://tc39.es/ecma262/#sec-object.defineproperty
21022
-
21023
- var f$3 = descriptors ? v8PrototypeDefineBug ? function defineProperty(O, P, Attributes) {
21024
- anObject(O);
21025
- P = toPropertyKey(P);
21026
- anObject(Attributes);
21027
-
21028
- if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {
21029
- var current = $getOwnPropertyDescriptor(O, P);
21030
-
21031
- if (current && current[WRITABLE]) {
21032
- O[P] = Attributes.value;
21033
- Attributes = {
21034
- configurable: CONFIGURABLE$1 in Attributes ? Attributes[CONFIGURABLE$1] : current[CONFIGURABLE$1],
21035
- enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],
21036
- writable: false
21037
- };
21038
- }
21039
- }
21040
-
21041
- return $defineProperty(O, P, Attributes);
21042
- } : $defineProperty : function defineProperty(O, P, Attributes) {
21043
- anObject(O);
21044
- P = toPropertyKey(P);
21045
- anObject(Attributes);
21046
- if (ie8DomDefine) try {
21047
- return $defineProperty(O, P, Attributes);
21048
- } catch (error) {
21049
- /* empty */
21050
- }
21051
- if ('get' in Attributes || 'set' in Attributes) throw $TypeError$1('Accessors not supported');
21052
- if ('value' in Attributes) O[P] = Attributes.value;
21053
- return O;
21054
- };
21055
- var objectDefineProperty = {
21056
- f: f$3
21057
- };
21058
-
21059
- var createNonEnumerableProperty = descriptors ? function (object, key, value) {
21060
- return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));
21061
- } : function (object, key, value) {
21062
- object[key] = value;
21063
- return object;
21064
- };
21065
-
21066
- var FunctionPrototype$1 = Function.prototype; // eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe
21067
-
21068
- var getDescriptor = descriptors && Object.getOwnPropertyDescriptor;
21069
- var EXISTS = hasOwnProperty_1(FunctionPrototype$1, 'name'); // additional protection from minified / mangled / dropped function names
21070
-
21071
- var PROPER = EXISTS && function something() {
21072
- /* empty */
21073
- }.name === 'something';
21074
-
21075
- var CONFIGURABLE = EXISTS && (!descriptors || descriptors && getDescriptor(FunctionPrototype$1, 'name').configurable);
21076
- var functionName = {
21077
- EXISTS: EXISTS,
21078
- PROPER: PROPER,
21079
- CONFIGURABLE: CONFIGURABLE
21080
- };
21081
-
21082
- var functionToString = functionUncurryThis(Function.toString); // this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper
21083
-
21084
- if (!isCallable(sharedStore.inspectSource)) {
21085
- sharedStore.inspectSource = function (it) {
21086
- return functionToString(it);
21028
+ chr: tokens[0],
21029
+ start: Number.parseInt(tokens[1]),
21030
+ end: Number.parseInt(tokens[2]),
21031
+ color: IGVColor.createColorString(tokens[6]),
21032
+ value: Number(tokens[7])
21087
21033
  };
21088
21034
  }
21089
21035
 
21090
- var inspectSource = sharedStore.inspectSource;
21091
-
21092
- var WeakMap$1 = global$1.WeakMap;
21093
- var nativeWeakMap = isCallable(WeakMap$1) && /native code/.test(inspectSource(WeakMap$1));
21094
-
21095
- var keys = shared('keys');
21096
-
21097
- var sharedKey = function (key) {
21098
- return keys[key] || (keys[key] = uid(key));
21099
- };
21100
-
21101
- var hiddenKeys$1 = {};
21102
-
21103
- var OBJECT_ALREADY_INITIALIZED = 'Object already initialized';
21104
- var TypeError$1 = global$1.TypeError;
21105
- var WeakMap = global$1.WeakMap;
21106
- var set$1, get, has;
21107
-
21108
- var enforce = function (it) {
21109
- return has(it) ? get(it) : set$1(it, {});
21110
- };
21111
-
21112
- var getterFor = function (TYPE) {
21113
- return function (it) {
21114
- var state;
21115
-
21116
- if (!isObject(it) || (state = get(it)).type !== TYPE) {
21117
- throw TypeError$1('Incompatible receiver, ' + TYPE + ' required');
21118
- }
21119
-
21120
- return state;
21121
- };
21122
- };
21123
-
21124
- if (nativeWeakMap || sharedStore.state) {
21125
- var store = sharedStore.state || (sharedStore.state = new WeakMap());
21126
- var wmget = functionUncurryThis(store.get);
21127
- var wmhas = functionUncurryThis(store.has);
21128
- var wmset = functionUncurryThis(store.set);
21129
-
21130
- set$1 = function (it, metadata) {
21131
- if (wmhas(store, it)) throw new TypeError$1(OBJECT_ALREADY_INITIALIZED);
21132
- metadata.facade = it;
21133
- wmset(store, it, metadata);
21134
- return metadata;
21135
- };
21136
-
21137
- get = function (it) {
21138
- return wmget(store, it) || {};
21139
- };
21140
-
21141
- has = function (it) {
21142
- return wmhas(store, it);
21143
- };
21144
- } else {
21145
- var STATE = sharedKey('state');
21146
- hiddenKeys$1[STATE] = true;
21147
-
21148
- set$1 = function (it, metadata) {
21149
- if (hasOwnProperty_1(it, STATE)) throw new TypeError$1(OBJECT_ALREADY_INITIALIZED);
21150
- metadata.facade = it;
21151
- createNonEnumerableProperty(it, STATE, metadata);
21152
- return metadata;
21153
- };
21154
-
21155
- get = function (it) {
21156
- return hasOwnProperty_1(it, STATE) ? it[STATE] : {};
21157
- };
21158
-
21159
- has = function (it) {
21160
- return hasOwnProperty_1(it, STATE);
21161
- };
21036
+ function isHiccups(columns) {
21037
+ return columns && (columns.includes("fdrDonut") || columns.includes("fdr_donut"));
21162
21038
  }
21163
21039
 
21164
- var internalState = {
21165
- set: set$1,
21166
- get: get,
21167
- has: has,
21168
- enforce: enforce,
21169
- getterFor: getterFor
21170
- };
21171
-
21172
- var makeBuiltIn_1 = createCommonjsModule(function (module) {
21173
- var CONFIGURABLE_FUNCTION_NAME = functionName.CONFIGURABLE;
21174
- var enforceInternalState = internalState.enforce;
21175
- var getInternalState = internalState.get; // eslint-disable-next-line es-x/no-object-defineproperty -- safe
21176
-
21177
- var defineProperty = Object.defineProperty;
21178
- var CONFIGURABLE_LENGTH = descriptors && !fails(function () {
21179
- return defineProperty(function () {
21180
- /* empty */
21181
- }, 'length', {
21182
- value: 8
21183
- }).length !== 8;
21184
- });
21185
- var TEMPLATE = String(String).split('String');
21186
-
21187
- var makeBuiltIn = module.exports = function (value, name, options) {
21188
- if (String(name).slice(0, 7) === 'Symbol(') {
21189
- name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']';
21190
- }
21191
-
21192
- if (options && options.getter) name = 'get ' + name;
21193
- if (options && options.setter) name = 'set ' + name;
21194
-
21195
- if (!hasOwnProperty_1(value, 'name') || CONFIGURABLE_FUNCTION_NAME && value.name !== name) {
21196
- if (descriptors) defineProperty(value, 'name', {
21197
- value: name,
21198
- configurable: true
21199
- });else value.name = name;
21200
- }
21201
-
21202
- if (CONFIGURABLE_LENGTH && options && hasOwnProperty_1(options, 'arity') && value.length !== options.arity) {
21203
- defineProperty(value, 'length', {
21204
- value: options.arity
21205
- });
21206
- }
21207
-
21208
- try {
21209
- if (options && hasOwnProperty_1(options, 'constructor') && options.constructor) {
21210
- if (descriptors) defineProperty(value, 'prototype', {
21211
- writable: false
21212
- }); // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable
21213
- } else if (value.prototype) value.prototype = undefined;
21214
- } catch (error) {
21215
- /* empty */
21216
- }
21217
-
21218
- var state = enforceInternalState(value);
21219
-
21220
- if (!hasOwnProperty_1(state, 'source')) {
21221
- state.source = TEMPLATE.join(typeof name == 'string' ? name : '');
21222
- }
21223
-
21224
- return value;
21225
- }; // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
21226
- // eslint-disable-next-line no-extend-native -- required
21227
-
21228
-
21229
- Function.prototype.toString = makeBuiltIn(function toString() {
21230
- return isCallable(this) && getInternalState(this).source || inspectSource(this);
21231
- }, 'toString');
21232
- });
21233
-
21234
- var defineBuiltIn = function (O, key, value, options) {
21235
- if (!options) options = {};
21236
- var simple = options.enumerable;
21237
- var name = options.name !== undefined ? options.name : key;
21238
- if (isCallable(value)) makeBuiltIn_1(value, name, options);
21239
-
21240
- if (options.global) {
21241
- if (simple) O[key] = value;else defineGlobalProperty(key, value);
21242
- } else {
21243
- try {
21244
- if (!options.unsafe) delete O[key];else if (O[key]) simple = true;
21245
- } catch (error) {
21246
- /* empty */
21247
- }
21248
-
21249
- if (simple) O[key] = value;else objectDefineProperty.f(O, key, {
21250
- value: value,
21251
- enumerable: false,
21252
- configurable: !options.nonConfigurable,
21253
- writable: !options.nonWritable
21254
- });
21255
- }
21256
-
21257
- return O;
21258
- };
21259
-
21260
- var ceil = Math.ceil;
21261
- var floor = Math.floor; // `Math.trunc` method
21262
- // https://tc39.es/ecma262/#sec-math.trunc
21263
- // eslint-disable-next-line es-x/no-math-trunc -- safe
21264
-
21265
- var mathTrunc = Math.trunc || function trunc(x) {
21266
- var n = +x;
21267
- return (n > 0 ? floor : ceil)(n);
21268
- };
21269
-
21270
- // https://tc39.es/ecma262/#sec-tointegerorinfinity
21271
-
21272
- var toIntegerOrInfinity = function (argument) {
21273
- var number = +argument; // eslint-disable-next-line no-self-compare -- NaN check
21274
-
21275
- return number !== number || number === 0 ? 0 : mathTrunc(number);
21276
- };
21277
-
21278
- var max = Math.max;
21279
- var min$1 = Math.min; // Helper for a popular repeating case of the spec:
21280
- // Let integer be ? ToInteger(index).
21281
- // If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).
21282
-
21283
- var toAbsoluteIndex = function (index, length) {
21284
- var integer = toIntegerOrInfinity(index);
21285
- return integer < 0 ? max(integer + length, 0) : min$1(integer, length);
21286
- };
21287
-
21288
- var min = Math.min; // `ToLength` abstract operation
21289
- // https://tc39.es/ecma262/#sec-tolength
21290
-
21291
- var toLength = function (argument) {
21292
- return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991
21293
- };
21294
-
21295
- // https://tc39.es/ecma262/#sec-lengthofarraylike
21296
-
21297
- var lengthOfArrayLike = function (obj) {
21298
- return toLength(obj.length);
21299
- };
21300
-
21301
- var createMethod = function (IS_INCLUDES) {
21302
- return function ($this, el, fromIndex) {
21303
- var O = toIndexedObject($this);
21304
- var length = lengthOfArrayLike(O);
21305
- var index = toAbsoluteIndex(fromIndex, length);
21306
- var value; // Array#includes uses SameValueZero equality algorithm
21307
- // eslint-disable-next-line no-self-compare -- NaN check
21308
-
21309
- if (IS_INCLUDES && el != el) while (length > index) {
21310
- value = O[index++]; // eslint-disable-next-line no-self-compare -- NaN check
21311
-
21312
- if (value != value) return true; // Array#indexOf ignores holes, Array#includes - not
21313
- } else for (; length > index; index++) {
21314
- if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;
21315
- }
21316
- return !IS_INCLUDES && -1;
21317
- };
21318
- };
21319
-
21320
- var arrayIncludes = {
21321
- // `Array.prototype.includes` method
21322
- // https://tc39.es/ecma262/#sec-array.prototype.includes
21323
- includes: createMethod(true),
21324
- // `Array.prototype.indexOf` method
21325
- // https://tc39.es/ecma262/#sec-array.prototype.indexof
21326
- indexOf: createMethod(false)
21327
- };
21328
-
21329
- var indexOf = arrayIncludes.indexOf;
21330
- var push = functionUncurryThis([].push);
21331
-
21332
- var objectKeysInternal = function (object, names) {
21333
- var O = toIndexedObject(object);
21334
- var i = 0;
21335
- var result = [];
21336
- var key;
21337
-
21338
- for (key in O) !hasOwnProperty_1(hiddenKeys$1, key) && hasOwnProperty_1(O, key) && push(result, key); // Don't enum bug & hidden keys
21339
-
21340
-
21341
- while (names.length > i) if (hasOwnProperty_1(O, key = names[i++])) {
21342
- ~indexOf(result, key) || push(result, key);
21343
- }
21344
-
21345
- return result;
21346
- };
21347
-
21348
- // IE8- don't enum bug keys
21349
- var enumBugKeys = ['constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf'];
21350
-
21351
- var hiddenKeys = enumBugKeys.concat('length', 'prototype'); // `Object.getOwnPropertyNames` method
21352
- // https://tc39.es/ecma262/#sec-object.getownpropertynames
21353
- // eslint-disable-next-line es-x/no-object-getownpropertynames -- safe
21354
-
21355
- var f$2 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
21356
- return objectKeysInternal(O, hiddenKeys);
21357
- };
21358
-
21359
- var objectGetOwnPropertyNames = {
21360
- f: f$2
21361
- };
21362
-
21363
- // eslint-disable-next-line es-x/no-object-getownpropertysymbols -- safe
21364
- var f$1 = Object.getOwnPropertySymbols;
21365
- var objectGetOwnPropertySymbols = {
21366
- f: f$1
21367
- };
21368
-
21369
- var concat = functionUncurryThis([].concat); // all object keys, includes non-enumerable and symbols
21370
-
21371
- var ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {
21372
- var keys = objectGetOwnPropertyNames.f(anObject(it));
21373
- var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;
21374
- return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;
21375
- };
21376
-
21377
- var copyConstructorProperties = function (target, source, exceptions) {
21378
- var keys = ownKeys(source);
21379
- var defineProperty = objectDefineProperty.f;
21380
- var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
21381
-
21382
- for (var i = 0; i < keys.length; i++) {
21383
- var key = keys[i];
21384
-
21385
- if (!hasOwnProperty_1(target, key) && !(exceptions && hasOwnProperty_1(exceptions, key))) {
21386
- defineProperty(target, key, getOwnPropertyDescriptor(source, key));
21387
- }
21388
- }
21389
- };
21390
-
21391
- var replacement = /#|\.prototype\./;
21392
-
21393
- var isForced = function (feature, detection) {
21394
- var value = data[normalize$1(feature)];
21395
- return value == POLYFILL ? true : value == NATIVE ? false : isCallable(detection) ? fails(detection) : !!detection;
21396
- };
21397
-
21398
- var normalize$1 = isForced.normalize = function (string) {
21399
- return String(string).replace(replacement, '.').toLowerCase();
21400
- };
21401
-
21402
- var data = isForced.data = {};
21403
- var NATIVE = isForced.NATIVE = 'N';
21404
- var POLYFILL = isForced.POLYFILL = 'P';
21405
- var isForced_1 = isForced;
21406
-
21407
- var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
21408
- /*
21409
- options.target - name of the target object
21410
- options.global - target is the global object
21411
- options.stat - export as static methods of target
21412
- options.proto - export as prototype methods of target
21413
- options.real - real prototype method for the `pure` version
21414
- options.forced - export even if the native feature is available
21415
- options.bind - bind methods to the target, required for the `pure` version
21416
- options.wrap - wrap constructors to preventing global pollution, required for the `pure` version
21417
- options.unsafe - use the simple assignment of property instead of delete + defineProperty
21418
- options.sham - add a flag to not completely full polyfills
21419
- options.enumerable - export as enumerable property
21420
- options.dontCallGetSet - prevent calling a getter on target
21421
- options.name - the .name of the function if it does not match the key
21422
- */
21423
-
21424
- var _export = function (options, source) {
21425
- var TARGET = options.target;
21426
- var GLOBAL = options.global;
21427
- var STATIC = options.stat;
21428
- var FORCED, target, key, targetProperty, sourceProperty, descriptor;
21429
-
21430
- if (GLOBAL) {
21431
- target = global$1;
21432
- } else if (STATIC) {
21433
- target = global$1[TARGET] || defineGlobalProperty(TARGET, {});
21434
- } else {
21435
- target = (global$1[TARGET] || {}).prototype;
21436
- }
21437
-
21438
- if (target) for (key in source) {
21439
- sourceProperty = source[key];
21440
-
21441
- if (options.dontCallGetSet) {
21442
- descriptor = getOwnPropertyDescriptor(target, key);
21443
- targetProperty = descriptor && descriptor.value;
21444
- } else targetProperty = target[key];
21445
-
21446
- FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); // contained in target
21447
-
21448
- if (!FORCED && targetProperty !== undefined) {
21449
- if (typeof sourceProperty == typeof targetProperty) continue;
21450
- copyConstructorProperties(sourceProperty, targetProperty);
21451
- } // add a flag to not completely full polyfills
21452
-
21453
-
21454
- if (options.sham || targetProperty && targetProperty.sham) {
21455
- createNonEnumerableProperty(sourceProperty, 'sham', true);
21456
- }
21457
-
21458
- defineBuiltIn(target, key, sourceProperty, options);
21459
- }
21460
- };
21461
-
21462
- // https://tc39.es/ecma262/#sec-object.keys
21463
- // eslint-disable-next-line es-x/no-object-keys -- safe
21464
-
21465
- var objectKeys = Object.keys || function keys(O) {
21466
- return objectKeysInternal(O, enumBugKeys);
21467
- };
21468
-
21469
- // https://tc39.es/ecma262/#sec-object.defineproperties
21470
- // eslint-disable-next-line es-x/no-object-defineproperties -- safe
21471
-
21472
- var f = descriptors && !v8PrototypeDefineBug ? Object.defineProperties : function defineProperties(O, Properties) {
21473
- anObject(O);
21474
- var props = toIndexedObject(Properties);
21475
- var keys = objectKeys(Properties);
21476
- var length = keys.length;
21477
- var index = 0;
21478
- var key;
21479
-
21480
- while (length > index) objectDefineProperty.f(O, key = keys[index++], props[key]);
21481
-
21482
- return O;
21483
- };
21484
- var objectDefineProperties = {
21485
- f: f
21486
- };
21487
-
21488
- var html = getBuiltIn('document', 'documentElement');
21489
-
21490
- /* global ActiveXObject -- old IE, WSH */
21491
- var GT = '>';
21492
- var LT = '<';
21493
- var PROTOTYPE = 'prototype';
21494
- var SCRIPT = 'script';
21495
- var IE_PROTO = sharedKey('IE_PROTO');
21496
-
21497
- var EmptyConstructor = function () {
21498
- /* empty */
21499
- };
21500
-
21501
- var scriptTag = function (content) {
21502
- return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;
21503
- }; // Create object with fake `null` prototype: use ActiveX Object with cleared prototype
21504
-
21505
-
21506
- var NullProtoObjectViaActiveX = function (activeXDocument) {
21507
- activeXDocument.write(scriptTag(''));
21508
- activeXDocument.close();
21509
- var temp = activeXDocument.parentWindow.Object;
21510
- activeXDocument = null; // avoid memory leak
21511
-
21512
- return temp;
21513
- }; // Create object with fake `null` prototype: use iframe Object with cleared prototype
21514
-
21515
-
21516
- var NullProtoObjectViaIFrame = function () {
21517
- // Thrash, waste and sodomy: IE GC bug
21518
- var iframe = documentCreateElement('iframe');
21519
- var JS = 'java' + SCRIPT + ':';
21520
- var iframeDocument;
21521
- iframe.style.display = 'none';
21522
- html.appendChild(iframe); // https://github.com/zloirock/core-js/issues/475
21523
-
21524
- iframe.src = String(JS);
21525
- iframeDocument = iframe.contentWindow.document;
21526
- iframeDocument.open();
21527
- iframeDocument.write(scriptTag('document.F=Object'));
21528
- iframeDocument.close();
21529
- return iframeDocument.F;
21530
- }; // Check for document.domain and active x support
21531
- // No need to use active x approach when document.domain is not set
21532
- // see https://github.com/es-shims/es5-shim/issues/150
21533
- // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346
21534
- // avoid IE GC bug
21535
-
21536
-
21537
- var activeXDocument;
21538
-
21539
- var NullProtoObject = function () {
21540
- try {
21541
- activeXDocument = new ActiveXObject('htmlfile');
21542
- } catch (error) {
21543
- /* ignore */
21544
- }
21545
-
21546
- NullProtoObject = typeof document != 'undefined' ? document.domain && activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) // old IE
21547
- : NullProtoObjectViaIFrame() : NullProtoObjectViaActiveX(activeXDocument); // WSH
21548
-
21549
- var length = enumBugKeys.length;
21550
-
21551
- while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];
21552
-
21553
- return NullProtoObject();
21554
- };
21555
-
21556
- hiddenKeys$1[IE_PROTO] = true; // `Object.create` method
21557
- // https://tc39.es/ecma262/#sec-object.create
21558
- // eslint-disable-next-line es-x/no-object-create -- safe
21559
-
21560
- var objectCreate = Object.create || function create(O, Properties) {
21561
- var result;
21562
-
21563
- if (O !== null) {
21564
- EmptyConstructor[PROTOTYPE] = anObject(O);
21565
- result = new EmptyConstructor();
21566
- EmptyConstructor[PROTOTYPE] = null; // add "__proto__" for Object.getPrototypeOf polyfill
21567
-
21568
- result[IE_PROTO] = O;
21569
- } else result = NullProtoObject();
21570
-
21571
- return Properties === undefined ? result : objectDefineProperties.f(result, Properties);
21572
- };
21573
-
21574
- var defineProperty = objectDefineProperty.f;
21575
- var UNSCOPABLES = wellKnownSymbol('unscopables');
21576
- var ArrayPrototype = Array.prototype; // Array.prototype[@@unscopables]
21577
- // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
21578
-
21579
- if (ArrayPrototype[UNSCOPABLES] == undefined) {
21580
- defineProperty(ArrayPrototype, UNSCOPABLES, {
21581
- configurable: true,
21582
- value: objectCreate(null)
21583
- });
21584
- } // add a key to Array.prototype[@@unscopables]
21585
-
21586
-
21587
- var addToUnscopables = function (key) {
21588
- ArrayPrototype[UNSCOPABLES][key] = true;
21589
- };
21590
-
21591
- var $includes = arrayIncludes.includes; // FF99+ bug
21592
-
21593
- var BROKEN_ON_SPARSE = fails(function () {
21594
- return !Array(1).includes();
21595
- }); // `Array.prototype.includes` method
21596
- // https://tc39.es/ecma262/#sec-array.prototype.includes
21597
-
21598
- _export({
21599
- target: 'Array',
21600
- proto: true,
21601
- forced: BROKEN_ON_SPARSE
21602
- }, {
21603
- includes: function includes(el
21604
- /* , fromIndex = 0 */
21605
- ) {
21606
- return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
21607
- }
21608
- }); // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
21609
-
21610
- addToUnscopables('includes');
21611
-
21612
- const FileFormats = {
21613
- gwascatalog: {
21614
- fields: ['bin', 'chr', 'start', 'end', 'name', 'pubMedID', 'author', 'pubDate', 'journal', 'title', 'trait', 'initSample', 'replSample', 'region', 'genes', 'riskAllele', 'riskAlFreq', 'pValue', 'pValueDesc', 'orOrBeta', 'ci95', 'platform', 'cnv']
21615
- },
21616
- wgrna: {
21617
- fields: ['bin', 'chr', 'start', 'end', 'name', 'score', 'strand', 'thickStart', 'thickEnd', 'type']
21618
- },
21619
- cpgislandext: {
21620
- fields: ['bin', 'chr', 'start', 'end', 'name', 'length', 'cpgNum', 'gcNum', 'perCpg', 'perGc', 'obsExp']
21621
- },
21622
- clinVarMain: {
21623
- fields: ['chr1', 'start', 'end', 'name', 'score', 'strand', 'thickStart', 'thickEnd', 'reserved', 'blockCount', // Number of blocks
21624
- 'blockSizes', // Comma separated list of block sizes
21625
- 'chromStarts', // Start positions relative to chromStart
21626
- 'origName', // NM_198053.2(CD247):c.462C>T (p.Asp154=) ClinVar Variation Report
21627
- 'clinSign', // Likely benign Clinical significance
21628
- 'reviewStatus', // based on: criteria provided,single submitter Review Status
21629
- 'type', // single nucleotide variant Type of Variant
21630
- 'geneId', // CD247 Gene Symbol
21631
- 'snpId', // 181656780 dbSNP ID
21632
- 'nsvId', // dbVar ID
21633
- 'rcvAcc', // RCV000642347 ClinVar Allele Submission
21634
- 'testedInGtr', // N Genetic Testing Registry
21635
- 'phenotypeList', // Immunodeficiency due to defect in cd3-zeta Phenotypes
21636
- 'phenotype', // MedGen:C1857798, OMIM:610163 Phenotype identifiers
21637
- 'origin', // germline Data origin
21638
- 'assembly', // GRCh37 Genome assembly
21639
- 'cytogenetic', // 1q24.2 Cytogenetic status
21640
- 'hgvsCod', // NM_198053.2:c.462C>T Nucleotide HGVS
21641
- 'hgvsProt', // NP_932170.1:p.Asp154= Protein HGVS
21642
- 'numSubmit', // 1 Number of submitters
21643
- 'lastEval', // Dec 19,2017 Last evaluation
21644
- 'guidelines', // Guidelines
21645
- 'otherIds']
21646
- }
21647
- };
21648
-
21649
21040
  /*
21650
21041
  * The MIT License (MIT)
21651
21042
  *
@@ -21670,360 +21061,6 @@
21670
21061
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21671
21062
  * THE SOFTWARE.
21672
21063
  */
21673
- /**
21674
- * Test if the given value is a string or number. Not using typeof as it fails on boxed primitives.
21675
- *
21676
- * @param value
21677
- * @returns boolean
21678
- */
21679
-
21680
-
21681
- function isSimpleType(value) {
21682
- const simpleTypes = new Set(["boolean", "number", "string", "symbol"]);
21683
- const valueType = typeof value;
21684
- return value !== undefined && (simpleTypes.has(valueType) || value.substring || value.toFixed);
21685
- }
21686
-
21687
- function buildOptions(config, options) {
21688
- var defaultOptions = {
21689
- oauthToken: config.oauthToken,
21690
- headers: config.headers,
21691
- withCredentials: config.withCredentials,
21692
- filename: config.filename
21693
- };
21694
- return Object.assign(defaultOptions, options);
21695
- }
21696
- /**
21697
- * isMobile test from http://detectmobilebrowsers.com
21698
- * TODO -- improve UI design so this isn't neccessary
21699
- * @returns {boolean}
21700
- */
21701
- // igv.isMobile = function () {
21702
- //
21703
- // const a = (navigator.userAgent || navigator.vendor || window.opera);
21704
- // return (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) ||
21705
- // /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)))
21706
- //
21707
- // }
21708
-
21709
-
21710
- const doAutoscale = function (features) {
21711
- var min, max;
21712
-
21713
- if (features.length > 0) {
21714
- min = Number.MAX_VALUE;
21715
- max = -Number.MAX_VALUE;
21716
- features.forEach(function (f) {
21717
- if (!Number.isNaN(f.value)) {
21718
- min = Math.min(min, f.value);
21719
- max = Math.max(max, f.value);
21720
- }
21721
- }); // Insure we have a zero baseline
21722
-
21723
- if (max > 0) min = Math.min(0, min);
21724
- if (max < 0) max = 0;
21725
- } else {
21726
- // No features -- default
21727
- min = 0;
21728
- max = 100;
21729
- }
21730
-
21731
- return {
21732
- min: min,
21733
- max: max
21734
- };
21735
- };
21736
-
21737
- const validateGenomicExtent = function (chromosomeLengthBP, genomicExtent, minimumBP) {
21738
- let ss = genomicExtent.start;
21739
- let ee = genomicExtent.end;
21740
-
21741
- if (undefined === ee) {
21742
- ss -= minimumBP / 2;
21743
- ee = ss + minimumBP;
21744
-
21745
- if (ee > chromosomeLengthBP) {
21746
- ee = chromosomeLengthBP;
21747
- ss = ee - minimumBP;
21748
- } else if (ss < 0) {
21749
- ss = 0;
21750
- ee = minimumBP;
21751
- }
21752
- } else if (ee - ss < minimumBP) {
21753
- const center = (ee + ss) / 2;
21754
-
21755
- if (center - minimumBP / 2 < 0) {
21756
- ss = 0;
21757
- ee = ss + minimumBP;
21758
- } else if (center + minimumBP / 2 > chromosomeLengthBP) {
21759
- ee = chromosomeLengthBP;
21760
- ss = ee - minimumBP;
21761
- } else {
21762
- ss = center - minimumBP / 2;
21763
- ee = ss + minimumBP;
21764
- }
21765
- }
21766
-
21767
- genomicExtent.start = Math.ceil(ss);
21768
- genomicExtent.end = Math.floor(ee);
21769
- };
21770
- /*!
21771
- * is-number <https://github.com/jonschlinkert/is-number>
21772
- *
21773
- * Copyright (c) 2014-present, Jon Schlinkert.
21774
- * Released under the MIT License.
21775
- */
21776
-
21777
-
21778
- const isNumber = function (num) {
21779
- if (typeof num === 'number') {
21780
- return num - num === 0;
21781
- }
21782
-
21783
- if (typeof num === 'string' && num.trim() !== '') {
21784
- return Number.isFinite ? Number.isFinite(+num) : isFinite(+num);
21785
- }
21786
-
21787
- return false;
21788
- };
21789
-
21790
- async function getFilename(url) {
21791
- if (isString$3(url) && url.startsWith("https://drive.google.com")) {
21792
- // This will fail if Google API key is not defined
21793
- if (getApiKey() === undefined) {
21794
- throw Error("Google drive is referenced, but API key is not defined. An API key is required for Google Drive access");
21795
- }
21796
-
21797
- const json = await getDriveFileInfo(url);
21798
- return json.originalFileName || json.name;
21799
- } else {
21800
- return getFilename$1(url);
21801
- }
21802
- }
21803
-
21804
- function prettyBasePairNumber(raw) {
21805
- var denom, units, value, floored;
21806
-
21807
- if (raw > 1e7) {
21808
- denom = 1e6;
21809
- units = " mb";
21810
- } else if (raw > 1e4) {
21811
- denom = 1e3;
21812
- units = " kb";
21813
- value = raw / denom;
21814
- floored = Math.floor(value);
21815
- return numberFormatter$1(floored) + units;
21816
- } else {
21817
- return numberFormatter$1(raw) + " bp";
21818
- }
21819
-
21820
- value = raw / denom;
21821
- floored = Math.floor(value);
21822
- return floored.toString() + units;
21823
- }
21824
-
21825
- function isDataURL(obj) {
21826
- return isString$3(obj) && obj.startsWith("data:");
21827
- }
21828
-
21829
- function createColumn(columnContainer, className) {
21830
- const column = div$1({
21831
- class: className
21832
- });
21833
- columnContainer.appendChild(column);
21834
- }
21835
-
21836
- function insertElementBefore(element, referenceNode) {
21837
- referenceNode.parentNode.insertBefore(element, referenceNode);
21838
- }
21839
-
21840
- function insertElementAfter(element, referenceNode) {
21841
- referenceNode.parentNode.insertBefore(element, referenceNode.nextSibling);
21842
- }
21843
- /**
21844
- * Test to see if page is loaded in a secure context, that is by https or is localhost.
21845
- */
21846
-
21847
-
21848
- function isSecureContext() {
21849
- return window.location.protocol === "https:" || window.location.hostname === "localhost";
21850
- } // reference: https://pretagteam.com/question/find-element-height-including-margin
21851
-
21852
-
21853
- function getElementAbsoluteHeight(element) {
21854
- // Get the DOM Node if you pass in a string
21855
- element = typeof element === 'string' ? document.querySelector(element) : element;
21856
- const styles = window.getComputedStyle(element);
21857
- const margin = parseFloat(styles['marginTop']) + parseFloat(styles['marginBottom']);
21858
- const height = element.offsetHeight;
21859
- return Math.ceil(margin + height);
21860
- }
21861
-
21862
- /**
21863
- * Decoder for bedpe records.
21864
- *
21865
- * Bedpe format was created by Aaron Quinlan et al as part of the bedtools project.
21866
- * The spec is here: https://bedtools.readthedocs.io/en/latest/content/general-usage.html,
21867
- *
21868
- * 1 2 3 4 5 6 7 8 9 10 11-
21869
- * chrom1 start1 end1 chrom2 start2 end2 name score strand1 strand2 <Any number of additional, user-defined fields>
21870
- *
21871
- * However there are off spec variants, an important one being a 7 column format with score in place of the standard
21872
- * name column.
21873
- *
21874
- * A common variant is a "hiccups" output file, which is standard bedpe with the exception of a header line
21875
- * of the form
21876
- *
21877
- * chr1 x1 x2 chr2 y1 y2 name score strand1 strand2 color observed expectedBL expectedDonut expectedH expectedV fdrBL fdrDonut fdrH fdrV
21878
- *
21879
- * The "hiccups" output is apparently not standardized as this is found at ENCODE, with a non-helpful "tsv" extension
21880
- *
21881
- * chr1 x1 x2 chr2 y1 y2 color observed expectedBL expectedDonut expectedH expectedV fdrBL fdrDonut fdrH fdrV numCollapsed centroid1 centroid2 radius
21882
- * chr9 136790000 136795000 chr9 136990000 136995000 0,255,255 101.0 31.100368 38.40316 56.948116 34.040756 1.1876738E-13 1.05936405E-13 2.5148233E-4 1.7220993E-13 1 136792500 136992500 25590
21883
- *
21884
- * The "hiccups" documentation specfies yet another set of column headers
21885
- * chromosome1 x1 x2 chromosome2 y1 y2 color observed expected_bottom_left expected_donut expected_horizontal expected_vertical fdr_bottom_left fdr_donut fdr_horizontal fdr_vertical number_collapsed centroid1 centroid2 radius
21886
- *
21887
- * @param tokens
21888
- * @param ignore
21889
- * @returns {{start1: number, end2: number, end1: number, chr1: *, chr2: *, start2: number}|undefined}
21890
- */
21891
-
21892
- function decodeBedpe(tokens, header) {
21893
- if (tokens.length < 6) {
21894
- console.log("Skipping line: " + tokens.join(' '));
21895
- return undefined;
21896
- }
21897
-
21898
- var feature = {
21899
- chr1: tokens[0],
21900
- start1: Number.parseInt(tokens[1]),
21901
- end1: Number.parseInt(tokens[2]),
21902
- chr2: tokens[3],
21903
- start2: Number.parseInt(tokens[4]),
21904
- end2: Number.parseInt(tokens[5])
21905
- };
21906
-
21907
- if (isNaN(feature.start1) || isNaN(feature.end1) || isNaN(feature.start2) || isNaN(feature.end2)) {
21908
- //throw Error(`Error parsing line: ${tokens.join('\t')}`);
21909
- return undefined;
21910
- } // Determine if this is a "hiccups" file. Store result on "header" so it doesn't need repeated for every feature
21911
-
21912
-
21913
- if (header && header.hiccups === undefined) {
21914
- header.hiccups = header.columnNames ? isHiccups(header.columnNames) : false;
21915
- }
21916
-
21917
- const hiccups = header && header.hiccups;
21918
- const stdColumns = hiccups ? 6 : 10;
21919
-
21920
- if (!hiccups) {
21921
- if (tokens.length > 6 && tokens[6] !== ".") {
21922
- feature.name = tokens[6];
21923
- }
21924
-
21925
- if (tokens.length > 7 && tokens[7] !== ".") {
21926
- feature.score = Number(tokens[7]);
21927
- }
21928
-
21929
- if (tokens.length > 8 && tokens[8] !== ".") {
21930
- feature.strand1 = tokens[8];
21931
- }
21932
-
21933
- if (tokens.length > 9 && tokens[9] !== ".") {
21934
- feature.strand2 = tokens[9];
21935
- }
21936
- } // Optional extra columns
21937
-
21938
-
21939
- if (header) {
21940
- const colorColumn = header.colorColumn;
21941
-
21942
- if (colorColumn && colorColumn < tokens.length) {
21943
- feature.color = IGVColor.createColorString(tokens[colorColumn]);
21944
- }
21945
-
21946
- const thicknessColumn = header.thicknessColumn;
21947
-
21948
- if (thicknessColumn && thicknessColumn < tokens.length) {
21949
- feature.thickness = tokens[thicknessColumn];
21950
- }
21951
-
21952
- if (tokens.length > stdColumns && header.columnNames && header.columnNames.length === tokens.length) {
21953
- feature.extras = tokens.slice(stdColumns);
21954
- }
21955
- } // Set total extent of feature
21956
-
21957
-
21958
- if (feature.chr1 === feature.chr2) {
21959
- feature.chr = feature.chr1;
21960
- feature.start = Math.min(feature.start1, feature.start2);
21961
- feature.end = Math.max(feature.end1, feature.end2);
21962
- }
21963
-
21964
- return feature;
21965
- }
21966
- /**
21967
- * Hack for non-standard bedPE formats, where numeric score can be in column 7 (name field from spec)
21968
- * @param features
21969
- */
21970
-
21971
-
21972
- function fixBedPE(features) {
21973
- if (features.length == 0) return; // Assume all features have same properties
21974
-
21975
- const firstFeature = features[0];
21976
-
21977
- if (firstFeature.score === undefined && firstFeature.name !== undefined) {
21978
- // Name field (col 7) is sometimes used for score.
21979
- for (let f of features) {
21980
- if (!(isNumber(f.name) || f.name === '.')) return;
21981
- }
21982
-
21983
- for (let f of features) {
21984
- f.score = Number(f.name);
21985
- delete f.name;
21986
- }
21987
- } // Make copies of inter-chr features, one for each chromosome
21988
-
21989
-
21990
- const interChrFeatures = features.filter(f => f.chr1 !== f.chr2);
21991
-
21992
- for (let f1 of interChrFeatures) {
21993
- const f2 = Object.assign({}, f1);
21994
- f2.dup = true;
21995
- features.push(f2);
21996
- f1.chr = f1.chr1;
21997
- f1.start = f1.start1;
21998
- f1.end = f1.end1;
21999
- f2.chr = f2.chr2;
22000
- f2.start = f2.start2;
22001
- f2.end = f2.end2;
22002
- }
22003
- }
22004
- /**
22005
- * Special decoder for Hic Domain files. In these files feature1 == feature2, they are really bed records.
22006
- * @param tokens
22007
- * @param ignore
22008
- * @returns {*}
22009
- */
22010
-
22011
-
22012
- function decodeBedpeDomain(tokens, header) {
22013
- if (tokens.length < 8) return undefined;
22014
- return {
22015
- chr: tokens[0],
22016
- start: Number.parseInt(tokens[1]),
22017
- end: Number.parseInt(tokens[2]),
22018
- color: IGVColor.createColorString(tokens[6]),
22019
- value: Number(tokens[7])
22020
- };
22021
- }
22022
-
22023
- function isHiccups(columns) {
22024
- return columns && (columns.includes("fdrDonut") || columns.includes("fdr_donut"));
22025
- }
22026
-
22027
21064
  const knownFileExtensions = new Set(["narrowpeak", "broadpeak", "regionpeak", "peaks", "bedgraph", "wig", "gff3", "gff", "gtf", "fusionjuncspan", "refflat", "seg", "aed", "bed", "vcf", "bb", "bigbed", "biginteract", "biggenepred", "bignarrowpeak", "bw", "bigwig", "bam", "tdf", "refgene", "genepred", "genepredext", "bedpe", "bp", "snp", "rmsk", "cram", "gwas", "maf", "mut", "tsv", "hiccups"]);
22028
21065
  /**
22029
21066
  * Return a custom format object with the given name.
@@ -22099,7 +21136,7 @@
22099
21136
  }
22100
21137
 
22101
21138
  function inferIndexPath(url, extension) {
22102
- if (isString$3(url)) {
21139
+ if (isString$2(url)) {
22103
21140
  if (url.includes("?")) {
22104
21141
  const idx = url.indexOf("?");
22105
21142
  return url.substring(0, idx) + "." + extension + url.substring(idx);
@@ -22429,7 +21466,7 @@
22429
21466
  seq = reverseComplementSequence(seq);
22430
21467
  }
22431
21468
 
22432
- Alert.presentAlert(seq);
21469
+ this.browser.alert.present(seq);
22433
21470
  }
22434
21471
  }];
22435
21472
 
@@ -22449,7 +21486,7 @@
22449
21486
  await navigator.clipboard.writeText(seq);
22450
21487
  } catch (e) {
22451
21488
  console.error(e);
22452
- Alert.presentAlert(`error copying sequence to clipboard ${e}`);
21489
+ this.browser.alert.present(`error copying sequence to clipboard ${e}`);
22453
21490
  }
22454
21491
  }
22455
21492
  });
@@ -22920,7 +21957,7 @@
22920
21957
  */
22921
21958
 
22922
21959
 
22923
- function normalize(vector) {
21960
+ function normalize$1(vector) {
22924
21961
  var len = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1]);
22925
21962
  return [vector[0] / len, vector[1] / len];
22926
21963
  }
@@ -23747,8 +22784,8 @@
23747
22784
  // and connect that point to the previous point (x0, y0) by a straight line.
23748
22785
 
23749
22786
 
23750
- var unit_vec_p1_p0 = normalize([x0 - x1, y0 - y1]);
23751
- var unit_vec_p1_p2 = normalize([x2 - x1, y2 - y1]);
22787
+ var unit_vec_p1_p0 = normalize$1([x0 - x1, y0 - y1]);
22788
+ var unit_vec_p1_p2 = normalize$1([x2 - x1, y2 - y1]);
23752
22789
 
23753
22790
  if (unit_vec_p1_p0[0] * unit_vec_p1_p2[1] === unit_vec_p1_p0[1] * unit_vec_p1_p2[0]) {
23754
22791
  this.lineTo(x1, y1);
@@ -23763,7 +22800,7 @@
23763
22800
  var cos = unit_vec_p1_p0[0] * unit_vec_p1_p2[0] + unit_vec_p1_p0[1] * unit_vec_p1_p2[1];
23764
22801
  var theta = Math.acos(Math.abs(cos)); // Calculate origin
23765
22802
 
23766
- var unit_vec_p1_origin = normalize([unit_vec_p1_p0[0] + unit_vec_p1_p2[0], unit_vec_p1_p0[1] + unit_vec_p1_p2[1]]);
22803
+ var unit_vec_p1_origin = normalize$1([unit_vec_p1_p0[0] + unit_vec_p1_p2[0], unit_vec_p1_p0[1] + unit_vec_p1_p2[1]]);
23767
22804
  var len_p1_origin = radius / Math.sin(theta / 2);
23768
22805
  var x = x1 + len_p1_origin * unit_vec_p1_origin[0];
23769
22806
  var y = y1 + len_p1_origin * unit_vec_p1_origin[1]; // Calculate start angle and end angle
@@ -25124,9 +24161,9 @@
25124
24161
  }
25125
24162
  };
25126
24163
 
25127
- const _version = "2.13.1";
24164
+ const _version = "2.13.3";
25128
24165
 
25129
- function version() {
24166
+ function version$1() {
25130
24167
  return _version;
25131
24168
  }
25132
24169
 
@@ -25182,7 +24219,7 @@
25182
24219
 
25183
24220
  if (config.loadDefaultGenomes !== false) {
25184
24221
  try {
25185
- const url = DEFAULT_GENOMES_URL + `?randomSeed=${Math.random().toString(36)}&version=${version()}`; // prevent caching
24222
+ const url = DEFAULT_GENOMES_URL + `?randomSeed=${Math.random().toString(36)}&version=${version$1()}`; // prevent caching
25186
24223
 
25187
24224
  const jsonArray = await igvxhr.loadJson(url, {
25188
24225
  timeout: 5000
@@ -25192,7 +24229,7 @@
25192
24229
  console.error(e);
25193
24230
 
25194
24231
  try {
25195
- const url = BACKUP_GENOMES_URL + `?randomSeed=${Math.random().toString(36)}&version=${version()}`; // prevent caching
24232
+ const url = BACKUP_GENOMES_URL + `?randomSeed=${Math.random().toString(36)}&version=${version$1()}`; // prevent caching
25196
24233
 
25197
24234
  const jsonArray = await igvxhr.loadJson(url, {});
25198
24235
  processJson(jsonArray);
@@ -25229,9 +24266,9 @@
25229
24266
  return 'all' === chr.toLowerCase();
25230
24267
  },
25231
24268
  // Expand a genome id to a reference object, if needed
25232
- expandReference: function (idOrConfig) {
24269
+ expandReference: function (alert, idOrConfig) {
25233
24270
  // idOrConfig might be json
25234
- if (isString$3(idOrConfig) && idOrConfig.startsWith("{")) {
24271
+ if (isString$2(idOrConfig) && idOrConfig.startsWith("{")) {
25235
24272
  try {
25236
24273
  idOrConfig = JSON.parse(idOrConfig);
25237
24274
  } catch (e) {// Apparently its not json, could be an ID starting with "{". Unusual but legal.
@@ -25240,7 +24277,7 @@
25240
24277
 
25241
24278
  let genomeID;
25242
24279
 
25243
- if (isString$3(idOrConfig)) {
24280
+ if (isString$2(idOrConfig)) {
25244
24281
  genomeID = idOrConfig;
25245
24282
  } else if (idOrConfig.genome) {
25246
24283
  genomeID = idOrConfig.genome;
@@ -25254,7 +24291,7 @@
25254
24291
  const reference = knownGenomes[genomeID];
25255
24292
 
25256
24293
  if (!reference) {
25257
- Alert.presentAlert(new Error(`Unknown genome id: ${genomeID}`), undefined);
24294
+ alert.present(new Error(`Unknown genome id: ${genomeID}`), undefined);
25258
24295
  }
25259
24296
 
25260
24297
  return reference;
@@ -25585,7 +24622,7 @@
25585
24622
  function generateGenomeID(config) {
25586
24623
  if (config.id !== undefined) {
25587
24624
  return config.id;
25588
- } else if (config.fastaURL && isString$3(config.fastaURL)) {
24625
+ } else if (config.fastaURL && isString$2(config.fastaURL)) {
25589
24626
  return config.fastaURL;
25590
24627
  } else if (config.fastaURL && config.fastaURL.name) {
25591
24628
  return config.fastaURL.name;
@@ -25770,7 +24807,7 @@
25770
24807
  // Track might have been removed during load
25771
24808
  if (this.trackView && this.trackView.disposed !== true) {
25772
24809
  this.showMessage(NOT_LOADED_MESSAGE);
25773
- Alert.presentAlert(error);
24810
+ this.browser.alert.present(error);
25774
24811
  console.error(error);
25775
24812
  }
25776
24813
  } finally {
@@ -27972,8 +27009,8 @@
27972
27009
  */
27973
27010
 
27974
27011
  const fixColor = colorString => {
27975
- if (isString$3(colorString)) {
27976
- return colorString.indexOf(",") > 0 && !colorString.startsWith("rgb(") ? `rgb(${colorString})` : colorString;
27012
+ if (isString$2(colorString)) {
27013
+ return colorString.indexOf(",") > 0 && !(colorString.startsWith("rgb(") || colorString.startsWith("rgba(")) ? `rgb(${colorString})` : colorString;
27977
27014
  } else {
27978
27015
  return colorString;
27979
27016
  }
@@ -28014,7 +27051,7 @@
28014
27051
  this.name = config.name || config.label;
28015
27052
  } else if (isFile(config.url)) {
28016
27053
  this.name = config.url.name;
28017
- } else if (isString$3(config.url) && !config.url.startsWith("data:")) {
27054
+ } else if (isString$2(config.url) && !config.url.startsWith("data:")) {
28018
27055
  this.name = getFilename$1(config.url);
28019
27056
  }
28020
27057
 
@@ -31443,7 +30480,7 @@
31443
30480
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
31444
30481
  * THE SOFTWARE.
31445
30482
  */
31446
- const isString$2 = isString$3;
30483
+ const isString$1 = isString$2;
31447
30484
 
31448
30485
  class CustomServiceReader {
31449
30486
  constructor(config) {
@@ -31483,7 +30520,7 @@
31483
30520
  if (data) {
31484
30521
  if (typeof this.config.parser === "function") {
31485
30522
  features = this.config.parser(data);
31486
- } else if (isString$2(data)) {
30523
+ } else if (isString$1(data)) {
31487
30524
  features = JSON.parse(data);
31488
30525
  } else {
31489
30526
  features = data;
@@ -32328,6 +31365,32 @@
32328
31365
 
32329
31366
  }
32330
31367
 
31368
+ /*
31369
+ * The MIT License (MIT)
31370
+ *
31371
+ * Copyright (c) 2016-2017 The Regents of the University of California
31372
+ * Author: Jim Robinson
31373
+ *
31374
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
31375
+ * of this software and associated documentation files (the "Software"), to deal
31376
+ * in the Software without restriction, including without limitation the rights
31377
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
31378
+ * copies of the Software, and to permit persons to whom the Software is
31379
+ * furnished to do so, subject to the following conditions:
31380
+ *
31381
+ * The above copyright notice and this permission notice shall be included in
31382
+ * all copies or substantial portions of the Software.
31383
+ *
31384
+ *
31385
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
31386
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31387
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
31388
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
31389
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31390
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
31391
+ * THE SOFTWARE.
31392
+ */
31393
+
32331
31394
  class HtsgetReader {
32332
31395
  constructor(config, genome) {
32333
31396
  this.config = config;
@@ -33969,6 +33032,571 @@
33969
33032
 
33970
33033
  }
33971
33034
 
33035
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
33036
+
33037
+ function createCommonjsModule(fn) {
33038
+ var module = { exports: {} };
33039
+ return fn(module, module.exports), module.exports;
33040
+ }
33041
+
33042
+ var check = function (it) {
33043
+ return it && it.Math == Math && it;
33044
+ }; // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
33045
+
33046
+
33047
+ var global$1 = // eslint-disable-next-line es/no-global-this -- safe
33048
+ check(typeof globalThis == 'object' && globalThis) || check(typeof window == 'object' && window) || // eslint-disable-next-line no-restricted-globals -- safe
33049
+ check(typeof self == 'object' && self) || check(typeof commonjsGlobal == 'object' && commonjsGlobal) || // eslint-disable-next-line no-new-func -- fallback
33050
+ function () {
33051
+ return this;
33052
+ }() || Function('return this')();
33053
+
33054
+ var fails = function (exec) {
33055
+ try {
33056
+ return !!exec();
33057
+ } catch (error) {
33058
+ return true;
33059
+ }
33060
+ };
33061
+
33062
+ var descriptors = !fails(function () {
33063
+ // eslint-disable-next-line es/no-object-defineproperty -- required for testing
33064
+ return Object.defineProperty({}, 1, {
33065
+ get: function () {
33066
+ return 7;
33067
+ }
33068
+ })[1] != 7;
33069
+ });
33070
+
33071
+ var documentAll$2 = typeof document == 'object' && document.all; // https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot
33072
+
33073
+ var IS_HTMLDDA = typeof documentAll$2 == 'undefined' && documentAll$2 !== undefined;
33074
+ var documentAll_1 = {
33075
+ all: documentAll$2,
33076
+ IS_HTMLDDA: IS_HTMLDDA
33077
+ };
33078
+
33079
+ var documentAll$1 = documentAll_1.all; // `IsCallable` abstract operation
33080
+ // https://tc39.es/ecma262/#sec-iscallable
33081
+
33082
+ var isCallable = documentAll_1.IS_HTMLDDA ? function (argument) {
33083
+ return typeof argument == 'function' || argument === documentAll$1;
33084
+ } : function (argument) {
33085
+ return typeof argument == 'function';
33086
+ };
33087
+
33088
+ var functionBindNative = !fails(function () {
33089
+ // eslint-disable-next-line es/no-function-prototype-bind -- safe
33090
+ var test = function () {
33091
+ /* empty */
33092
+ }.bind(); // eslint-disable-next-line no-prototype-builtins -- safe
33093
+
33094
+
33095
+ return typeof test != 'function' || test.hasOwnProperty('prototype');
33096
+ });
33097
+
33098
+ var FunctionPrototype$2 = Function.prototype;
33099
+ var bind$1 = FunctionPrototype$2.bind;
33100
+ var call$2 = FunctionPrototype$2.call;
33101
+ var uncurryThis = functionBindNative && bind$1.bind(call$2, call$2);
33102
+ var functionUncurryThis = functionBindNative ? function (fn) {
33103
+ return fn && uncurryThis(fn);
33104
+ } : function (fn) {
33105
+ return fn && function () {
33106
+ return call$2.apply(fn, arguments);
33107
+ };
33108
+ };
33109
+
33110
+ // we can't use just `it == null` since of `document.all` special case
33111
+ // https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec
33112
+ var isNullOrUndefined = function (it) {
33113
+ return it === null || it === undefined;
33114
+ };
33115
+
33116
+ var $TypeError$6 = TypeError; // `RequireObjectCoercible` abstract operation
33117
+ // https://tc39.es/ecma262/#sec-requireobjectcoercible
33118
+
33119
+ var requireObjectCoercible = function (it) {
33120
+ if (isNullOrUndefined(it)) throw $TypeError$6("Can't call method on " + it);
33121
+ return it;
33122
+ };
33123
+
33124
+ var $Object$2 = Object; // `ToObject` abstract operation
33125
+ // https://tc39.es/ecma262/#sec-toobject
33126
+
33127
+ var toObject = function (argument) {
33128
+ return $Object$2(requireObjectCoercible(argument));
33129
+ };
33130
+
33131
+ var hasOwnProperty = functionUncurryThis({}.hasOwnProperty); // `HasOwnProperty` abstract operation
33132
+ // https://tc39.es/ecma262/#sec-hasownproperty
33133
+ // eslint-disable-next-line es/no-object-hasown -- safe
33134
+
33135
+ var hasOwnProperty_1 = Object.hasOwn || function hasOwn(it, key) {
33136
+ return hasOwnProperty(toObject(it), key);
33137
+ };
33138
+
33139
+ var FunctionPrototype$1 = Function.prototype; // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
33140
+
33141
+ var getDescriptor = descriptors && Object.getOwnPropertyDescriptor;
33142
+ var EXISTS$1 = hasOwnProperty_1(FunctionPrototype$1, 'name'); // additional protection from minified / mangled / dropped function names
33143
+
33144
+ var PROPER = EXISTS$1 && function something() {
33145
+ /* empty */
33146
+ }.name === 'something';
33147
+
33148
+ var CONFIGURABLE$1 = EXISTS$1 && (!descriptors || descriptors && getDescriptor(FunctionPrototype$1, 'name').configurable);
33149
+ var functionName = {
33150
+ EXISTS: EXISTS$1,
33151
+ PROPER: PROPER,
33152
+ CONFIGURABLE: CONFIGURABLE$1
33153
+ };
33154
+
33155
+ var defineProperty = Object.defineProperty;
33156
+
33157
+ var defineGlobalProperty = function (key, value) {
33158
+ try {
33159
+ defineProperty(global$1, key, {
33160
+ value: value,
33161
+ configurable: true,
33162
+ writable: true
33163
+ });
33164
+ } catch (error) {
33165
+ global$1[key] = value;
33166
+ }
33167
+
33168
+ return value;
33169
+ };
33170
+
33171
+ var SHARED = '__core-js_shared__';
33172
+ var store$1 = global$1[SHARED] || defineGlobalProperty(SHARED, {});
33173
+ var sharedStore = store$1;
33174
+
33175
+ var functionToString = functionUncurryThis(Function.toString); // this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper
33176
+
33177
+ if (!isCallable(sharedStore.inspectSource)) {
33178
+ sharedStore.inspectSource = function (it) {
33179
+ return functionToString(it);
33180
+ };
33181
+ }
33182
+
33183
+ var inspectSource = sharedStore.inspectSource;
33184
+
33185
+ var WeakMap$1 = global$1.WeakMap;
33186
+ var weakMapBasicDetection = isCallable(WeakMap$1) && /native code/.test(String(WeakMap$1));
33187
+
33188
+ var documentAll = documentAll_1.all;
33189
+ var isObject = documentAll_1.IS_HTMLDDA ? function (it) {
33190
+ return typeof it == 'object' ? it !== null : isCallable(it) || it === documentAll;
33191
+ } : function (it) {
33192
+ return typeof it == 'object' ? it !== null : isCallable(it);
33193
+ };
33194
+
33195
+ var document$1 = global$1.document; // typeof document.createElement is 'object' in old IE
33196
+
33197
+ var EXISTS = isObject(document$1) && isObject(document$1.createElement);
33198
+
33199
+ var documentCreateElement = function (it) {
33200
+ return EXISTS ? document$1.createElement(it) : {};
33201
+ };
33202
+
33203
+ var ie8DomDefine = !descriptors && !fails(function () {
33204
+ // eslint-disable-next-line es/no-object-defineproperty -- required for testing
33205
+ return Object.defineProperty(documentCreateElement('div'), 'a', {
33206
+ get: function () {
33207
+ return 7;
33208
+ }
33209
+ }).a != 7;
33210
+ });
33211
+
33212
+ // https://bugs.chromium.org/p/v8/issues/detail?id=3334
33213
+
33214
+ var v8PrototypeDefineBug = descriptors && fails(function () {
33215
+ // eslint-disable-next-line es/no-object-defineproperty -- required for testing
33216
+ return Object.defineProperty(function () {
33217
+ /* empty */
33218
+ }, 'prototype', {
33219
+ value: 42,
33220
+ writable: false
33221
+ }).prototype != 42;
33222
+ });
33223
+
33224
+ var $String$1 = String;
33225
+ var $TypeError$5 = TypeError; // `Assert: Type(argument) is Object`
33226
+
33227
+ var anObject = function (argument) {
33228
+ if (isObject(argument)) return argument;
33229
+ throw $TypeError$5($String$1(argument) + ' is not an object');
33230
+ };
33231
+
33232
+ var call$1 = Function.prototype.call;
33233
+ var functionCall = functionBindNative ? call$1.bind(call$1) : function () {
33234
+ return call$1.apply(call$1, arguments);
33235
+ };
33236
+
33237
+ var aFunction = function (argument) {
33238
+ return isCallable(argument) ? argument : undefined;
33239
+ };
33240
+
33241
+ var getBuiltIn = function (namespace, method) {
33242
+ return arguments.length < 2 ? aFunction(global$1[namespace]) : global$1[namespace] && global$1[namespace][method];
33243
+ };
33244
+
33245
+ var objectIsPrototypeOf = functionUncurryThis({}.isPrototypeOf);
33246
+
33247
+ var engineUserAgent = getBuiltIn('navigator', 'userAgent') || '';
33248
+
33249
+ var process$2 = global$1.process;
33250
+ var Deno = global$1.Deno;
33251
+ var versions = process$2 && process$2.versions || Deno && Deno.version;
33252
+ var v8 = versions && versions.v8;
33253
+ var match, version;
33254
+
33255
+ if (v8) {
33256
+ match = v8.split('.'); // in old Chrome, versions of V8 isn't V8 = Chrome / 10
33257
+ // but their correct versions are not interesting for us
33258
+
33259
+ version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);
33260
+ } // BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`
33261
+ // so check `userAgent` even if `.v8` exists, but 0
33262
+
33263
+
33264
+ if (!version && engineUserAgent) {
33265
+ match = engineUserAgent.match(/Edge\/(\d+)/);
33266
+
33267
+ if (!match || match[1] >= 74) {
33268
+ match = engineUserAgent.match(/Chrome\/(\d+)/);
33269
+ if (match) version = +match[1];
33270
+ }
33271
+ }
33272
+
33273
+ var engineV8Version = version;
33274
+
33275
+ /* eslint-disable es/no-symbol -- required for testing */
33276
+
33277
+ var symbolConstructorDetection = !!Object.getOwnPropertySymbols && !fails(function () {
33278
+ var symbol = Symbol(); // Chrome 38 Symbol has incorrect toString conversion
33279
+ // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances
33280
+
33281
+ return !String(symbol) || !(Object(symbol) instanceof Symbol) || // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances
33282
+ !Symbol.sham && engineV8Version && engineV8Version < 41;
33283
+ });
33284
+
33285
+ /* eslint-disable es/no-symbol -- required for testing */
33286
+ var useSymbolAsUid = symbolConstructorDetection && !Symbol.sham && typeof Symbol.iterator == 'symbol';
33287
+
33288
+ var $Object$1 = Object;
33289
+ var isSymbol = useSymbolAsUid ? function (it) {
33290
+ return typeof it == 'symbol';
33291
+ } : function (it) {
33292
+ var $Symbol = getBuiltIn('Symbol');
33293
+ return isCallable($Symbol) && objectIsPrototypeOf($Symbol.prototype, $Object$1(it));
33294
+ };
33295
+
33296
+ var $String = String;
33297
+
33298
+ var tryToString = function (argument) {
33299
+ try {
33300
+ return $String(argument);
33301
+ } catch (error) {
33302
+ return 'Object';
33303
+ }
33304
+ };
33305
+
33306
+ var $TypeError$4 = TypeError; // `Assert: IsCallable(argument) is true`
33307
+
33308
+ var aCallable = function (argument) {
33309
+ if (isCallable(argument)) return argument;
33310
+ throw $TypeError$4(tryToString(argument) + ' is not a function');
33311
+ };
33312
+
33313
+ // https://tc39.es/ecma262/#sec-getmethod
33314
+
33315
+ var getMethod = function (V, P) {
33316
+ var func = V[P];
33317
+ return isNullOrUndefined(func) ? undefined : aCallable(func);
33318
+ };
33319
+
33320
+ var $TypeError$3 = TypeError; // `OrdinaryToPrimitive` abstract operation
33321
+ // https://tc39.es/ecma262/#sec-ordinarytoprimitive
33322
+
33323
+ var ordinaryToPrimitive = function (input, pref) {
33324
+ var fn, val;
33325
+ if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = functionCall(fn, input))) return val;
33326
+ if (isCallable(fn = input.valueOf) && !isObject(val = functionCall(fn, input))) return val;
33327
+ if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = functionCall(fn, input))) return val;
33328
+ throw $TypeError$3("Can't convert object to primitive value");
33329
+ };
33330
+
33331
+ var shared = createCommonjsModule(function (module) {
33332
+ (module.exports = function (key, value) {
33333
+ return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {});
33334
+ })('versions', []).push({
33335
+ version: '3.25.3',
33336
+ mode: 'global',
33337
+ copyright: '© 2014-2022 Denis Pushkarev (zloirock.ru)',
33338
+ license: 'https://github.com/zloirock/core-js/blob/v3.25.3/LICENSE',
33339
+ source: 'https://github.com/zloirock/core-js'
33340
+ });
33341
+ });
33342
+
33343
+ var id = 0;
33344
+ var postfix = Math.random();
33345
+ var toString$1 = functionUncurryThis(1.0.toString);
33346
+
33347
+ var uid = function (key) {
33348
+ return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString$1(++id + postfix, 36);
33349
+ };
33350
+
33351
+ var WellKnownSymbolsStore = shared('wks');
33352
+ var Symbol$1 = global$1.Symbol;
33353
+ var symbolFor = Symbol$1 && Symbol$1['for'];
33354
+ var createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid;
33355
+
33356
+ var wellKnownSymbol = function (name) {
33357
+ if (!hasOwnProperty_1(WellKnownSymbolsStore, name) || !(symbolConstructorDetection || typeof WellKnownSymbolsStore[name] == 'string')) {
33358
+ var description = 'Symbol.' + name;
33359
+
33360
+ if (symbolConstructorDetection && hasOwnProperty_1(Symbol$1, name)) {
33361
+ WellKnownSymbolsStore[name] = Symbol$1[name];
33362
+ } else if (useSymbolAsUid && symbolFor) {
33363
+ WellKnownSymbolsStore[name] = symbolFor(description);
33364
+ } else {
33365
+ WellKnownSymbolsStore[name] = createWellKnownSymbol(description);
33366
+ }
33367
+ }
33368
+
33369
+ return WellKnownSymbolsStore[name];
33370
+ };
33371
+
33372
+ var $TypeError$2 = TypeError;
33373
+ var TO_PRIMITIVE = wellKnownSymbol('toPrimitive'); // `ToPrimitive` abstract operation
33374
+ // https://tc39.es/ecma262/#sec-toprimitive
33375
+
33376
+ var toPrimitive = function (input, pref) {
33377
+ if (!isObject(input) || isSymbol(input)) return input;
33378
+ var exoticToPrim = getMethod(input, TO_PRIMITIVE);
33379
+ var result;
33380
+
33381
+ if (exoticToPrim) {
33382
+ if (pref === undefined) pref = 'default';
33383
+ result = functionCall(exoticToPrim, input, pref);
33384
+ if (!isObject(result) || isSymbol(result)) return result;
33385
+ throw $TypeError$2("Can't convert object to primitive value");
33386
+ }
33387
+
33388
+ if (pref === undefined) pref = 'number';
33389
+ return ordinaryToPrimitive(input, pref);
33390
+ };
33391
+
33392
+ // https://tc39.es/ecma262/#sec-topropertykey
33393
+
33394
+ var toPropertyKey = function (argument) {
33395
+ var key = toPrimitive(argument, 'string');
33396
+ return isSymbol(key) ? key : key + '';
33397
+ };
33398
+
33399
+ var $TypeError$1 = TypeError; // eslint-disable-next-line es/no-object-defineproperty -- safe
33400
+
33401
+ var $defineProperty = Object.defineProperty; // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
33402
+
33403
+ var $getOwnPropertyDescriptor$1 = Object.getOwnPropertyDescriptor;
33404
+ var ENUMERABLE = 'enumerable';
33405
+ var CONFIGURABLE = 'configurable';
33406
+ var WRITABLE = 'writable'; // `Object.defineProperty` method
33407
+ // https://tc39.es/ecma262/#sec-object.defineproperty
33408
+
33409
+ var f$4 = descriptors ? v8PrototypeDefineBug ? function defineProperty(O, P, Attributes) {
33410
+ anObject(O);
33411
+ P = toPropertyKey(P);
33412
+ anObject(Attributes);
33413
+
33414
+ if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {
33415
+ var current = $getOwnPropertyDescriptor$1(O, P);
33416
+
33417
+ if (current && current[WRITABLE]) {
33418
+ O[P] = Attributes.value;
33419
+ Attributes = {
33420
+ configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],
33421
+ enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],
33422
+ writable: false
33423
+ };
33424
+ }
33425
+ }
33426
+
33427
+ return $defineProperty(O, P, Attributes);
33428
+ } : $defineProperty : function defineProperty(O, P, Attributes) {
33429
+ anObject(O);
33430
+ P = toPropertyKey(P);
33431
+ anObject(Attributes);
33432
+ if (ie8DomDefine) try {
33433
+ return $defineProperty(O, P, Attributes);
33434
+ } catch (error) {
33435
+ /* empty */
33436
+ }
33437
+ if ('get' in Attributes || 'set' in Attributes) throw $TypeError$1('Accessors not supported');
33438
+ if ('value' in Attributes) O[P] = Attributes.value;
33439
+ return O;
33440
+ };
33441
+ var objectDefineProperty = {
33442
+ f: f$4
33443
+ };
33444
+
33445
+ var createPropertyDescriptor = function (bitmap, value) {
33446
+ return {
33447
+ enumerable: !(bitmap & 1),
33448
+ configurable: !(bitmap & 2),
33449
+ writable: !(bitmap & 4),
33450
+ value: value
33451
+ };
33452
+ };
33453
+
33454
+ var createNonEnumerableProperty = descriptors ? function (object, key, value) {
33455
+ return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));
33456
+ } : function (object, key, value) {
33457
+ object[key] = value;
33458
+ return object;
33459
+ };
33460
+
33461
+ var keys = shared('keys');
33462
+
33463
+ var sharedKey = function (key) {
33464
+ return keys[key] || (keys[key] = uid(key));
33465
+ };
33466
+
33467
+ var hiddenKeys$1 = {};
33468
+
33469
+ var OBJECT_ALREADY_INITIALIZED = 'Object already initialized';
33470
+ var TypeError$1 = global$1.TypeError;
33471
+ var WeakMap = global$1.WeakMap;
33472
+ var set$1, get, has;
33473
+
33474
+ var enforce = function (it) {
33475
+ return has(it) ? get(it) : set$1(it, {});
33476
+ };
33477
+
33478
+ var getterFor = function (TYPE) {
33479
+ return function (it) {
33480
+ var state;
33481
+
33482
+ if (!isObject(it) || (state = get(it)).type !== TYPE) {
33483
+ throw TypeError$1('Incompatible receiver, ' + TYPE + ' required');
33484
+ }
33485
+
33486
+ return state;
33487
+ };
33488
+ };
33489
+
33490
+ if (weakMapBasicDetection || sharedStore.state) {
33491
+ var store = sharedStore.state || (sharedStore.state = new WeakMap());
33492
+ var wmget = functionUncurryThis(store.get);
33493
+ var wmhas = functionUncurryThis(store.has);
33494
+ var wmset = functionUncurryThis(store.set);
33495
+
33496
+ set$1 = function (it, metadata) {
33497
+ if (wmhas(store, it)) throw TypeError$1(OBJECT_ALREADY_INITIALIZED);
33498
+ metadata.facade = it;
33499
+ wmset(store, it, metadata);
33500
+ return metadata;
33501
+ };
33502
+
33503
+ get = function (it) {
33504
+ return wmget(store, it) || {};
33505
+ };
33506
+
33507
+ has = function (it) {
33508
+ return wmhas(store, it);
33509
+ };
33510
+ } else {
33511
+ var STATE = sharedKey('state');
33512
+ hiddenKeys$1[STATE] = true;
33513
+
33514
+ set$1 = function (it, metadata) {
33515
+ if (hasOwnProperty_1(it, STATE)) throw TypeError$1(OBJECT_ALREADY_INITIALIZED);
33516
+ metadata.facade = it;
33517
+ createNonEnumerableProperty(it, STATE, metadata);
33518
+ return metadata;
33519
+ };
33520
+
33521
+ get = function (it) {
33522
+ return hasOwnProperty_1(it, STATE) ? it[STATE] : {};
33523
+ };
33524
+
33525
+ has = function (it) {
33526
+ return hasOwnProperty_1(it, STATE);
33527
+ };
33528
+ }
33529
+
33530
+ var internalState = {
33531
+ set: set$1,
33532
+ get: get,
33533
+ has: has,
33534
+ enforce: enforce,
33535
+ getterFor: getterFor
33536
+ };
33537
+
33538
+ var makeBuiltIn_1 = createCommonjsModule(function (module) {
33539
+ var CONFIGURABLE_FUNCTION_NAME = functionName.CONFIGURABLE;
33540
+ var enforceInternalState = internalState.enforce;
33541
+ var getInternalState = internalState.get; // eslint-disable-next-line es/no-object-defineproperty -- safe
33542
+
33543
+ var defineProperty = Object.defineProperty;
33544
+ var CONFIGURABLE_LENGTH = descriptors && !fails(function () {
33545
+ return defineProperty(function () {
33546
+ /* empty */
33547
+ }, 'length', {
33548
+ value: 8
33549
+ }).length !== 8;
33550
+ });
33551
+ var TEMPLATE = String(String).split('String');
33552
+
33553
+ var makeBuiltIn = module.exports = function (value, name, options) {
33554
+ if (String(name).slice(0, 7) === 'Symbol(') {
33555
+ name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']';
33556
+ }
33557
+
33558
+ if (options && options.getter) name = 'get ' + name;
33559
+ if (options && options.setter) name = 'set ' + name;
33560
+
33561
+ if (!hasOwnProperty_1(value, 'name') || CONFIGURABLE_FUNCTION_NAME && value.name !== name) {
33562
+ if (descriptors) defineProperty(value, 'name', {
33563
+ value: name,
33564
+ configurable: true
33565
+ });else value.name = name;
33566
+ }
33567
+
33568
+ if (CONFIGURABLE_LENGTH && options && hasOwnProperty_1(options, 'arity') && value.length !== options.arity) {
33569
+ defineProperty(value, 'length', {
33570
+ value: options.arity
33571
+ });
33572
+ }
33573
+
33574
+ try {
33575
+ if (options && hasOwnProperty_1(options, 'constructor') && options.constructor) {
33576
+ if (descriptors) defineProperty(value, 'prototype', {
33577
+ writable: false
33578
+ }); // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable
33579
+ } else if (value.prototype) value.prototype = undefined;
33580
+ } catch (error) {
33581
+ /* empty */
33582
+ }
33583
+
33584
+ var state = enforceInternalState(value);
33585
+
33586
+ if (!hasOwnProperty_1(state, 'source')) {
33587
+ state.source = TEMPLATE.join(typeof name == 'string' ? name : '');
33588
+ }
33589
+
33590
+ return value;
33591
+ }; // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
33592
+ // eslint-disable-next-line no-extend-native -- required
33593
+
33594
+
33595
+ Function.prototype.toString = makeBuiltIn(function toString() {
33596
+ return isCallable(this) && getInternalState(this).source || inspectSource(this);
33597
+ }, 'toString');
33598
+ });
33599
+
33972
33600
  var defineBuiltInAccessor = function (target, name, descriptor) {
33973
33601
  if (descriptor.get) makeBuiltIn_1(descriptor.get, name, {
33974
33602
  getter: true
@@ -34013,7 +33641,7 @@
34013
33641
  var expected = INDICES_SUPPORT ? 'dgimsy' : 'gimsy';
34014
33642
 
34015
33643
  var addGetter = function (key, chr) {
34016
- // eslint-disable-next-line es-x/no-object-defineproperty -- safe
33644
+ // eslint-disable-next-line es/no-object-defineproperty -- safe
34017
33645
  Object.defineProperty(O, key, {
34018
33646
  get: function () {
34019
33647
  calls += chr;
@@ -34031,7 +33659,7 @@
34031
33659
  };
34032
33660
  if (INDICES_SUPPORT) pairs.hasIndices = 'd';
34033
33661
 
34034
- for (var key in pairs) addGetter(key, pairs[key]); // eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe
33662
+ for (var key in pairs) addGetter(key, pairs[key]); // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
34035
33663
 
34036
33664
 
34037
33665
  var result = Object.getOwnPropertyDescriptor(RegExpPrototype, 'flags').get.call(O);
@@ -35298,7 +34926,7 @@
35298
34926
  this.name = config.name;
35299
34927
  } else if (config.url && isFile(config.url)) {
35300
34928
  this.name = config.url.name;
35301
- } else if (config.url && isString$3(config.url) && !config.url.startsWith("data:")) {
34929
+ } else if (config.url && isString$2(config.url) && !config.url.startsWith("data:")) {
35302
34930
  this.name = getFilename$1(config.url);
35303
34931
  }
35304
34932
 
@@ -35419,11 +35047,13 @@
35419
35047
  this.genome = genome;
35420
35048
 
35421
35049
  for (let feature of features) {
35422
- let featureList = this.featureMap[feature.chr];
35050
+ // Store as canonical chr name (i.e. translate aliases)
35051
+ const chrKey = genome ? genome.getChromosomeName(feature.chr) : feature.chr;
35052
+ let featureList = this.featureMap[chrKey];
35423
35053
 
35424
35054
  if (!featureList) {
35425
35055
  featureList = [];
35426
- this.featureMap[feature.chr] = featureList;
35056
+ this.featureMap[chrKey] = featureList;
35427
35057
  }
35428
35058
 
35429
35059
  featureList.push(feature);
@@ -35801,8 +35431,6 @@
35801
35431
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
35802
35432
  * THE SOFTWARE.
35803
35433
  */
35804
- const isString$1 = isString$3;
35805
- const hashCode = hashCode$1;
35806
35434
 
35807
35435
  class BamAlignmentRow {
35808
35436
  constructor() {
@@ -35839,26 +35467,20 @@
35839
35467
  return centerAlignment;
35840
35468
  }
35841
35469
 
35842
- updateScore(options, alignmentContainer) {
35843
- this.score = this.calculateScore(options, alignmentContainer);
35844
- }
35845
-
35846
- calculateScore(_ref, alignmentContainer) {
35470
+ getSortValue(_ref, alignmentContainer) {
35847
35471
  let {
35848
35472
  position,
35849
35473
  option,
35850
- direction,
35851
35474
  tag
35852
35475
  } = _ref;
35853
35476
  if (!option) option = "BASE";
35854
35477
  const alignment = this.findAlignment(position);
35855
35478
 
35856
35479
  if (undefined === alignment) {
35857
- return Number.MAX_VALUE * (direction ? 1 : -1);
35480
+ // This condition should never occur
35481
+ return Number.MAX_VALUE;
35858
35482
  }
35859
35483
 
35860
- let mate;
35861
-
35862
35484
  switch (option) {
35863
35485
  case "NUCLEOTIDE":
35864
35486
  case "BASE":
@@ -35874,17 +35496,11 @@
35874
35496
 
35875
35497
  case "TAG":
35876
35498
  {
35877
- const tagValue = alignment.tags()[tag];
35878
-
35879
- if (tagValue !== undefined) {
35880
- return isString$1(tagValue) ? hashCode(tagValue) : tagValue;
35881
- } else {
35882
- return Number.MAX_VALUE;
35883
- }
35499
+ return alignment.tags()[tag];
35884
35500
  }
35885
35501
 
35886
35502
  case "READ_NAME":
35887
- return hashCode(alignment.readName);
35503
+ return alignment.readName;
35888
35504
 
35889
35505
  case "INSERT_SIZE":
35890
35506
  return -Math.abs(alignment.fragmentLength);
@@ -35893,17 +35509,7 @@
35893
35509
  return -alignment.gapSizeAt(position);
35894
35510
 
35895
35511
  case "MATE_CHR":
35896
- mate = alignment.mate;
35897
-
35898
- if (!mate) {
35899
- return Number.MAX_VALUE;
35900
- } else {
35901
- if (mate.chr === alignment.chr) {
35902
- return Number.MAX_VALUE - 1;
35903
- } else {
35904
- return hashCode(mate.chr);
35905
- }
35906
- }
35512
+ return alignment.mate;
35907
35513
 
35908
35514
  case "MQ":
35909
35515
  return alignment.mq === undefined ? Number.MAX_VALUE : -alignment.mq;
@@ -36255,6 +35861,36 @@
36255
35861
  return this.coverageMap.getMax(start, end);
36256
35862
  }
36257
35863
 
35864
+ sortRows(options) {
35865
+ const newRows = [];
35866
+ const undefinedRow = [];
35867
+
35868
+ for (let row of this.packedAlignmentRows) {
35869
+ const alignment = row.findAlignment(options.position);
35870
+
35871
+ if (undefined !== alignment) {
35872
+ newRows.push(row);
35873
+ } else {
35874
+ undefinedRow.push(row);
35875
+ }
35876
+ }
35877
+
35878
+ newRows.sort((rowA, rowB) => {
35879
+ const direction = options.direction;
35880
+ const rowAValue = rowA.getSortValue(options, this);
35881
+ const rowBValue = rowB.getSortValue(options, this);
35882
+ if (rowBValue === undefined && rowBValue !== undefined) return 1;else if (rowAValue !== undefined && rowBValue === undefined) return -1;
35883
+ const i = rowAValue > rowBValue ? 1 : rowAValue < rowBValue ? -1 : 0;
35884
+ return true === direction ? i : -i;
35885
+ });
35886
+
35887
+ for (let row of undefinedRow) {
35888
+ newRows.push(row);
35889
+ }
35890
+
35891
+ this.packedAlignmentRows = newRows;
35892
+ }
35893
+
36258
35894
  }
36259
35895
 
36260
35896
  class DownsampleBucket {
@@ -38117,9 +37753,293 @@
38117
37753
 
38118
37754
  }
38119
37755
 
37756
+ var $propertyIsEnumerable = {}.propertyIsEnumerable; // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
37757
+
37758
+ var getOwnPropertyDescriptor$1 = Object.getOwnPropertyDescriptor; // Nashorn ~ JDK8 bug
37759
+
37760
+ var NASHORN_BUG = getOwnPropertyDescriptor$1 && !$propertyIsEnumerable.call({
37761
+ 1: 2
37762
+ }, 1); // `Object.prototype.propertyIsEnumerable` method implementation
37763
+ // https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable
37764
+
37765
+ var f$3 = NASHORN_BUG ? function propertyIsEnumerable(V) {
37766
+ var descriptor = getOwnPropertyDescriptor$1(this, V);
37767
+ return !!descriptor && descriptor.enumerable;
37768
+ } : $propertyIsEnumerable;
37769
+ var objectPropertyIsEnumerable = {
37770
+ f: f$3
37771
+ };
37772
+
37773
+ var toString = functionUncurryThis({}.toString);
37774
+ var stringSlice = functionUncurryThis(''.slice);
37775
+
37776
+ var classofRaw = function (it) {
37777
+ return stringSlice(toString(it), 8, -1);
37778
+ };
37779
+
37780
+ var $Object = Object;
37781
+ var split = functionUncurryThis(''.split); // fallback for non-array-like ES3 and non-enumerable old V8 strings
37782
+
37783
+ var indexedObject = fails(function () {
37784
+ // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346
37785
+ // eslint-disable-next-line no-prototype-builtins -- safe
37786
+ return !$Object('z').propertyIsEnumerable(0);
37787
+ }) ? function (it) {
37788
+ return classofRaw(it) == 'String' ? split(it, '') : $Object(it);
37789
+ } : $Object;
37790
+
37791
+ var toIndexedObject = function (it) {
37792
+ return indexedObject(requireObjectCoercible(it));
37793
+ };
37794
+
37795
+ var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; // `Object.getOwnPropertyDescriptor` method
37796
+ // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
37797
+
37798
+ var f$2 = descriptors ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {
37799
+ O = toIndexedObject(O);
37800
+ P = toPropertyKey(P);
37801
+ if (ie8DomDefine) try {
37802
+ return $getOwnPropertyDescriptor(O, P);
37803
+ } catch (error) {
37804
+ /* empty */
37805
+ }
37806
+ if (hasOwnProperty_1(O, P)) return createPropertyDescriptor(!functionCall(objectPropertyIsEnumerable.f, O, P), O[P]);
37807
+ };
37808
+ var objectGetOwnPropertyDescriptor = {
37809
+ f: f$2
37810
+ };
37811
+
37812
+ var defineBuiltIn = function (O, key, value, options) {
37813
+ if (!options) options = {};
37814
+ var simple = options.enumerable;
37815
+ var name = options.name !== undefined ? options.name : key;
37816
+ if (isCallable(value)) makeBuiltIn_1(value, name, options);
37817
+
37818
+ if (options.global) {
37819
+ if (simple) O[key] = value;else defineGlobalProperty(key, value);
37820
+ } else {
37821
+ try {
37822
+ if (!options.unsafe) delete O[key];else if (O[key]) simple = true;
37823
+ } catch (error) {
37824
+ /* empty */
37825
+ }
37826
+
37827
+ if (simple) O[key] = value;else objectDefineProperty.f(O, key, {
37828
+ value: value,
37829
+ enumerable: false,
37830
+ configurable: !options.nonConfigurable,
37831
+ writable: !options.nonWritable
37832
+ });
37833
+ }
37834
+
37835
+ return O;
37836
+ };
37837
+
37838
+ var ceil = Math.ceil;
37839
+ var floor = Math.floor; // `Math.trunc` method
37840
+ // https://tc39.es/ecma262/#sec-math.trunc
37841
+ // eslint-disable-next-line es/no-math-trunc -- safe
37842
+
37843
+ var mathTrunc = Math.trunc || function trunc(x) {
37844
+ var n = +x;
37845
+ return (n > 0 ? floor : ceil)(n);
37846
+ };
37847
+
37848
+ // https://tc39.es/ecma262/#sec-tointegerorinfinity
37849
+
37850
+ var toIntegerOrInfinity = function (argument) {
37851
+ var number = +argument; // eslint-disable-next-line no-self-compare -- NaN check
37852
+
37853
+ return number !== number || number === 0 ? 0 : mathTrunc(number);
37854
+ };
37855
+
37856
+ var max = Math.max;
37857
+ var min$1 = Math.min; // Helper for a popular repeating case of the spec:
37858
+ // Let integer be ? ToInteger(index).
37859
+ // If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).
37860
+
37861
+ var toAbsoluteIndex = function (index, length) {
37862
+ var integer = toIntegerOrInfinity(index);
37863
+ return integer < 0 ? max(integer + length, 0) : min$1(integer, length);
37864
+ };
37865
+
37866
+ var min = Math.min; // `ToLength` abstract operation
37867
+ // https://tc39.es/ecma262/#sec-tolength
37868
+
37869
+ var toLength = function (argument) {
37870
+ return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991
37871
+ };
37872
+
37873
+ // https://tc39.es/ecma262/#sec-lengthofarraylike
37874
+
37875
+ var lengthOfArrayLike = function (obj) {
37876
+ return toLength(obj.length);
37877
+ };
37878
+
37879
+ var createMethod = function (IS_INCLUDES) {
37880
+ return function ($this, el, fromIndex) {
37881
+ var O = toIndexedObject($this);
37882
+ var length = lengthOfArrayLike(O);
37883
+ var index = toAbsoluteIndex(fromIndex, length);
37884
+ var value; // Array#includes uses SameValueZero equality algorithm
37885
+ // eslint-disable-next-line no-self-compare -- NaN check
37886
+
37887
+ if (IS_INCLUDES && el != el) while (length > index) {
37888
+ value = O[index++]; // eslint-disable-next-line no-self-compare -- NaN check
37889
+
37890
+ if (value != value) return true; // Array#indexOf ignores holes, Array#includes - not
37891
+ } else for (; length > index; index++) {
37892
+ if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;
37893
+ }
37894
+ return !IS_INCLUDES && -1;
37895
+ };
37896
+ };
37897
+
37898
+ var arrayIncludes = {
37899
+ // `Array.prototype.includes` method
37900
+ // https://tc39.es/ecma262/#sec-array.prototype.includes
37901
+ includes: createMethod(true),
37902
+ // `Array.prototype.indexOf` method
37903
+ // https://tc39.es/ecma262/#sec-array.prototype.indexof
37904
+ indexOf: createMethod(false)
37905
+ };
37906
+
37907
+ var indexOf = arrayIncludes.indexOf;
37908
+ var push = functionUncurryThis([].push);
37909
+
37910
+ var objectKeysInternal = function (object, names) {
37911
+ var O = toIndexedObject(object);
37912
+ var i = 0;
37913
+ var result = [];
37914
+ var key;
37915
+
37916
+ for (key in O) !hasOwnProperty_1(hiddenKeys$1, key) && hasOwnProperty_1(O, key) && push(result, key); // Don't enum bug & hidden keys
37917
+
37918
+
37919
+ while (names.length > i) if (hasOwnProperty_1(O, key = names[i++])) {
37920
+ ~indexOf(result, key) || push(result, key);
37921
+ }
37922
+
37923
+ return result;
37924
+ };
37925
+
37926
+ // IE8- don't enum bug keys
37927
+ var enumBugKeys = ['constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf'];
37928
+
37929
+ var hiddenKeys = enumBugKeys.concat('length', 'prototype'); // `Object.getOwnPropertyNames` method
37930
+ // https://tc39.es/ecma262/#sec-object.getownpropertynames
37931
+ // eslint-disable-next-line es/no-object-getownpropertynames -- safe
37932
+
37933
+ var f$1 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
37934
+ return objectKeysInternal(O, hiddenKeys);
37935
+ };
37936
+
37937
+ var objectGetOwnPropertyNames = {
37938
+ f: f$1
37939
+ };
37940
+
37941
+ // eslint-disable-next-line es/no-object-getownpropertysymbols -- safe
37942
+ var f = Object.getOwnPropertySymbols;
37943
+ var objectGetOwnPropertySymbols = {
37944
+ f: f
37945
+ };
37946
+
37947
+ var concat = functionUncurryThis([].concat); // all object keys, includes non-enumerable and symbols
37948
+
37949
+ var ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {
37950
+ var keys = objectGetOwnPropertyNames.f(anObject(it));
37951
+ var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;
37952
+ return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;
37953
+ };
37954
+
37955
+ var copyConstructorProperties = function (target, source, exceptions) {
37956
+ var keys = ownKeys(source);
37957
+ var defineProperty = objectDefineProperty.f;
37958
+ var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
37959
+
37960
+ for (var i = 0; i < keys.length; i++) {
37961
+ var key = keys[i];
37962
+
37963
+ if (!hasOwnProperty_1(target, key) && !(exceptions && hasOwnProperty_1(exceptions, key))) {
37964
+ defineProperty(target, key, getOwnPropertyDescriptor(source, key));
37965
+ }
37966
+ }
37967
+ };
37968
+
37969
+ var replacement = /#|\.prototype\./;
37970
+
37971
+ var isForced = function (feature, detection) {
37972
+ var value = data[normalize(feature)];
37973
+ return value == POLYFILL ? true : value == NATIVE ? false : isCallable(detection) ? fails(detection) : !!detection;
37974
+ };
37975
+
37976
+ var normalize = isForced.normalize = function (string) {
37977
+ return String(string).replace(replacement, '.').toLowerCase();
37978
+ };
37979
+
37980
+ var data = isForced.data = {};
37981
+ var NATIVE = isForced.NATIVE = 'N';
37982
+ var POLYFILL = isForced.POLYFILL = 'P';
37983
+ var isForced_1 = isForced;
37984
+
37985
+ var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
37986
+ /*
37987
+ options.target - name of the target object
37988
+ options.global - target is the global object
37989
+ options.stat - export as static methods of target
37990
+ options.proto - export as prototype methods of target
37991
+ options.real - real prototype method for the `pure` version
37992
+ options.forced - export even if the native feature is available
37993
+ options.bind - bind methods to the target, required for the `pure` version
37994
+ options.wrap - wrap constructors to preventing global pollution, required for the `pure` version
37995
+ options.unsafe - use the simple assignment of property instead of delete + defineProperty
37996
+ options.sham - add a flag to not completely full polyfills
37997
+ options.enumerable - export as enumerable property
37998
+ options.dontCallGetSet - prevent calling a getter on target
37999
+ options.name - the .name of the function if it does not match the key
38000
+ */
38001
+
38002
+ var _export = function (options, source) {
38003
+ var TARGET = options.target;
38004
+ var GLOBAL = options.global;
38005
+ var STATIC = options.stat;
38006
+ var FORCED, target, key, targetProperty, sourceProperty, descriptor;
38007
+
38008
+ if (GLOBAL) {
38009
+ target = global$1;
38010
+ } else if (STATIC) {
38011
+ target = global$1[TARGET] || defineGlobalProperty(TARGET, {});
38012
+ } else {
38013
+ target = (global$1[TARGET] || {}).prototype;
38014
+ }
38015
+
38016
+ if (target) for (key in source) {
38017
+ sourceProperty = source[key];
38018
+
38019
+ if (options.dontCallGetSet) {
38020
+ descriptor = getOwnPropertyDescriptor(target, key);
38021
+ targetProperty = descriptor && descriptor.value;
38022
+ } else targetProperty = target[key];
38023
+
38024
+ FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced); // contained in target
38025
+
38026
+ if (!FORCED && targetProperty !== undefined) {
38027
+ if (typeof sourceProperty == typeof targetProperty) continue;
38028
+ copyConstructorProperties(sourceProperty, targetProperty);
38029
+ } // add a flag to not completely full polyfills
38030
+
38031
+
38032
+ if (options.sham || targetProperty && targetProperty.sham) {
38033
+ createNonEnumerableProperty(sourceProperty, 'sham', true);
38034
+ }
38035
+
38036
+ defineBuiltIn(target, key, sourceProperty, options);
38037
+ }
38038
+ };
38039
+
38120
38040
  var FunctionPrototype = Function.prototype;
38121
38041
  var apply = FunctionPrototype.apply;
38122
- var call = FunctionPrototype.call; // eslint-disable-next-line es-x/no-reflect -- safe
38042
+ var call = FunctionPrototype.call; // eslint-disable-next-line es/no-reflect -- safe
38123
38043
 
38124
38044
  var functionApply = typeof Reflect == 'object' && Reflect.apply || (functionBindNative ? call.bind(apply) : function () {
38125
38045
  return call.apply(apply, arguments);
@@ -38136,6 +38056,8 @@
38136
38056
  };
38137
38057
  };
38138
38058
 
38059
+ var html = getBuiltIn('document', 'documentElement');
38060
+
38139
38061
  var arraySlice = functionUncurryThis([].slice);
38140
38062
 
38141
38063
  var $TypeError = TypeError;
@@ -38159,11 +38081,11 @@
38159
38081
  var counter = 0;
38160
38082
  var queue = {};
38161
38083
  var ONREADYSTATECHANGE = 'onreadystatechange';
38162
- var location, defer, channel, port;
38084
+ var $location, defer, channel, port;
38163
38085
 
38164
38086
  try {
38165
38087
  // Deno throws a ReferenceError on `location` access without `--location` flag
38166
- location = global$1.location;
38088
+ $location = global$1.location;
38167
38089
  } catch (error) {
38168
38090
  /* empty */
38169
38091
  }
@@ -38188,7 +38110,7 @@
38188
38110
 
38189
38111
  var post = function (id) {
38190
38112
  // old engines have not location.origin
38191
- global$1.postMessage(String$1(id), location.protocol + '//' + location.host);
38113
+ global$1.postMessage(String$1(id), $location.protocol + '//' + $location.host);
38192
38114
  }; // Node.js 0.9+ & IE10+ has setImmediate, otherwise:
38193
38115
 
38194
38116
 
@@ -38228,7 +38150,7 @@
38228
38150
  channel.port1.onmessage = listener;
38229
38151
  defer = functionBindContext(port.postMessage, port); // Browsers with postMessage, skip WebWorkers
38230
38152
  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
38231
- } else if (global$1.addEventListener && isCallable(global$1.postMessage) && !global$1.importScripts && location && location.protocol !== 'file:' && !fails(post)) {
38153
+ } else if (global$1.addEventListener && isCallable(global$1.postMessage) && !global$1.importScripts && $location && $location.protocol !== 'file:' && !fails(post)) {
38232
38154
  defer = post;
38233
38155
  global$1.addEventListener('message', listener, false); // IE8-
38234
38156
  } else if (ONREADYSTATECHANGE in documentCreateElement('script')) {
@@ -53449,7 +53371,7 @@
53449
53371
  message = "Sequence mismatch. Is this the correct genome for the loaded CRAM?";
53450
53372
  }
53451
53373
 
53452
- Alert.presentAlert(new Error(message));
53374
+ this.browser.alert.present(new Error(message));
53453
53375
  throw error;
53454
53376
  }
53455
53377
  }
@@ -54197,10 +54119,6 @@
54197
54119
  this.genome = genome;
54198
54120
 
54199
54121
  if (isDataURL(config.url)) {
54200
- if ("cram" === config.format) {
54201
- throw "CRAM data uris are not supported";
54202
- }
54203
-
54204
54122
  this.config.indexed = false;
54205
54123
  }
54206
54124
 
@@ -54216,7 +54134,7 @@
54216
54134
  this.bamReader = new CramReader(config, genome, browser);
54217
54135
  } else {
54218
54136
  if (!this.config.indexURL && config.indexed !== false) {
54219
- if (isString$3(this.config.url)) {
54137
+ if (isString$2(this.config.url)) {
54220
54138
  const inferIndexPath$1 = inferIndexPath(this.config.url, "bai");
54221
54139
 
54222
54140
  if (inferIndexPath$1) {
@@ -56609,7 +56527,7 @@
56609
56527
  const alignmentContainer = vp.cachedFeatures;
56610
56528
 
56611
56529
  if (alignmentContainer) {
56612
- sortAlignmentRows(options, alignmentContainer);
56530
+ alignmentContainer.sortRows(options);
56613
56531
  vp.repaint();
56614
56532
  }
56615
56533
  }
@@ -56655,7 +56573,7 @@
56655
56573
 
56656
56574
  if (sort) {
56657
56575
  if (sort.chr === chr && sort.position >= bpStart && sort.position <= bpEnd) {
56658
- sortAlignmentRows(sort, alignmentContainer);
56576
+ alignmentContainer.sortRows(sort);
56659
56577
  }
56660
56578
  }
56661
56579
 
@@ -57708,7 +57626,7 @@
57708
57626
  direction: direction
57709
57627
  };
57710
57628
  this.parent.sortObject = newSortObject;
57711
- sortAlignmentRows(newSortObject, viewport.cachedFeatures);
57629
+ viewport.cachedFeatures.sortRows(newSortObject);
57712
57630
  viewport.repaint();
57713
57631
  };
57714
57632
 
@@ -57764,7 +57682,7 @@
57764
57682
  };
57765
57683
  this.sortByTag = tag;
57766
57684
  this.parent.sortObject = newSortObject;
57767
- sortAlignmentRows(newSortObject, viewport.cachedFeatures);
57685
+ viewport.cachedFeatures.sortRows(newSortObject);
57768
57686
  viewport.repaint();
57769
57687
  }
57770
57688
  }
@@ -57795,7 +57713,7 @@
57795
57713
  const frameEnd = clickedAlignment.mate.position + bpWidth / 2;
57796
57714
  this.browser.addMultiLocusPanel(clickedAlignment.mate.chr, frameStart, frameEnd, referenceFrame);
57797
57715
  } else {
57798
- Alert.presentAlert(`Reference does not contain chromosome: ${clickedAlignment.mate.chr}`);
57716
+ this.browser.alert.present(`Reference does not contain chromosome: ${clickedAlignment.mate.chr}`);
57799
57717
  }
57800
57718
  }
57801
57719
  },
@@ -57809,9 +57727,9 @@
57809
57727
  const seqstring = clickedAlignment.seq; //.map(b => String.fromCharCode(b)).join("");
57810
57728
 
57811
57729
  if (!seqstring || "*" === seqstring) {
57812
- Alert.presentAlert("Read sequence: *");
57730
+ this.browser.alert.present("Read sequence: *");
57813
57731
  } else {
57814
- Alert.presentAlert(seqstring);
57732
+ this.browser.alert.present(seqstring);
57815
57733
  }
57816
57734
  }
57817
57735
  });
@@ -57827,7 +57745,7 @@
57827
57745
  await navigator.clipboard.writeText(seq);
57828
57746
  } catch (e) {
57829
57747
  console.error(e);
57830
- Alert.presentAlert(`error copying sequence to clipboard ${e}`);
57748
+ this.browser.alert.present(`error copying sequence to clipboard ${e}`);
57831
57749
  }
57832
57750
  }
57833
57751
  });
@@ -58004,19 +57922,6 @@
58004
57922
 
58005
57923
  }
58006
57924
 
58007
- function sortAlignmentRows(options, alignmentContainer) {
58008
- const direction = options.direction;
58009
-
58010
- for (let row of alignmentContainer.packedAlignmentRows) {
58011
- row.updateScore(options, alignmentContainer);
58012
- }
58013
-
58014
- alignmentContainer.packedAlignmentRows.sort(function (rowA, rowB) {
58015
- const i = rowA.score > rowB.score ? 1 : rowA.score < rowB.score ? -1 : 0;
58016
- return true === direction ? i : -i;
58017
- });
58018
- }
58019
-
58020
57925
  function shadedBaseColor(qual, baseColor) {
58021
57926
  const minQ = 5; //prefs.getAsInt(PreferenceManager.SAM_BASE_QUALITY_MIN),
58022
57927
 
@@ -58720,198 +58625,222 @@
58720
58625
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
58721
58626
  * THE SOFTWARE.
58722
58627
  */
58723
-
58724
- const MenuPopup = function (parent) {
58725
- this.popover = div$1({
58726
- class: 'igv-menu-popup'
58727
- });
58728
- parent.appendChild(this.popover);
58729
- const header = div$1({
58730
- class: 'igv-menu-popup-header'
58731
- });
58732
- this.popover.appendChild(header);
58733
- attachDialogCloseHandlerWithParent$1(header, () => this.hide());
58734
- this.popoverContent = div$1();
58735
- this.popover.appendChild(this.popoverContent);
58736
- makeDraggable$1(this.popover, header);
58737
- header.addEventListener('click', e => {
58738
- e.stopPropagation();
58739
- e.preventDefault(); // absorb click to prevent it leaking through to parent DOM element
58740
- });
58741
- this.hide();
58742
- };
58743
-
58744
- MenuPopup.prototype.hide = function () {
58745
- this.popover.style.display = 'none';
58746
- };
58747
-
58748
- MenuPopup.prototype.presentMenuList = function (menuList) {
58749
- hideAllMenuPopups();
58750
-
58751
- if (menuList.length > 0) {
58752
- this.popoverContent.innerHTML = '';
58753
- menuList = MenuUtils.trackMenuItemListHelper(menuList, this);
58754
-
58755
- for (let item of menuList) {
58756
- if (item.init) {
58757
- item.init();
58758
- }
58759
-
58760
- let $e = item.object;
58761
-
58762
- if (0 === menuList.indexOf(item)) {
58763
- $e.removeClass('igv-track-menu-border-top');
58764
- }
58765
-
58766
- if ($e.hasClass('igv-track-menu-border-top') || $e.hasClass('igv-menu-popup-check-container')) ; else if ($e.is('div')) {
58767
- $e.addClass('igv-menu-popup-shim');
58768
- }
58769
-
58770
- this.popoverContent.appendChild($e.get(0));
58771
- } // NOTE: style.display most NOT be 'none' when calculating width. a display = 'none' will always
58772
- // yield a width of zero (0).
58773
-
58774
-
58775
- this.popover.style.display = 'flex';
58776
- const {
58777
- width
58778
- } = this.popover.getBoundingClientRect();
58779
- this.popover.style.left = `${-width}px`;
58780
- this.popover.style.top = `${0}px`;
58781
- }
58782
- };
58783
-
58784
- MenuPopup.prototype.presentTrackContextMenu = function (e, menuItems) {
58785
- this.popoverContent.innerHTML = '';
58786
- const menuElements = createMenuElements(menuItems, this.popover);
58787
-
58788
- for (let {
58789
- el
58790
- } of menuElements) {
58791
- this.popoverContent.appendChild(el);
58792
- }
58793
-
58794
- present(e, this.popover);
58795
- };
58796
-
58797
- MenuPopup.prototype.dispose = function () {
58798
- this.popoverContent.innerHTML = '';
58799
- this.popover.innerHTML = '';
58800
- Object.keys(this).forEach(function (key) {
58801
- this[key] = undefined;
58802
- });
58803
- };
58804
-
58805
- function createMenuElements(itemList, popover) {
58806
- return itemList.map(item => {
58807
- let el;
58808
-
58809
- if (typeof item === 'string' && '<hr/>' === item) {
58810
- el = document.createElement('hr');
58811
- } else if (typeof item === 'string') {
58812
- el = div$1({
58813
- class: 'context-menu'
58814
- });
58815
- el.innerHTML = item;
58816
- } else if (typeof item === 'Node') {
58817
- el = item;
58818
- } else {
58819
- if (typeof item.init === 'function') {
58820
- item.init();
58821
- }
58822
-
58823
- if ("checkbox" === item.type) {
58824
- el = createCheckbox$1("Show all bases", item.value);
58825
- } else if ("color" === item.type) {
58826
- const colorPicker = new GenericColorPicker({
58827
- parent: popover.parentElement,
58828
- width: 364
58829
- });
58830
- colorPicker.configure(undefined, {
58831
- color: color => item.click(color)
58832
- });
58833
- el = div$1({
58834
- class: 'context-menu'
58835
- });
58836
-
58837
- if (typeof item.label === 'string') {
58838
- el.innerHTML = item.label;
58839
- }
58840
-
58841
- const clickHandler = e => {
58842
- colorPicker.show();
58843
- hide$1(popover);
58844
- e.preventDefault();
58845
- e.stopPropagation();
58846
- };
58847
-
58848
- el.addEventListener('click', clickHandler);
58849
- el.addEventListener('touchend', clickHandler);
58850
- el.addEventListener('mouseup', function (e) {
58851
- e.preventDefault();
58852
- e.stopPropagation();
58853
- });
58854
- } else {
58855
- el = div$1({
58856
- class: 'context-menu'
58857
- });
58858
-
58859
- if (typeof item.label === 'string') {
58860
- el.innerHTML = item.label;
58861
- }
58862
- }
58863
-
58864
- if (item.click && "color" !== item.type) {
58865
- el.addEventListener('click', handleClick);
58866
- el.addEventListener('touchend', handleClick);
58867
- el.addEventListener('mouseup', function (e) {
58868
- e.preventDefault();
58869
- e.stopPropagation();
58870
- }); // eslint-disable-next-line no-inner-declarations
58871
-
58872
- function handleClick(e) {
58873
- item.click();
58874
- hide$1(popover);
58875
- e.preventDefault();
58876
- e.stopPropagation();
58877
- }
58878
- }
58879
- }
58880
-
58881
- return {
58882
- el,
58883
- init: item.init
58884
- };
58885
- });
58886
- }
58887
-
58888
- function present(e, popover) {
58889
- // NOTE: style.display most NOT be 'none' when calculating width. a display = 'none' will always
58890
- // yield a width of zero (0).
58891
- popover.style.display = 'flex';
58892
- const {
58893
- x,
58894
- y
58895
- } = translateMouseCoordinates$1(e, popover.parentNode);
58896
- const {
58897
- width
58898
- } = popover.getBoundingClientRect();
58899
- const xmax = x + width;
58900
- const {
58901
- width: parentWidth
58902
- } = popover.parentNode.getBoundingClientRect();
58903
- popover.style.left = `${xmax > parentWidth ? x - (xmax - parentWidth) : x}px`;
58904
- popover.style.top = `${y}px`;
58905
- }
58906
-
58907
- const hideAllMenuPopups = () => {
58908
- const menus = document.querySelectorAll('.igv-menu-popup');
58909
-
58910
- for (let i = 0; i < menus.length; i++) {
58911
- menus[i].style.display = 'none';
58912
- }
58913
- };
58914
-
58628
+
58629
+ const MenuPopup = function (parent) {
58630
+ this.popover = div$1({
58631
+ class: 'igv-menu-popup'
58632
+ });
58633
+ parent.appendChild(this.popover);
58634
+ const header = div$1({
58635
+ class: 'igv-menu-popup-header'
58636
+ });
58637
+ this.popover.appendChild(header);
58638
+ attachDialogCloseHandlerWithParent$1(header, () => this.hide());
58639
+ this.popoverContent = div$1();
58640
+ this.popover.appendChild(this.popoverContent);
58641
+ makeDraggable$1(this.popover, header);
58642
+ header.addEventListener('click', e => {
58643
+ e.stopPropagation();
58644
+ e.preventDefault(); // absorb click to prevent it leaking through to parent DOM element
58645
+ });
58646
+ this.hide();
58647
+ };
58648
+
58649
+ MenuPopup.prototype.hide = function () {
58650
+ this.popover.style.display = 'none';
58651
+ };
58652
+
58653
+ MenuPopup.prototype.presentMenuList = function (menuList) {
58654
+ hideAllMenuPopups();
58655
+
58656
+ if (menuList.length > 0) {
58657
+ this.popoverContent.innerHTML = '';
58658
+ menuList = MenuUtils.trackMenuItemListHelper(menuList, this);
58659
+
58660
+ for (let item of menuList) {
58661
+ if (item.init) {
58662
+ item.init();
58663
+ }
58664
+
58665
+ let $e = item.object;
58666
+
58667
+ if (0 === menuList.indexOf(item)) {
58668
+ $e.removeClass('igv-track-menu-border-top');
58669
+ }
58670
+
58671
+ if ($e.hasClass('igv-track-menu-border-top') || $e.hasClass('igv-menu-popup-check-container')) ; else if ($e.is('div')) {
58672
+ $e.addClass('igv-menu-popup-shim');
58673
+ }
58674
+
58675
+ this.popoverContent.appendChild($e.get(0));
58676
+ } // NOTE: style.display most NOT be 'none' when calculating width. a display = 'none' will always
58677
+ // yield a width of zero (0).
58678
+
58679
+
58680
+ this.popover.style.display = 'flex';
58681
+ const {
58682
+ width
58683
+ } = this.popover.getBoundingClientRect();
58684
+ this.popover.style.left = `${-width}px`;
58685
+ this.popover.style.top = `${0}px`;
58686
+ }
58687
+ };
58688
+
58689
+ MenuPopup.prototype.presentTrackContextMenu = function (e, menuItems) {
58690
+ this.popoverContent.innerHTML = '';
58691
+ const menuElements = createMenuElements(menuItems, this.popover);
58692
+
58693
+ for (let {
58694
+ el
58695
+ } of menuElements) {
58696
+ this.popoverContent.appendChild(el);
58697
+ }
58698
+
58699
+ present(e, this.popover);
58700
+ };
58701
+
58702
+ MenuPopup.prototype.dispose = function () {
58703
+ this.popoverContent.innerHTML = '';
58704
+ this.popover.innerHTML = '';
58705
+ Object.keys(this).forEach(function (key) {
58706
+ this[key] = undefined;
58707
+ });
58708
+ };
58709
+
58710
+ function createMenuElements(itemList, popover) {
58711
+ return itemList.map(item => {
58712
+ let el;
58713
+
58714
+ if (typeof item === 'string' && '<hr/>' === item) {
58715
+ el = document.createElement('hr');
58716
+ } else if (typeof item === 'string') {
58717
+ el = div$1({
58718
+ class: 'context-menu'
58719
+ });
58720
+ el.innerHTML = item;
58721
+ } else if (typeof item === 'Node') {
58722
+ el = item;
58723
+ } else {
58724
+ if (typeof item.init === 'function') {
58725
+ item.init();
58726
+ }
58727
+
58728
+ if ("checkbox" === item.type) {
58729
+ el = createCheckbox$1("Show all bases", item.value);
58730
+ } else if ("color" === item.type) {
58731
+ const colorPicker = new GenericColorPicker({
58732
+ parent: popover.parentElement,
58733
+ width: 364
58734
+ });
58735
+ colorPicker.configure(undefined, {
58736
+ color: color => item.click(color)
58737
+ });
58738
+ el = div$1({
58739
+ class: 'context-menu'
58740
+ });
58741
+
58742
+ if (typeof item.label === 'string') {
58743
+ el.innerHTML = item.label;
58744
+ }
58745
+
58746
+ const clickHandler = e => {
58747
+ colorPicker.show();
58748
+ hide$1(popover);
58749
+ e.preventDefault();
58750
+ e.stopPropagation();
58751
+ };
58752
+
58753
+ el.addEventListener('click', clickHandler);
58754
+ el.addEventListener('touchend', clickHandler);
58755
+ el.addEventListener('mouseup', function (e) {
58756
+ e.preventDefault();
58757
+ e.stopPropagation();
58758
+ });
58759
+ } else {
58760
+ el = div$1({
58761
+ class: 'context-menu'
58762
+ });
58763
+
58764
+ if (typeof item.label === 'string') {
58765
+ el.innerHTML = item.label;
58766
+ }
58767
+ }
58768
+
58769
+ if (item.click && "color" !== item.type) {
58770
+ el.addEventListener('click', handleClick);
58771
+ el.addEventListener('touchend', handleClick);
58772
+ el.addEventListener('mouseup', function (e) {
58773
+ e.preventDefault();
58774
+ e.stopPropagation();
58775
+ }); // eslint-disable-next-line no-inner-declarations
58776
+
58777
+ function handleClick(e) {
58778
+ item.click();
58779
+ hide$1(popover);
58780
+ e.preventDefault();
58781
+ e.stopPropagation();
58782
+ }
58783
+ }
58784
+ }
58785
+
58786
+ return {
58787
+ el,
58788
+ init: item.init
58789
+ };
58790
+ });
58791
+ }
58792
+
58793
+ function present(e, popover) {
58794
+ // NOTE: style.display most NOT be 'none' when calculating width. a display = 'none' will always
58795
+ // yield a width of zero (0).
58796
+ popover.style.display = 'flex';
58797
+ const {
58798
+ x,
58799
+ y
58800
+ } = translateMouseCoordinates$1(e, popover.parentNode);
58801
+ const {
58802
+ width
58803
+ } = popover.getBoundingClientRect();
58804
+ const xmax = x + width;
58805
+ const {
58806
+ width: parentWidth
58807
+ } = popover.parentNode.getBoundingClientRect();
58808
+ popover.style.left = `${xmax > parentWidth ? x - (xmax - parentWidth) : x}px`;
58809
+ popover.style.top = `${y}px`;
58810
+ }
58811
+
58812
+ const hideAllMenuPopups = () => {
58813
+ const menus = document.querySelectorAll('.igv-menu-popup');
58814
+
58815
+ for (let i = 0; i < menus.length; i++) {
58816
+ menus[i].style.display = 'none';
58817
+ }
58818
+ };
58819
+
58820
+ /*
58821
+ * The MIT License (MIT)
58822
+ *
58823
+ * Copyright (c) 2014 Broad Institute
58824
+ *
58825
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
58826
+ * of this software and associated documentation files (the "Software"), to deal
58827
+ * in the Software without restriction, including without limitation the rights
58828
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
58829
+ * copies of the Software, and to permit persons to whom the Software is
58830
+ * furnished to do so, subject to the following conditions:
58831
+ *
58832
+ * The above copyright notice and this permission notice shall be included in
58833
+ * all copies or substantial portions of the Software.
58834
+ *
58835
+ *
58836
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
58837
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
58838
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
58839
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
58840
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
58841
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
58842
+ * THE SOFTWARE.
58843
+ */
58915
58844
  const scrollbarExclusionTypes = new Set(['ruler', 'sequence', 'ideogram']);
58916
58845
  const colorPickerExclusionTypes = new Set(['ruler', 'sequence', 'ideogram']);
58917
58846
 
@@ -59077,11 +59006,11 @@
59077
59006
  const trackColors = [];
59078
59007
  const color = this.track.color || this.track.defaultColor;
59079
59008
 
59080
- if (isString$3(color)) {
59009
+ if (isString$2(color)) {
59081
59010
  trackColors.push(color);
59082
59011
  }
59083
59012
 
59084
- if (this.track.altColor && isString$3(this.track.altColor)) {
59013
+ if (this.track.altColor && isString$2(this.track.altColor)) {
59085
59014
  trackColors.push(this.track.altColor);
59086
59015
  }
59087
59016
 
@@ -60368,7 +60297,7 @@
60368
60297
  for (let fd of featureData) {
60369
60298
  data.push(fd);
60370
60299
 
60371
- if (infoURL && fd.name && fd.name.toLowerCase() === "name" && fd.value && isString$3(fd.value) && !fd.value.startsWith("<")) {
60300
+ if (infoURL && fd.name && fd.name.toLowerCase() === "name" && fd.value && isString$2(fd.value) && !fd.value.startsWith("<")) {
60372
60301
  const href = infoURL.replace("$$", feature.name);
60373
60302
  fd.value = `<a target=_blank href=${href}>${fd.value}</a>`;
60374
60303
  }
@@ -60468,7 +60397,7 @@
60468
60397
  seq = reverseComplementSequence(seq);
60469
60398
  }
60470
60399
 
60471
- Alert.presentAlert(seq);
60400
+ this.browser.alert.present(seq);
60472
60401
  }
60473
60402
  }];
60474
60403
 
@@ -60488,7 +60417,7 @@
60488
60417
  await navigator.clipboard.writeText(seq);
60489
60418
  } catch (e) {
60490
60419
  console.error(e);
60491
- Alert.presentAlert(`error copying sequence to clipboard ${e}`);
60420
+ this.browser.alert.present(`error copying sequence to clipboard ${e}`);
60492
60421
  }
60493
60422
  }
60494
60423
  });
@@ -60637,6 +60566,7 @@
60637
60566
  start,
60638
60567
  end,
60639
60568
  bpPerPixel,
60569
+ visibilityWindow: this.visibilityWindow,
60640
60570
  windowFunction: this.windowFunction
60641
60571
  });
60642
60572
 
@@ -60663,6 +60593,7 @@
60663
60593
  let items = [];
60664
60594
 
60665
60595
  if (this.flipAxis !== undefined) {
60596
+ items.push('<hr>');
60666
60597
  items.push({
60667
60598
  label: "Flip y-axis",
60668
60599
  click: () => {
@@ -61502,6 +61433,7 @@
61502
61433
  this.type = "merged";
61503
61434
  this.featureType = 'numeric';
61504
61435
  this.paintAxis = paintAxis;
61436
+ this.graphType = config.graphType;
61505
61437
  }
61506
61438
 
61507
61439
  init(config) {
@@ -61603,7 +61535,11 @@
61603
61535
  this.tracks[i].dataRange = this.dataRange;
61604
61536
  this.tracks[i].flipAxis = this.flipAxis;
61605
61537
  this.tracks[i].logScale = this.logScale;
61606
- this.tracks[i].graphType = this.graphType;
61538
+
61539
+ if (this.graphType) {
61540
+ this.tracks[i].graphType = this.graphType;
61541
+ }
61542
+
61607
61543
  this.tracks[i].draw(trackOptions);
61608
61544
  }
61609
61545
  }
@@ -61627,7 +61563,7 @@
61627
61563
  }
61628
61564
 
61629
61565
  get supportsWholeGenome() {
61630
- return this.tracks.every(track => track.supportsWholeGenome());
61566
+ return this.tracks.every(track => track.supportsWholeGenome);
61631
61567
  }
61632
61568
 
61633
61569
  }
@@ -61744,8 +61680,13 @@
61744
61680
  } // Create the FeatureSource and override the default whole genome method
61745
61681
 
61746
61682
 
61747
- this.featureSource = FeatureSource(config, this.browser.genome);
61748
- this.featureSource.getWGFeatures = getWGFeatures;
61683
+ if (config.featureSource) {
61684
+ this.featureSource = config.featureSource;
61685
+ delete config._featureSource;
61686
+ } else {
61687
+ this.featureSource = FeatureSource(config, this.browser.genome);
61688
+ this.featureSource.getWGFeatures = getWGFeatures;
61689
+ }
61749
61690
  }
61750
61691
 
61751
61692
  async postInit() {
@@ -61821,10 +61762,16 @@
61821
61762
  for (let feature of featureList) {
61822
61763
  // Reset transient property drawState. An undefined value => feature has not been drawn.
61823
61764
  feature.drawState = undefined;
61824
- let color = this.color || feature.color || DEFAULT_ARC_COLOR;
61765
+ let color;
61825
61766
 
61826
- if (color && this.config.useScore) {
61827
- color = getAlphaColor(color, scoreShade(feature.score));
61767
+ if (typeof this.color === 'function') {
61768
+ color = this.color(feature);
61769
+ } else {
61770
+ color = this.color || feature.color || DEFAULT_ARC_COLOR;
61771
+
61772
+ if (color && this.config.useScore) {
61773
+ color = getAlphaColor(color, scoreShade(feature.score));
61774
+ }
61828
61775
  }
61829
61776
 
61830
61777
  ctx.lineWidth = feature.thickness || this.thickness || 1;
@@ -62140,14 +62087,10 @@
62140
62087
  }
62141
62088
 
62142
62089
  menuItemList() {
62143
- let items = [{
62144
- name: "Set track color",
62145
- click: () => {
62146
- this.trackView.presentColorPicker();
62147
- }
62148
- }, '<hr/>'];
62090
+ let items = [];
62149
62091
 
62150
62092
  if (this.hasValue) {
62093
+ items.push("<hr/>");
62151
62094
  const lut = {
62152
62095
  "nested": "Nested",
62153
62096
  "proportional": "Proportional - All",
@@ -62611,7 +62554,32 @@
62611
62554
  }
62612
62555
  }
62613
62556
 
62614
- const isString = isString$3;
62557
+ /*
62558
+ * The MIT License (MIT)
62559
+ *
62560
+ * Copyright (c) 2016 University of California San Diego
62561
+ * Author: Jim Robinson
62562
+ *
62563
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
62564
+ * of this software and associated documentation files (the "Software"), to deal
62565
+ * in the Software without restriction, including without limitation the rights
62566
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
62567
+ * copies of the Software, and to permit persons to whom the Software is
62568
+ * furnished to do so, subject to the following conditions:
62569
+ *
62570
+ * The above copyright notice and this permission notice shall be included in
62571
+ * all copies or substantial portions of the Software.
62572
+ *
62573
+ *
62574
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
62575
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
62576
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
62577
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
62578
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
62579
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
62580
+ * THE SOFTWARE.
62581
+ */
62582
+ const isString = isString$2;
62615
62583
  const DEFAULT_VISIBILITY_WINDOW = 1000000;
62616
62584
  const TOP_MARGIN = 10;
62617
62585
  const STANDARD_FIELDS = new Map([["REF", "referenceBases"], ["ALT", "alternateBases"], ["QUAL", "quality"], ["FILTER", "filter"]]);
@@ -64892,6 +64860,30 @@
64892
64860
  }
64893
64861
  }
64894
64862
 
64863
+ /*
64864
+ * The MIT License (MIT)
64865
+ *
64866
+ * Copyright (c) 2014 Broad Institute
64867
+ *
64868
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
64869
+ * of this software and associated documentation files (the "Software"), to deal
64870
+ * in the Software without restriction, including without limitation the rights
64871
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
64872
+ * copies of the Software, and to permit persons to whom the Software is
64873
+ * furnished to do so, subject to the following conditions:
64874
+ *
64875
+ * The above copyright notice and this permission notice shall be included in
64876
+ * all copies or substantial portions of the Software.
64877
+ *
64878
+ *
64879
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
64880
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
64881
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
64882
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
64883
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
64884
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
64885
+ * THE SOFTWARE.
64886
+ */
64895
64887
  let JUNCTION_MOTIF_PALETTE = new PaletteColorTable("Dark2"); // Lock in color-to-motif mapping so it's independent of data loading order. This list may not include all possible
64896
64888
  // motif values as this varies depending on the RNA-seq pipeline. The current list is based on STAR v2.4 docs.
64897
64889
 
@@ -68328,7 +68320,7 @@
68328
68320
  class: 'igv-container'
68329
68321
  });
68330
68322
  parentDiv.appendChild(this.root);
68331
- Alert.init(this.root);
68323
+ this.alert = new Alert(this.root);
68332
68324
  this.columnContainer = div$1({
68333
68325
  class: 'igv-column-container'
68334
68326
  });
@@ -68495,7 +68487,7 @@
68495
68487
 
68496
68488
  this.inputDialog = new InputDialog(this.root);
68497
68489
  this.inputDialog.container.id = `igv-input-dialog-${guid$2()}`;
68498
- this.dataRangeDialog = new DataRangeDialog($$1(this.root));
68490
+ this.dataRangeDialog = new DataRangeDialog(this, $$1(this.root));
68499
68491
  this.dataRangeDialog.$container.get(0).id = `igv-data-range-dialog-${guid$2()}`;
68500
68492
  this.genericColorPicker = new GenericColorPicker({
68501
68493
  parent: this.columnContainer,
@@ -68683,7 +68675,7 @@
68683
68675
  createColumn(this.columnContainer, 'igv-track-drag-column'); // Track gear column
68684
68676
 
68685
68677
  createColumn(this.columnContainer, 'igv-gear-menu-column');
68686
- const genomeConfig = await GenomeUtils.expandReference(session.reference || session.genome);
68678
+ const genomeConfig = await GenomeUtils.expandReference(this.alert, session.reference || session.genome);
68687
68679
  await this.loadReference(genomeConfig, session.locus);
68688
68680
  this.centerLineList = this.createCenterLineList(this.columnContainer); // Create ideogram and ruler track. Really this belongs in browser initialization, but creation is
68689
68681
  // deferred because ideogram and ruler are treated as "tracks", and tracks require a reference frame
@@ -68862,7 +68854,7 @@
68862
68854
 
68863
68855
 
68864
68856
  async loadGenome(idOrConfig) {
68865
- const genomeConfig = await GenomeUtils.expandReference(idOrConfig);
68857
+ const genomeConfig = await GenomeUtils.expandReference(this.alert, idOrConfig);
68866
68858
  await this.loadReference(genomeConfig, undefined);
68867
68859
  const tracks = genomeConfig.tracks || []; // Insure that we always have a sequence track
68868
68860
 
@@ -68994,7 +68986,7 @@
68994
68986
 
68995
68987
  async _loadTrack(config) {
68996
68988
  // config might be json
68997
- if (isString$3(config)) {
68989
+ if (isString$2(config)) {
68998
68990
  config = JSON.parse(config);
68999
68991
  }
69000
68992
 
@@ -69055,7 +69047,7 @@
69055
69047
  }
69056
69048
 
69057
69049
  msg += ": " + config.url;
69058
- Alert.presentAlert(new Error(msg), undefined);
69050
+ this.alert.present(new Error(msg), undefined);
69059
69051
  }
69060
69052
  }
69061
69053
  /**
@@ -69124,7 +69116,7 @@
69124
69116
  // Resolve function and promise urls
69125
69117
  let url = await resolveURL(config.url);
69126
69118
 
69127
- if (isString$3(url)) {
69119
+ if (isString$2(url)) {
69128
69120
  url = url.trim();
69129
69121
  }
69130
69122
 
@@ -69192,8 +69184,7 @@
69192
69184
  const track = TrackFactory.getTrack(type, config, this);
69193
69185
 
69194
69186
  if (undefined === track) {
69195
- Alert.presentAlert(new Error(`Error creating track. Could not determine track type for file: ${config.url || config}`), undefined);
69196
- return;
69187
+ this.alert.present(new Error(`Error creating track. Could not determine track type for file: ${config.url || config}`), undefined);
69197
69188
  } else {
69198
69189
  if (config.roi && config.roi.length > 0) {
69199
69190
  track.roiSets = config.roi.map(r => new TrackROISet(r, this.genome));
@@ -69686,7 +69677,7 @@
69686
69677
  const success = await this.search(string, init);
69687
69678
 
69688
69679
  if (!success) {
69689
- Alert.presentAlert(new Error(`Unrecognized locus: <b> ${string} </b>`));
69680
+ this.alert.present(new Error(`Unrecognized locus: <b> ${string} </b>`));
69690
69681
  }
69691
69682
 
69692
69683
  return success;
@@ -69811,7 +69802,7 @@
69811
69802
 
69812
69803
  toJSON() {
69813
69804
  const json = {
69814
- "version": version()
69805
+ "version": version$1()
69815
69806
  };
69816
69807
 
69817
69808
  if (this.showSampleNames !== undefined) {
@@ -70551,7 +70542,7 @@
70551
70542
  }
70552
70543
 
70553
70544
  function embedCSS() {
70554
- var css = '.igv-navbar {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n color: #444;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n line-height: 32px;\n padding-left: 8px;\n padding-right: 8px;\n margin-top: 2px;\n margin-bottom: 6px;\n height: 32px;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: #f3f3f3;\n}\n.igv-navbar .igv-navbar-left-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-left-container .igv-logo {\n width: 34px;\n height: 32px;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-left-container .igv-current-genome {\n height: 32px;\n margin-left: 4px;\n margin-right: 4px;\n user-select: none;\n line-height: 32px;\n vertical-align: middle;\n text-align: center;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container {\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n height: 100%;\n width: 125px;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container select {\n display: block;\n cursor: pointer;\n width: 100px;\n height: 75%;\n outline: none;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n margin-left: 8px;\n height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 210px;\n height: 22px;\n line-height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container input.igv-search-input {\n cursor: text;\n width: 85%;\n height: 22px;\n line-height: 22px;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n text-align: left;\n padding-left: 8px;\n margin-right: 8px;\n outline: none;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: white;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container .igv-search-icon-container {\n cursor: pointer;\n height: 16px;\n width: 16px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-windowsize-panel-container {\n margin-left: 4px;\n user-select: none;\n}\n.igv-navbar .igv-navbar-right-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div {\n margin-left: 0;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div:last-child {\n margin-left: 0;\n margin-right: 0;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container-750 {\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:nth-child(even) {\n display: block;\n height: fit-content;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget input {\n display: block;\n width: 125px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:nth-child(even) {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 input {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-hidden {\n display: none;\n}\n\n.igv-navbar-button {\n display: block;\n box-sizing: unset;\n padding-left: 6px;\n padding-right: 6px;\n height: 18px;\n text-transform: capitalize;\n user-select: none;\n line-height: 18px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 11px;\n font-weight: 200;\n color: #737373;\n background-color: #f3f3f3;\n border-color: #737373;\n border-style: solid;\n border-width: thin;\n border-radius: 6px;\n}\n\n.igv-navbar-button-clicked {\n color: white;\n background-color: #737373;\n}\n\n.igv-navbar-button:hover {\n cursor: pointer;\n}\n\n.igv-zoom-in-notice-container {\n z-index: 1024;\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n background-color: white;\n}\n.igv-zoom-in-notice-container > div {\n padding-left: 4px;\n padding-right: 4px;\n padding-top: 2px;\n padding-bottom: 2px;\n width: 100%;\n height: 100%;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: #3f3f3f;\n}\n\n.igv-zoom-in-notice {\n position: absolute;\n top: 10px;\n left: 50%;\n}\n.igv-zoom-in-notice div {\n position: relative;\n left: -50%;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #3f3f3f;\n background-color: rgba(255, 255, 255, 0.51);\n z-index: 64;\n}\n\n.igv-container-spinner {\n position: absolute;\n top: 90%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1024;\n width: 24px;\n height: 24px;\n pointer-events: none;\n color: #737373;\n}\n\n.igv-multi-locus-close-button {\n position: absolute;\n top: 2px;\n right: 0;\n padding-left: 2px;\n padding-right: 2px;\n width: 18px;\n height: 18px;\n color: #666666;\n background-color: white;\n z-index: 1000;\n}\n.igv-multi-locus-close-button > svg {\n vertical-align: top;\n}\n\n.igv-multi-locus-close-button:hover {\n cursor: pointer;\n color: #434343;\n}\n\n.igv-multi-locus-ruler-label {\n z-index: 64;\n position: absolute;\n top: 2px;\n left: 0;\n width: 100%;\n height: 14px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-multi-locus-ruler-label div {\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n\n.igv-multi-locus-ruler-label-square-dot {\n z-index: 64;\n position: absolute;\n left: 50%;\n top: 5%;\n transform: translate(-50%, 0%);\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-multi-locus-ruler-label-square-dot > div:first-child {\n width: 14px;\n height: 14px;\n}\n.igv-multi-locus-ruler-label-square-dot > div:last-child {\n margin-left: 16px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n}\n\n.igv-multi-locus-ruler-label:hover {\n cursor: pointer;\n}\n\n.igv-ruler-sweeper {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 26px;\n bottom: 0;\n left: 0;\n width: 0;\n z-index: 99999;\n background-color: rgba(68, 134, 247, 0.25);\n}\n\n.igv-ruler-tooltip {\n pointer-events: none;\n z-index: 128;\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 32px;\n background-color: transparent;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-ruler-tooltip > div {\n pointer-events: none;\n width: 128px;\n height: auto;\n padding: 1px;\n color: #373737;\n font-size: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n background-color: white;\n border-style: solid;\n border-width: thin;\n border-color: #373737;\n}\n\n.igv-track-label {\n position: absolute;\n left: 8px;\n top: 8px;\n width: auto;\n height: auto;\n max-width: 200px;\n padding-left: 4px;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n text-align: center;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-color: #444;\n border-radius: 2px;\n border-style: solid;\n border-width: thin;\n background-color: white;\n z-index: 128;\n cursor: pointer;\n}\n\n.igv-track-label:hover,\n.igv-track-label:focus,\n.igv-track-label:active {\n background-color: #e8e8e8;\n}\n\n.igv-track-label-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n}\n\n.igv-center-line {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: 8;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-left-style: dashed;\n border-left-width: thin;\n border-right-style: dashed;\n border-right-width: thin;\n}\n\n.igv-center-line-wide {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(127, 127, 127, 0.51);\n}\n\n.igv-center-line-thin {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(0, 0, 0, 0);\n}\n\n.igv-cursor-guide-horizontal {\n display: none;\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n height: 1px;\n z-index: 1;\n margin-left: 50px;\n margin-right: 54px;\n border-top-style: dotted;\n border-top-width: thin;\n border-top-color: rgba(127, 127, 127, 0.76);\n}\n\n.igv-cursor-guide-vertical {\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n z-index: 1;\n border-left-style: dotted;\n border-left-width: thin;\n border-left-color: rgba(127, 127, 127, 0.76);\n display: none;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-generic-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 300px;\n height: 200px;\n border-color: #7F7F7F;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n z-index: 2048;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-generic-dialog-container .igv-generic-dialog-one-liner {\n color: #373737;\n width: 95%;\n height: 24px;\n line-height: 24px;\n text-align: left;\n margin-top: 8px;\n padding-left: 8px;\n overflow-wrap: break-word;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input {\n margin-top: 8px;\n width: 95%;\n height: 24px;\n color: #373737;\n line-height: 24px;\n padding-left: 8px;\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input div {\n width: 30%;\n height: 100%;\n font-size: 16px;\n text-align: right;\n padding-right: 8px;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n width: 50%;\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input {\n margin-top: 8px;\n width: calc(100% - 16px);\n height: 24px;\n color: #373737;\n line-height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel {\n width: 100%;\n height: 28px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div {\n margin-top: 32px;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n width: 75px;\n height: 28px;\n line-height: 28px;\n text-align: center;\n border-color: transparent;\n border-style: solid;\n border-width: thin;\n border-radius: 2px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child {\n margin-left: 32px;\n margin-right: 0;\n background-color: #5ea4e0;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child {\n margin-left: 0;\n margin-right: 32px;\n background-color: #c4c4c4;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child:hover {\n cursor: pointer;\n background-color: #3b5c7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child:hover {\n cursor: pointer;\n background-color: #7f7f7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok {\n width: 100%;\n height: 36px;\n margin-top: 32px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div {\n width: 98px;\n height: 36px;\n line-height: 36px;\n text-align: center;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n border-color: white;\n border-style: solid;\n border-width: thin;\n border-radius: 4px;\n background-color: #2B81AF;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div:hover {\n cursor: pointer;\n background-color: #25597f;\n}\n\n.igv-generic-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2048;\n background-color: white;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-container div:first-child {\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n height: 24px;\n width: 100%;\n background-color: #dddddd;\n}\n.igv-generic-container div:first-child i {\n display: block;\n color: #5f5f5f;\n cursor: pointer;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n margin-bottom: 4px;\n}\n\n.igv-menu-popup {\n position: absolute;\n top: 0;\n left: 0;\n width: max-content;\n z-index: 4096;\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background: white;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-end;\n text-align: left;\n}\n.igv-menu-popup > div:not(:first-child) {\n width: 100%;\n}\n.igv-menu-popup > div:not(:first-child) > div {\n background: white;\n}\n.igv-menu-popup > div:not(:first-child) > div.context-menu {\n padding-left: 4px;\n padding-right: 4px;\n}\n.igv-menu-popup > div:not(:first-child) > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-menu-popup > div:not(:first-child) > div:hover {\n background: #efefef;\n}\n\n.igv-menu-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 1px;\n padding-top: 1px;\n}\n\n.igv-menu-popup-header {\n position: relative;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-menu-popup-header div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-menu-popup-header div:hover {\n cursor: pointer;\n color: #444;\n}\n\n.igv-menu-popup-check-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n height: 20px;\n margin-right: 4px;\n background-color: transparent;\n}\n.igv-menu-popup-check-container div {\n padding-top: 2px;\n padding-left: 8px;\n}\n.igv-menu-popup-check-container div:first-child {\n position: relative;\n width: 12px;\n height: 12px;\n}\n.igv-menu-popup-check-container div:first-child svg {\n position: absolute;\n width: 12px;\n height: 12px;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-loading-spinner-container {\n z-index: 1024;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 32px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-loading-spinner-container > div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 4px solid rgba(128, 128, 128, 0.5);\n border-top-color: rgb(255, 255, 255);\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n}\n\n@keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n\n transform: rotate(360deg); } }\n.igv-roi-menu-next-gen {\n position: absolute;\n z-index: 512;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background-color: white;\n width: 192px;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch; }\n .igv-roi-menu-next-gen > div:first-child {\n height: 24px;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center; }\n .igv-roi-menu-next-gen > div:first-child > div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F; }\n .igv-roi-menu-next-gen > div:first-child > div:hover {\n cursor: pointer;\n color: #444; }\n .igv-roi-menu-next-gen > div:last-child {\n background-color: white;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n text-align: start;\n vertical-align: middle;\n cursor: pointer; }\n .igv-roi-menu-next-gen > div:last-child > div {\n height: 24px;\n padding-left: 4px;\n border-bottom-style: solid;\n border-bottom-width: thin;\n border-bottom-color: #7f7f7f; }\n .igv-roi-menu-next-gen > div:last-child > div:not(:first-child):hover {\n background-color: rgba(127, 127, 127, 0.1); }\n .igv-roi-menu-next-gen > div:last-child div:first-child {\n cursor: default;\n font-style: italic;\n text-align: center;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis; }\n .igv-roi-menu-next-gen > div:last-child > div:last-child {\n border-bottom-width: 0;\n border-bottom-color: transparent; }\n\n.igv-roi-placeholder {\n font-style: normal;\n color: rgba(75, 75, 75, 0.6); }\n\n\n.igv-roi-table {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(1) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(2) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(3) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(4) {\n width: 30%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(5) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\n min-width: 512px;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(1) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(2) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(3) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(4) {\n width: 30%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(5) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-four-column {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table-four-column > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table-four-column > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table-four-column > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table-four-column > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table-four-column > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table-four-column > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(1) {\n width: 25%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(2) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(3) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(4) {\n width: 35%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\n min-width: 512px;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(1) {\n width: 25%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(2) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(3) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(4) {\n width: 35%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table-four-column > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n cursor: pointer;\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n cursor: pointer;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
70545
+ var css = '.igv-navbar {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n color: #444;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n line-height: 32px;\n padding-left: 8px;\n padding-right: 8px;\n margin-top: 2px;\n margin-bottom: 6px;\n height: 32px;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: #f3f3f3;\n}\n.igv-navbar .igv-navbar-left-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-left-container .igv-logo {\n width: 34px;\n height: 32px;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-left-container .igv-current-genome {\n height: 32px;\n margin-left: 4px;\n margin-right: 4px;\n user-select: none;\n line-height: 32px;\n vertical-align: middle;\n text-align: center;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container {\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n height: 100%;\n width: 125px;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container select {\n display: block;\n cursor: pointer;\n width: 100px;\n height: 75%;\n outline: none;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n margin-left: 8px;\n height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 210px;\n height: 22px;\n line-height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container input.igv-search-input {\n cursor: text;\n width: 85%;\n height: 22px;\n line-height: 22px;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n text-align: left;\n padding-left: 8px;\n margin-right: 8px;\n outline: none;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: white;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container .igv-search-icon-container {\n cursor: pointer;\n height: 16px;\n width: 16px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-windowsize-panel-container {\n margin-left: 4px;\n user-select: none;\n}\n.igv-navbar .igv-navbar-right-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div {\n margin-left: 0;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div:last-child {\n margin-left: 0;\n margin-right: 0;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container-750 {\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:nth-child(even) {\n display: block;\n height: fit-content;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget input {\n display: block;\n width: 125px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:nth-child(even) {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 input {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-hidden {\n display: none;\n}\n\n.igv-navbar-button {\n display: block;\n box-sizing: unset;\n padding-left: 6px;\n padding-right: 6px;\n height: 18px;\n text-transform: capitalize;\n user-select: none;\n line-height: 18px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 11px;\n font-weight: 200;\n color: #737373;\n background-color: #f3f3f3;\n border-color: #737373;\n border-style: solid;\n border-width: thin;\n border-radius: 6px;\n}\n\n.igv-navbar-button-clicked {\n color: white;\n background-color: #737373;\n}\n\n.igv-navbar-button:hover {\n cursor: pointer;\n}\n\n.igv-zoom-in-notice-container {\n z-index: 1024;\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n background-color: white;\n}\n.igv-zoom-in-notice-container > div {\n padding-left: 4px;\n padding-right: 4px;\n padding-top: 2px;\n padding-bottom: 2px;\n width: 100%;\n height: 100%;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: #3f3f3f;\n}\n\n.igv-zoom-in-notice {\n position: absolute;\n top: 10px;\n left: 50%;\n}\n.igv-zoom-in-notice div {\n position: relative;\n left: -50%;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #3f3f3f;\n background-color: rgba(255, 255, 255, 0.51);\n z-index: 64;\n}\n\n.igv-container-spinner {\n position: absolute;\n top: 90%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1024;\n width: 24px;\n height: 24px;\n pointer-events: none;\n color: #737373;\n}\n\n.igv-multi-locus-close-button {\n position: absolute;\n top: 2px;\n right: 0;\n padding-left: 2px;\n padding-right: 2px;\n width: 18px;\n height: 18px;\n color: #666666;\n background-color: white;\n z-index: 1000;\n}\n.igv-multi-locus-close-button > svg {\n vertical-align: top;\n}\n\n.igv-multi-locus-close-button:hover {\n cursor: pointer;\n color: #434343;\n}\n\n.igv-multi-locus-ruler-label {\n z-index: 64;\n position: absolute;\n top: 2px;\n left: 0;\n width: 100%;\n height: 14px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-multi-locus-ruler-label div {\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n\n.igv-multi-locus-ruler-label-square-dot {\n z-index: 64;\n position: absolute;\n left: 50%;\n top: 5%;\n transform: translate(-50%, 0%);\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-multi-locus-ruler-label-square-dot > div:first-child {\n width: 14px;\n height: 14px;\n}\n.igv-multi-locus-ruler-label-square-dot > div:last-child {\n margin-left: 16px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n}\n\n.igv-multi-locus-ruler-label:hover {\n cursor: pointer;\n}\n\n.igv-ruler-sweeper {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 26px;\n bottom: 0;\n left: 0;\n width: 0;\n z-index: 99999;\n background-color: rgba(68, 134, 247, 0.25);\n}\n\n.igv-ruler-tooltip {\n pointer-events: none;\n z-index: 128;\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 32px;\n background-color: transparent;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-ruler-tooltip > div {\n pointer-events: none;\n width: 128px;\n height: auto;\n padding: 1px;\n color: #373737;\n font-size: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n background-color: white;\n border-style: solid;\n border-width: thin;\n border-color: #373737;\n}\n\n.igv-track-label {\n position: absolute;\n left: 8px;\n top: 8px;\n width: auto;\n height: auto;\n max-width: 200px;\n padding-left: 4px;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n text-align: center;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-color: #444;\n border-radius: 2px;\n border-style: solid;\n border-width: thin;\n background-color: white;\n z-index: 128;\n cursor: pointer;\n}\n\n.igv-track-label:hover,\n.igv-track-label:focus,\n.igv-track-label:active {\n background-color: #e8e8e8;\n}\n\n.igv-track-label-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n}\n\n.igv-center-line {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: 8;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-left-style: dashed;\n border-left-width: thin;\n border-right-style: dashed;\n border-right-width: thin;\n}\n\n.igv-center-line-wide {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(127, 127, 127, 0.51);\n}\n\n.igv-center-line-thin {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(0, 0, 0, 0);\n}\n\n.igv-cursor-guide-horizontal {\n display: none;\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n height: 1px;\n z-index: 1;\n margin-left: 50px;\n margin-right: 54px;\n border-top-style: dotted;\n border-top-width: thin;\n border-top-color: rgba(127, 127, 127, 0.76);\n}\n\n.igv-cursor-guide-vertical {\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n z-index: 1;\n border-left-style: dotted;\n border-left-width: thin;\n border-left-color: rgba(127, 127, 127, 0.76);\n display: none;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-generic-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 300px;\n height: 200px;\n border-color: #7F7F7F;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n z-index: 2048;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-generic-dialog-container .igv-generic-dialog-one-liner {\n color: #373737;\n width: 95%;\n height: 24px;\n line-height: 24px;\n text-align: left;\n margin-top: 8px;\n padding-left: 8px;\n overflow-wrap: break-word;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input {\n margin-top: 8px;\n width: 95%;\n height: 24px;\n color: #373737;\n line-height: 24px;\n padding-left: 8px;\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input div {\n width: 30%;\n height: 100%;\n font-size: 16px;\n text-align: right;\n padding-right: 8px;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n width: 50%;\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input {\n margin-top: 8px;\n width: calc(100% - 16px);\n height: 24px;\n color: #373737;\n line-height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel {\n width: 100%;\n height: 28px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div {\n margin-top: 32px;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n width: 75px;\n height: 28px;\n line-height: 28px;\n text-align: center;\n border-color: transparent;\n border-style: solid;\n border-width: thin;\n border-radius: 2px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child {\n margin-left: 32px;\n margin-right: 0;\n background-color: #5ea4e0;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child {\n margin-left: 0;\n margin-right: 32px;\n background-color: #c4c4c4;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child:hover {\n cursor: pointer;\n background-color: #3b5c7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child:hover {\n cursor: pointer;\n background-color: #7f7f7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok {\n width: 100%;\n height: 36px;\n margin-top: 32px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div {\n width: 98px;\n height: 36px;\n line-height: 36px;\n text-align: center;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n border-color: white;\n border-style: solid;\n border-width: thin;\n border-radius: 4px;\n background-color: #2B81AF;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div:hover {\n cursor: pointer;\n background-color: #25597f;\n}\n\n.igv-generic-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2048;\n background-color: white;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-container div:first-child {\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n height: 24px;\n width: 100%;\n background-color: #dddddd;\n}\n.igv-generic-container div:first-child i {\n display: block;\n color: #5f5f5f;\n cursor: pointer;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n margin-bottom: 4px;\n}\n\n.igv-menu-popup {\n position: absolute;\n top: 0;\n left: 0;\n width: max-content;\n z-index: 4096;\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background: white;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-end;\n text-align: left;\n}\n.igv-menu-popup > div:not(:first-child) {\n width: 100%;\n}\n.igv-menu-popup > div:not(:first-child) > div {\n background: white;\n}\n.igv-menu-popup > div:not(:first-child) > div.context-menu {\n padding-left: 4px;\n padding-right: 4px;\n}\n.igv-menu-popup > div:not(:first-child) > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-menu-popup > div:not(:first-child) > div:hover {\n background: #efefef;\n}\n\n.igv-menu-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 1px;\n padding-top: 1px;\n}\n\n.igv-menu-popup-header {\n position: relative;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-menu-popup-header div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-menu-popup-header div:hover {\n cursor: pointer;\n color: #444;\n}\n\n.igv-menu-popup-check-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n height: 20px;\n margin-right: 4px;\n background-color: transparent;\n}\n.igv-menu-popup-check-container div {\n padding-top: 2px;\n padding-left: 8px;\n}\n.igv-menu-popup-check-container div:first-child {\n position: relative;\n width: 12px;\n height: 12px;\n}\n.igv-menu-popup-check-container div:first-child svg {\n position: absolute;\n width: 12px;\n height: 12px;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-loading-spinner-container {\n z-index: 1024;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 32px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-loading-spinner-container > div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 4px solid rgba(128, 128, 128, 0.5);\n border-top-color: rgb(255, 255, 255);\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n}\n\n@keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.igv-roi-menu-next-gen {\n position: absolute;\n z-index: 512;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background-color: white;\n width: 192px;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu-next-gen > div:first-child {\n height: 24px;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-roi-menu-next-gen > div:first-child > div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-roi-menu-next-gen > div:first-child > div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-menu-next-gen > div:last-child {\n background-color: white;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n text-align: start;\n vertical-align: middle;\n cursor: pointer;\n}\n.igv-roi-menu-next-gen > div:last-child > div {\n height: 24px;\n padding-left: 4px;\n border-bottom-style: solid;\n border-bottom-width: thin;\n border-bottom-color: #7f7f7f;\n}\n.igv-roi-menu-next-gen > div:last-child > div:not(:first-child):hover {\n background-color: rgba(127, 127, 127, 0.1);\n}\n.igv-roi-menu-next-gen > div:last-child div:first-child {\n cursor: default;\n font-style: italic;\n text-align: center;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-menu-next-gen > div:last-child > div:last-child {\n border-bottom-width: 0;\n border-bottom-color: transparent;\n}\n\n.igv-roi-placeholder {\n font-style: normal;\n color: rgba(75, 75, 75, 0.6);\n}\n\n.igv-roi-table {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(1) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(2) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(3) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(4) {\n width: 30%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(5) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\n min-width: 512px;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(1) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(2) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(3) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(4) {\n width: 30%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(5) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-four-column {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table-four-column > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table-four-column > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table-four-column > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table-four-column > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table-four-column > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table-four-column > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(1) {\n width: 25%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(2) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(3) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(4) {\n width: 35%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\n min-width: 512px;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(1) {\n width: 25%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(2) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(3) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(4) {\n width: 35%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table-four-column > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n cursor: pointer;\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n cursor: pointer;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
70555
70546
  var style = document.createElement('style');
70556
70547
  style.setAttribute('type', 'text/css');
70557
70548
  style.innerHTML = css;
@@ -70582,7 +70573,7 @@
70582
70573
  setGoogleOauthToken,
70583
70574
  setOauthToken,
70584
70575
  oauth,
70585
- version,
70576
+ version: version$1,
70586
70577
  setApiKey,
70587
70578
  doAutoscale,
70588
70579
  TrackView