igv 2.15.2 → 2.15.4
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/README.md +10 -10
- package/dist/igv.esm.js +381 -332
- package/dist/igv.esm.min.js +6 -6
- package/dist/igv.esm.min.js.map +1 -1
- package/dist/igv.js +381 -332
- package/dist/igv.min.js +6 -6
- package/dist/igv.min.js.map +1 -1
- package/package.json +3 -4
package/dist/igv.esm.js
CHANGED
|
@@ -18360,7 +18360,7 @@ async function getAccessToken(scope) {
|
|
|
18360
18360
|
|
|
18361
18361
|
function getScopeForURL(url) {
|
|
18362
18362
|
if (isGoogleDriveURL(url)) {
|
|
18363
|
-
return "https://www.googleapis.com/auth/drive.
|
|
18363
|
+
return "https://www.googleapis.com/auth/drive.readonly"
|
|
18364
18364
|
} else if (isGoogleStorageURL(url)) {
|
|
18365
18365
|
return "https://www.googleapis.com/auth/devstorage.read_only"
|
|
18366
18366
|
} else {
|
|
@@ -18389,7 +18389,8 @@ async function getDriveFileInfo(googleDriveURL) {
|
|
|
18389
18389
|
const response = await fetch(endPoint);
|
|
18390
18390
|
let json = await response.json();
|
|
18391
18391
|
if (json.error && json.error.code === 404) {
|
|
18392
|
-
|
|
18392
|
+
let scope = "https://www.googleapis.com/auth/drive.readonly";
|
|
18393
|
+
const access_token = await getAccessToken(scope);
|
|
18393
18394
|
if (access_token) {
|
|
18394
18395
|
const response = await fetch(endPoint, {
|
|
18395
18396
|
headers: {
|
|
@@ -18870,29 +18871,41 @@ class IGVXhr {
|
|
|
18870
18871
|
this.oauth.setToken(token, host);
|
|
18871
18872
|
}
|
|
18872
18873
|
|
|
18874
|
+
/**
|
|
18875
|
+
* Return an oauth token for the URL if we have one. This method does not force sign-in, and the token may
|
|
18876
|
+
* or may not be valid. Sign-in is triggered on request failure.
|
|
18877
|
+
* *
|
|
18878
|
+
* @param url
|
|
18879
|
+
* @returns {*}
|
|
18880
|
+
*/
|
|
18873
18881
|
getOauthToken(url) {
|
|
18874
18882
|
|
|
18875
18883
|
// Google is the default provider, don't try to parse host for google URLs
|
|
18876
18884
|
const host = isGoogleURL(url) ?
|
|
18877
18885
|
undefined :
|
|
18878
18886
|
parseUri(url).host;
|
|
18887
|
+
|
|
18888
|
+
// First check the explicit settings (i.e. token set through the API)
|
|
18879
18889
|
let token = this.oauth.getToken(host);
|
|
18880
18890
|
if (token) {
|
|
18881
18891
|
return token
|
|
18882
18892
|
} else if (host === undefined) {
|
|
18893
|
+
// Now try Google oauth tokens previously obtained. This will return undefined if google oauth is not
|
|
18894
|
+
// configured.
|
|
18883
18895
|
const googleToken = getCurrentGoogleAccessToken();
|
|
18884
18896
|
if (googleToken && googleToken.expires_at > Date.now()) {
|
|
18885
18897
|
return googleToken.access_token
|
|
18886
18898
|
}
|
|
18887
18899
|
}
|
|
18888
18900
|
}
|
|
18889
|
-
|
|
18890
18901
|
}
|
|
18891
18902
|
|
|
18892
18903
|
function isGoogleStorageSigned(url) {
|
|
18893
18904
|
return url.indexOf("X-Goog-Signature") > -1
|
|
18894
18905
|
}
|
|
18895
18906
|
|
|
18907
|
+
|
|
18908
|
+
|
|
18896
18909
|
/**
|
|
18897
18910
|
* Return a Google oAuth token, triggering a sign in if required. This method should not be called until we know
|
|
18898
18911
|
* a token is required, that is until we've tried the url and received a 401, 403, or 404.
|
|
@@ -23931,7 +23944,7 @@ const Cytoband = function (start, end, name, typestain) {
|
|
|
23931
23944
|
}
|
|
23932
23945
|
};
|
|
23933
23946
|
|
|
23934
|
-
const _version = "2.15.
|
|
23947
|
+
const _version = "2.15.4";
|
|
23935
23948
|
function version() {
|
|
23936
23949
|
return _version
|
|
23937
23950
|
}
|
|
@@ -23983,7 +23996,7 @@ const GenomeUtils = {
|
|
|
23983
23996
|
|
|
23984
23997
|
// Delay loading cytbands untils after genome initialization to use chromosome aliases (1 vs chr1, etc).
|
|
23985
23998
|
if (cytobandUrl) {
|
|
23986
|
-
genome.cytobands
|
|
23999
|
+
genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
|
|
23987
24000
|
}
|
|
23988
24001
|
|
|
23989
24002
|
return genome
|
|
@@ -24085,7 +24098,7 @@ class Genome {
|
|
|
24085
24098
|
this.sequence = sequence;
|
|
24086
24099
|
this.chromosomeNames = sequence.chromosomeNames;
|
|
24087
24100
|
this.chromosomes = sequence.chromosomes; // An object (functions as a dictionary)
|
|
24088
|
-
this.featureDB =
|
|
24101
|
+
this.featureDB = new Map(); // Hash of name -> feature, used for search function.
|
|
24089
24102
|
|
|
24090
24103
|
this.wholeGenomeView = config.wholeGenomeView === undefined || config.wholeGenomeView;
|
|
24091
24104
|
if (this.wholeGenomeView && Object.keys(sequence.chromosomes).length > 1) {
|
|
@@ -24289,6 +24302,40 @@ class Genome {
|
|
|
24289
24302
|
chr = this.getChromosomeName(chr);
|
|
24290
24303
|
return this.sequence.getSequence(chr, start, end)
|
|
24291
24304
|
}
|
|
24305
|
+
|
|
24306
|
+
addFeaturesToDB(featureList, config) {
|
|
24307
|
+
|
|
24308
|
+
const insertFeature = (name, feature) => {
|
|
24309
|
+
const current = this.featureDB.get(name);
|
|
24310
|
+
if (current) {
|
|
24311
|
+
feature = (feature.end - feature.start) > (current.end - current.start) ? feature : current;
|
|
24312
|
+
|
|
24313
|
+
}
|
|
24314
|
+
this.featureDB.set(name, feature);
|
|
24315
|
+
};
|
|
24316
|
+
|
|
24317
|
+
for (let feature of featureList) {
|
|
24318
|
+
if (feature.name) {
|
|
24319
|
+
insertFeature(feature.name.toUpperCase(), feature);
|
|
24320
|
+
}
|
|
24321
|
+
if (feature.gene && feature.gene.name) {
|
|
24322
|
+
insertFeature(feature.gene.name.toUpperCase(), feature);
|
|
24323
|
+
}
|
|
24324
|
+
|
|
24325
|
+
if (config.searchableFields) {
|
|
24326
|
+
for (let f of config.searchableFields) {
|
|
24327
|
+
const value = feature.getAttributeValue(f);
|
|
24328
|
+
if (value) {
|
|
24329
|
+
if (value.indexOf(" ") > 0) {
|
|
24330
|
+
insertFeature(value.replaceAll(" ", "+").toUpperCase(), feature);
|
|
24331
|
+
} else {
|
|
24332
|
+
insertFeature(value.toUpperCase(), feature);
|
|
24333
|
+
}
|
|
24334
|
+
}
|
|
24335
|
+
}
|
|
24336
|
+
}
|
|
24337
|
+
}
|
|
24338
|
+
}
|
|
24292
24339
|
}
|
|
24293
24340
|
|
|
24294
24341
|
async function loadCytobands(cytobandUrl, config, genome) {
|
|
@@ -27016,8 +27063,6 @@ function parseVariableStep(line) {
|
|
|
27016
27063
|
* THE SOFTWARE.
|
|
27017
27064
|
*/
|
|
27018
27065
|
|
|
27019
|
-
const DEFAULT_COLOR$1 = 'rgb(150,150,150)';
|
|
27020
|
-
|
|
27021
27066
|
const fixColor = (colorString) => {
|
|
27022
27067
|
if (isString$2(colorString)) {
|
|
27023
27068
|
return (colorString.indexOf(",") > 0 && !(colorString.startsWith("rgb(") || colorString.startsWith("rgba("))) ?
|
|
@@ -27036,6 +27081,15 @@ const fixColor = (colorString) => {
|
|
|
27036
27081
|
*/
|
|
27037
27082
|
class TrackBase {
|
|
27038
27083
|
|
|
27084
|
+
static defaults = {
|
|
27085
|
+
height: 50,
|
|
27086
|
+
color: 'rgb(0, 0, 150)',
|
|
27087
|
+
altColor: 'rgb(0, 0, 150)',
|
|
27088
|
+
autoHeight: false,
|
|
27089
|
+
visibilityWindow: undefined,
|
|
27090
|
+
supportHiDPI: true
|
|
27091
|
+
}
|
|
27092
|
+
|
|
27039
27093
|
constructor(config, browser) {
|
|
27040
27094
|
this.browser = browser;
|
|
27041
27095
|
this.init(config);
|
|
@@ -27049,15 +27103,25 @@ class TrackBase {
|
|
|
27049
27103
|
*/
|
|
27050
27104
|
init(config) {
|
|
27051
27105
|
|
|
27106
|
+
this.config = config;
|
|
27107
|
+
|
|
27052
27108
|
if (config.displayMode) {
|
|
27053
27109
|
config.displayMode = config.displayMode.toUpperCase();
|
|
27054
27110
|
}
|
|
27055
27111
|
|
|
27056
|
-
|
|
27057
|
-
|
|
27058
|
-
this.
|
|
27059
|
-
|
|
27060
|
-
|
|
27112
|
+
// Set default properties
|
|
27113
|
+
const defaults = Object.assign({}, TrackBase.defaults);
|
|
27114
|
+
if(this.constructor.defaults) {
|
|
27115
|
+
for(let key of Object.keys(this.constructor.defaults)) {
|
|
27116
|
+
defaults[key] = this.constructor.defaults[key];
|
|
27117
|
+
}
|
|
27118
|
+
}
|
|
27119
|
+
for(let key of Object.keys(defaults)) {
|
|
27120
|
+
this[key] = config.hasOwnProperty(key) ? config[key] : defaults[key];
|
|
27121
|
+
if(key === 'color' || key === 'altColor') {
|
|
27122
|
+
this[key] = fixColor(this[key]);
|
|
27123
|
+
}
|
|
27124
|
+
}
|
|
27061
27125
|
|
|
27062
27126
|
if (config.name || config.label) {
|
|
27063
27127
|
this.name = config.name || config.label;
|
|
@@ -27067,29 +27131,15 @@ class TrackBase {
|
|
|
27067
27131
|
this.name = getFilename$2(config.url);
|
|
27068
27132
|
}
|
|
27069
27133
|
|
|
27134
|
+
this.url = config.url;
|
|
27135
|
+
if(this.config.type) this.type = this.config.type;
|
|
27070
27136
|
this.id = this.config.id === undefined ? this.name : this.config.id;
|
|
27071
|
-
|
|
27072
27137
|
this.order = config.order;
|
|
27073
|
-
|
|
27074
|
-
if (config.color) this.color = fixColor(config.color);
|
|
27075
|
-
if (config.altColor) this.altColor = fixColor(config.altColor);
|
|
27076
|
-
if ("civic-ws" === config.sourceType) { // Ugly proxy for specialized track type
|
|
27077
|
-
this.defaultColor = "rgb(155,20,20)";
|
|
27078
|
-
} else {
|
|
27079
|
-
this.defaultColor = "rgb(0,0,150)";
|
|
27080
|
-
}
|
|
27081
|
-
|
|
27082
27138
|
this.autoscaleGroup = config.autoscaleGroup;
|
|
27083
|
-
|
|
27084
27139
|
this.removable = config.removable === undefined ? true : config.removable; // Defaults to true
|
|
27085
|
-
|
|
27086
|
-
this.height = config.height || 100;
|
|
27087
|
-
this.autoHeight = config.autoHeight;
|
|
27088
27140
|
this.minHeight = config.minHeight || Math.min(25, this.height);
|
|
27089
27141
|
this.maxHeight = config.maxHeight || Math.max(1000, this.height);
|
|
27090
27142
|
|
|
27091
|
-
this.visibilityWindow = config.visibilityWindow;
|
|
27092
|
-
|
|
27093
27143
|
if (config.onclick) {
|
|
27094
27144
|
this.onclick = config.onclick;
|
|
27095
27145
|
config.onclick = undefined; // functions cannot be saved in sessions, clear it here.
|
|
@@ -27146,17 +27196,18 @@ class TrackBase {
|
|
|
27146
27196
|
}
|
|
27147
27197
|
|
|
27148
27198
|
/**
|
|
27149
|
-
*
|
|
27150
|
-
*
|
|
27151
|
-
* current state. Only simple properties (string, number, boolean) are updated.
|
|
27199
|
+
* Used to create session object for bookmarking, sharing. Only simple property values (string, number, boolean)
|
|
27200
|
+
* are saved.
|
|
27152
27201
|
*/
|
|
27153
27202
|
getState() {
|
|
27154
27203
|
|
|
27204
|
+
const jsonable = (v) => !(v === undefined || typeof v === 'function' || v instanceof File || v instanceof Promise);
|
|
27205
|
+
|
|
27155
27206
|
// Create copy of config, minus transient properties (convention is name starts with '_'). Also, all
|
|
27156
27207
|
// function properties are transient as they cannot be saved in json
|
|
27157
27208
|
const state = {};
|
|
27158
27209
|
for (let key of Object.keys(this.config)) {
|
|
27159
|
-
if (!key.startsWith("_") &&
|
|
27210
|
+
if (!key.startsWith("_") && jsonable(this.config[key])) {
|
|
27160
27211
|
state[key] = this.config[key];
|
|
27161
27212
|
}
|
|
27162
27213
|
}
|
|
@@ -27170,8 +27221,18 @@ class TrackBase {
|
|
|
27170
27221
|
}
|
|
27171
27222
|
}
|
|
27172
27223
|
|
|
27173
|
-
|
|
27174
|
-
|
|
27224
|
+
// If user has changed other properties from defaults update state.
|
|
27225
|
+
const defs = TrackBase.defaults;
|
|
27226
|
+
if (this.constructor.defaults) {
|
|
27227
|
+
for (let key of Object.keys(this.constructor.defaults)) {
|
|
27228
|
+
defs[key] = this.constructor.defaults[key];
|
|
27229
|
+
}
|
|
27230
|
+
}
|
|
27231
|
+
for (let key of Object.keys(defs)) {
|
|
27232
|
+
if (undefined !== this[key] && defs[key] !== this[key]) {
|
|
27233
|
+
state[key] = this[key];
|
|
27234
|
+
}
|
|
27235
|
+
}
|
|
27175
27236
|
|
|
27176
27237
|
// Flatten dataRange if present
|
|
27177
27238
|
if (!this.autoscale && this.dataRange) {
|
|
@@ -27179,22 +27240,6 @@ class TrackBase {
|
|
|
27179
27240
|
state.max = this.dataRange.max;
|
|
27180
27241
|
}
|
|
27181
27242
|
|
|
27182
|
-
|
|
27183
|
-
// Check for non-json-if-yable properties. Perhaps we should test what can be saved.
|
|
27184
|
-
for (let key of Object.keys(state)) {
|
|
27185
|
-
const value = state[key];
|
|
27186
|
-
if (typeof value === 'function') {
|
|
27187
|
-
throw Error(`Property '${key}' of track '${this.name} is a function. Functions cannot be saved in sessions.`)
|
|
27188
|
-
}
|
|
27189
|
-
if (value instanceof File) { // Test specifically for File. Other types of File-like objects might be savable
|
|
27190
|
-
const str = `Track ${this.name} is a local file. Sessions cannot be saved with local file references.`;
|
|
27191
|
-
throw Error(str)
|
|
27192
|
-
}
|
|
27193
|
-
if (value instanceof Promise) {
|
|
27194
|
-
throw Error(`Property '${key}' of track '${this.name} is a Promise. Promises cannot be saved in sessions.`)
|
|
27195
|
-
}
|
|
27196
|
-
}
|
|
27197
|
-
|
|
27198
27243
|
return state
|
|
27199
27244
|
}
|
|
27200
27245
|
|
|
@@ -27490,7 +27535,7 @@ class TrackBase {
|
|
|
27490
27535
|
* @returns {*|string|string}
|
|
27491
27536
|
*/
|
|
27492
27537
|
getColorForFeature(f) {
|
|
27493
|
-
|
|
27538
|
+
return (typeof this.color === "function") ? this.color(feature) : this.color
|
|
27494
27539
|
}
|
|
27495
27540
|
|
|
27496
27541
|
/**
|
|
@@ -31894,6 +31939,7 @@ class TextFeatureSource {
|
|
|
31894
31939
|
|
|
31895
31940
|
const queryableFormats = new Set(["bigwig", "bw", "bigbed", "bb", "biginteract", "biggenepred", "bignarrowpeak", "tdf"]);
|
|
31896
31941
|
|
|
31942
|
+
this.queryable = config.queryable === true; // False by default, unless explicitly set
|
|
31897
31943
|
if (config.reader) {
|
|
31898
31944
|
// Explicit reader implementation
|
|
31899
31945
|
this.reader = config.reader;
|
|
@@ -31927,6 +31973,11 @@ class TextFeatureSource {
|
|
|
31927
31973
|
this.queryable = true;
|
|
31928
31974
|
} else ;
|
|
31929
31975
|
}
|
|
31976
|
+
|
|
31977
|
+
// Set searchable unless explicitly turned off, or track uses in indexed or otherwise queryable
|
|
31978
|
+
// feature source. queryable => features loaded on demand (by query)
|
|
31979
|
+
this.searchable = config.searchable === true || config.searchableFields || (config.searchable !== false && !this.queryable);
|
|
31980
|
+
|
|
31930
31981
|
}
|
|
31931
31982
|
|
|
31932
31983
|
async defaultVisibilityWindow() {
|
|
@@ -32067,39 +32118,13 @@ class TextFeatureSource {
|
|
|
32067
32118
|
this.featureCache = new FeatureCache$1(features, this.genome, genomicInterval);
|
|
32068
32119
|
|
|
32069
32120
|
// If track is marked "searchable"< cache features by name -- use this with caution, memory intensive
|
|
32070
|
-
if (this.
|
|
32071
|
-
this.addFeaturesToDB(features);
|
|
32121
|
+
if (this.searchable) {
|
|
32122
|
+
this.genome.addFeaturesToDB(features, this.config);
|
|
32072
32123
|
}
|
|
32073
32124
|
} else {
|
|
32074
32125
|
this.featureCache = new FeatureCache$1([], genomicInterval); // Empty cache
|
|
32075
32126
|
}
|
|
32076
32127
|
}
|
|
32077
|
-
|
|
32078
|
-
addFeaturesToDB(featureList) {
|
|
32079
|
-
for (let feature of featureList) {
|
|
32080
|
-
if (feature.name) {
|
|
32081
|
-
this.genome.featureDB[feature.name.toUpperCase()] = feature;
|
|
32082
|
-
}
|
|
32083
|
-
if (feature.gene && feature.gene.name) {
|
|
32084
|
-
this.genome.featureDB[feature.gene.name.toUpperCase()] = feature;
|
|
32085
|
-
}
|
|
32086
|
-
|
|
32087
|
-
if (this.config.searchableFields) {
|
|
32088
|
-
for (let f of this.config.searchableFields) {
|
|
32089
|
-
const value = feature.getAttributeValue(f);
|
|
32090
|
-
if (value) {
|
|
32091
|
-
if (value.indexOf(" ") > 0) {
|
|
32092
|
-
this.genome.featureDB[value.replaceAll(" ", "+").toUpperCase()] = feature;
|
|
32093
|
-
this.genome.featureDB[value.replaceAll(" ", "%20").toUpperCase()] = feature;
|
|
32094
|
-
} else {
|
|
32095
|
-
this.genome.featureDB[value.toUpperCase()] = feature;
|
|
32096
|
-
}
|
|
32097
|
-
}
|
|
32098
|
-
}
|
|
32099
|
-
}
|
|
32100
|
-
}
|
|
32101
|
-
}
|
|
32102
|
-
|
|
32103
32128
|
}
|
|
32104
32129
|
|
|
32105
32130
|
/*
|
|
@@ -32915,7 +32940,8 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
|
|
|
32915
32940
|
|
|
32916
32941
|
const binaryParser = new BinaryParser(data);
|
|
32917
32942
|
const chromId = binaryParser.getInt();
|
|
32918
|
-
|
|
32943
|
+
const blockStart = binaryParser.getInt();
|
|
32944
|
+
let chromStart = blockStart;
|
|
32919
32945
|
let chromEnd = binaryParser.getInt();
|
|
32920
32946
|
const itemStep = binaryParser.getInt();
|
|
32921
32947
|
const itemSpan = binaryParser.getInt();
|
|
@@ -32925,6 +32951,7 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
|
|
|
32925
32951
|
|
|
32926
32952
|
if (chromId >= chrIdx1 && chromId <= chrIdx2) {
|
|
32927
32953
|
|
|
32954
|
+
let idx = 0;
|
|
32928
32955
|
while (itemCount-- > 0) {
|
|
32929
32956
|
let value;
|
|
32930
32957
|
switch (type) {
|
|
@@ -32940,8 +32967,9 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
|
|
|
32940
32967
|
break
|
|
32941
32968
|
case 3: // Fixed step
|
|
32942
32969
|
value = binaryParser.getFloat();
|
|
32970
|
+
chromStart = blockStart + idx * itemStep;
|
|
32943
32971
|
chromEnd = chromStart + itemSpan;
|
|
32944
|
-
|
|
32972
|
+
idx++;
|
|
32945
32973
|
break
|
|
32946
32974
|
}
|
|
32947
32975
|
|
|
@@ -32951,8 +32979,8 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
|
|
|
32951
32979
|
if (Number.isFinite(value)) {
|
|
32952
32980
|
const chr = chrDict[chromId];
|
|
32953
32981
|
featureArray.push({chr: chr, start: chromStart, end: chromEnd, value: value});
|
|
32954
|
-
|
|
32955
32982
|
}
|
|
32983
|
+
|
|
32956
32984
|
}
|
|
32957
32985
|
}
|
|
32958
32986
|
}
|
|
@@ -33088,6 +33116,7 @@ class BWSource {
|
|
|
33088
33116
|
this.genome = genome;
|
|
33089
33117
|
this.format = config.format || "bigwig";
|
|
33090
33118
|
this.wgValues = {};
|
|
33119
|
+
this.queryable = true;
|
|
33091
33120
|
}
|
|
33092
33121
|
|
|
33093
33122
|
async getFeatures({chr, start, end, bpPerPixel, windowFunction}) {
|
|
@@ -33629,6 +33658,7 @@ class TDFSource {
|
|
|
33629
33658
|
this.genome = genome;
|
|
33630
33659
|
this.windowFunction = config.windowFunction || "mean";
|
|
33631
33660
|
this.reader = new TDFReader(config, genome);
|
|
33661
|
+
this.queryable = true;
|
|
33632
33662
|
}
|
|
33633
33663
|
|
|
33634
33664
|
async getFeatures({chr, start, end, bpPerPixel}) {
|
|
@@ -33838,8 +33868,8 @@ class StaticFeatureSource {
|
|
|
33838
33868
|
this.config = config;
|
|
33839
33869
|
this.genome = genome;
|
|
33840
33870
|
this.queryable = false;
|
|
33871
|
+
this.searchable = config.searchable !== false; // searchable by default
|
|
33841
33872
|
this.updateFeatures(config.features);
|
|
33842
|
-
|
|
33843
33873
|
}
|
|
33844
33874
|
|
|
33845
33875
|
updateFeatures(features) {
|
|
@@ -33849,6 +33879,10 @@ class StaticFeatureSource {
|
|
|
33849
33879
|
mapProperties(features, this.config.mappings);
|
|
33850
33880
|
}
|
|
33851
33881
|
this.featureCache = new FeatureCache$1(features, this.genome);
|
|
33882
|
+
|
|
33883
|
+
if (this.searchable || this.config.searchableFields) {
|
|
33884
|
+
this.genome.addFeaturesToDB(features, this.config);
|
|
33885
|
+
}
|
|
33852
33886
|
}
|
|
33853
33887
|
|
|
33854
33888
|
/**
|
|
@@ -40042,8 +40076,8 @@ function renderFeature(feature, bpStart, xScale, pixelHeight, ctx, options) {
|
|
|
40042
40076
|
|
|
40043
40077
|
// Set ctx color to a known valid color. If getColorForFeature returns an invalid color string it is ignored, and
|
|
40044
40078
|
// this default will be used.
|
|
40045
|
-
ctx.fillStyle = this.
|
|
40046
|
-
ctx.strokeStyle = this.
|
|
40079
|
+
ctx.fillStyle = this.color;
|
|
40080
|
+
ctx.strokeStyle = this.color;
|
|
40047
40081
|
|
|
40048
40082
|
const color = this.getColorForFeature(feature);
|
|
40049
40083
|
ctx.fillStyle = color;
|
|
@@ -40367,6 +40401,17 @@ function renderFusionJuncSpan(feature, bpStart, xScale, pixelHeight, ctx) {
|
|
|
40367
40401
|
|
|
40368
40402
|
class FeatureTrack extends TrackBase {
|
|
40369
40403
|
|
|
40404
|
+
static defaults = {
|
|
40405
|
+
type: "annotation",
|
|
40406
|
+
maxRows: 1000, // protects against pathological feature packing cases (# of rows of overlapping feaures)
|
|
40407
|
+
displayMode: "EXPANDED", // COLLAPSED | EXPANDED | SQUISHED
|
|
40408
|
+
margin: 10,
|
|
40409
|
+
featureHeight: 14,
|
|
40410
|
+
autoHeight: false,
|
|
40411
|
+
useScore: false
|
|
40412
|
+
}
|
|
40413
|
+
|
|
40414
|
+
|
|
40370
40415
|
constructor(config, browser) {
|
|
40371
40416
|
super(config, browser);
|
|
40372
40417
|
}
|
|
@@ -40374,12 +40419,8 @@ class FeatureTrack extends TrackBase {
|
|
|
40374
40419
|
init(config) {
|
|
40375
40420
|
super.init(config);
|
|
40376
40421
|
|
|
40377
|
-
this.type = config.type || "annotation";
|
|
40378
40422
|
|
|
40379
|
-
//
|
|
40380
|
-
this.maxRows = config.maxRows === undefined ? 1000 : config.maxRows;
|
|
40381
|
-
|
|
40382
|
-
this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
|
|
40423
|
+
// Obscure option, not common or supoorted, included for backward compatibility
|
|
40383
40424
|
this.labelDisplayMode = config.labelDisplayMode;
|
|
40384
40425
|
|
|
40385
40426
|
if (config._featureSource) {
|
|
@@ -40391,12 +40432,6 @@ class FeatureTrack extends TrackBase {
|
|
|
40391
40432
|
FeatureSource(config, this.browser.genome);
|
|
40392
40433
|
}
|
|
40393
40434
|
|
|
40394
|
-
// Set default heights
|
|
40395
|
-
this.autoHeight = config.autoHeight;
|
|
40396
|
-
this.margin = config.margin === undefined ? 10 : config.margin;
|
|
40397
|
-
|
|
40398
|
-
this.featureHeight = config.featureHeight || 14;
|
|
40399
|
-
|
|
40400
40435
|
if ("FusionJuncSpan" === config.type) {
|
|
40401
40436
|
this.render = config.render || renderFusionJuncSpan;
|
|
40402
40437
|
this.squishedRowHeight = config.squishedRowHeight || 50;
|
|
@@ -40433,9 +40468,6 @@ class FeatureTrack extends TrackBase {
|
|
|
40433
40468
|
}
|
|
40434
40469
|
}
|
|
40435
40470
|
}
|
|
40436
|
-
|
|
40437
|
-
//UCSC useScore option
|
|
40438
|
-
this.useScore = config.useScore;
|
|
40439
40471
|
}
|
|
40440
40472
|
|
|
40441
40473
|
async postInit() {
|
|
@@ -40799,7 +40831,7 @@ class FeatureTrack extends TrackBase {
|
|
|
40799
40831
|
} else if (feature.color) {
|
|
40800
40832
|
color = feature.color; // Explicit color for feature
|
|
40801
40833
|
} else {
|
|
40802
|
-
color = this.
|
|
40834
|
+
color = this.color; // Track default
|
|
40803
40835
|
}
|
|
40804
40836
|
|
|
40805
40837
|
if (feature.alpha && feature.alpha !== 1) {
|
|
@@ -40865,21 +40897,27 @@ class RegionTableBase {
|
|
|
40865
40897
|
|
|
40866
40898
|
this.browser = config.browser;
|
|
40867
40899
|
|
|
40868
|
-
this.
|
|
40900
|
+
this.columnFormat = config.columnFormat;
|
|
40869
40901
|
|
|
40870
|
-
|
|
40902
|
+
this.tableRowSelectionList = [];
|
|
40871
40903
|
|
|
40872
|
-
this.
|
|
40904
|
+
this.tableDOM = domUtils.div({ class: 'igv-roi-table' });
|
|
40905
|
+
// if(config.width) {
|
|
40906
|
+
// let [ w ] = config.width.split('px')
|
|
40907
|
+
// w = parseInt(w, 10)
|
|
40908
|
+
// this.tableDOM.style.width = `${Math.min(w, 1600)}px`
|
|
40909
|
+
//
|
|
40910
|
+
// }
|
|
40873
40911
|
|
|
40874
|
-
this.
|
|
40912
|
+
config.parent.appendChild(this.tableDOM);
|
|
40875
40913
|
|
|
40876
|
-
this.
|
|
40914
|
+
this.headerDOM = config;
|
|
40877
40915
|
|
|
40878
|
-
this.
|
|
40916
|
+
this.tableColumnTitles = this.tableDOM;
|
|
40879
40917
|
|
|
40880
|
-
this.
|
|
40918
|
+
this.tableRowContainer = this.tableDOM;
|
|
40881
40919
|
|
|
40882
|
-
this.
|
|
40920
|
+
this.footerDOM = config.gotoButtonHandler;
|
|
40883
40921
|
|
|
40884
40922
|
}
|
|
40885
40923
|
|
|
@@ -40887,12 +40925,12 @@ class RegionTableBase {
|
|
|
40887
40925
|
|
|
40888
40926
|
// header
|
|
40889
40927
|
const dom = domUtils.div();
|
|
40890
|
-
this.
|
|
40928
|
+
this.tableDOM.appendChild(dom);
|
|
40891
40929
|
|
|
40892
40930
|
// header title
|
|
40893
40931
|
const div = domUtils.div();
|
|
40894
40932
|
dom.appendChild(div);
|
|
40895
|
-
div.
|
|
40933
|
+
div.innerHTML = headerTitle;
|
|
40896
40934
|
|
|
40897
40935
|
// table dismiss button
|
|
40898
40936
|
const dismiss = domUtils.div();
|
|
@@ -40911,46 +40949,51 @@ class RegionTableBase {
|
|
|
40911
40949
|
const { y:y_root } = browser.root.getBoundingClientRect();
|
|
40912
40950
|
const { y:y_parent } = parent.getBoundingClientRect();
|
|
40913
40951
|
const constraint = -(y_parent - y_root);
|
|
40914
|
-
makeDraggable(this.
|
|
40952
|
+
makeDraggable(this.tableDOM, dom, { minX:0, minY:constraint });
|
|
40915
40953
|
|
|
40916
|
-
this.
|
|
40954
|
+
this.tableDOM.style.display = 'none';
|
|
40917
40955
|
|
|
40918
40956
|
this._headerDOM = dom;
|
|
40919
40957
|
|
|
40920
40958
|
}
|
|
40921
40959
|
|
|
40922
|
-
set
|
|
40960
|
+
set tableColumnTitles(tableDOM) {
|
|
40923
40961
|
|
|
40924
|
-
const
|
|
40925
|
-
|
|
40962
|
+
const tblColumnTitles = domUtils.div({ class: 'igv-roi-table-column-titles' });
|
|
40963
|
+
tableDOM.appendChild(tblColumnTitles);
|
|
40926
40964
|
|
|
40927
|
-
for (const { label, width } of columnFormat) {
|
|
40965
|
+
for (const { label, width } of this.columnFormat) {
|
|
40928
40966
|
const col = domUtils.div();
|
|
40929
|
-
|
|
40967
|
+
tblColumnTitles.appendChild(col);
|
|
40930
40968
|
col.style.width = width;
|
|
40931
40969
|
col.innerText = label;
|
|
40932
40970
|
}
|
|
40933
40971
|
|
|
40972
|
+
this._tableColumnTitlesDOM = tblColumnTitles;
|
|
40973
|
+
|
|
40974
|
+
}
|
|
40975
|
+
|
|
40976
|
+
get tableColumnTitles() {
|
|
40977
|
+
return this._tableColumnTitlesDOM
|
|
40934
40978
|
}
|
|
40935
40979
|
|
|
40936
|
-
set
|
|
40980
|
+
set tableRowContainer(container) {
|
|
40937
40981
|
|
|
40938
|
-
const
|
|
40939
|
-
container.appendChild(
|
|
40982
|
+
const tblRowContainer = domUtils.div({ class: 'igv-roi-table-row-container' });
|
|
40983
|
+
container.appendChild(tblRowContainer);
|
|
40940
40984
|
|
|
40941
|
-
|
|
40985
|
+
this._tableRowContainerDOM = tblRowContainer;
|
|
40942
40986
|
|
|
40943
|
-
this._rowContainerDOM = dom;
|
|
40944
40987
|
}
|
|
40945
40988
|
|
|
40946
|
-
get
|
|
40947
|
-
return this.
|
|
40989
|
+
get tableRowContainer() {
|
|
40990
|
+
return this._tableRowContainerDOM
|
|
40948
40991
|
}
|
|
40949
40992
|
|
|
40950
40993
|
set footerDOM(gotoButtonHandler) {
|
|
40951
40994
|
|
|
40952
40995
|
const dom = domUtils.div();
|
|
40953
|
-
this.
|
|
40996
|
+
this.tableDOM.appendChild(dom);
|
|
40954
40997
|
|
|
40955
40998
|
// Go To Button
|
|
40956
40999
|
const gotoButton = domUtils.div({class: 'igv-roi-table-button'});
|
|
@@ -40992,7 +41035,7 @@ class RegionTableBase {
|
|
|
40992
41035
|
}
|
|
40993
41036
|
|
|
40994
41037
|
clearTable() {
|
|
40995
|
-
const elements = this.
|
|
41038
|
+
const elements = this.tableRowContainer.querySelectorAll('.igv-roi-table-row');
|
|
40996
41039
|
for (let el of elements) {
|
|
40997
41040
|
el.remove();
|
|
40998
41041
|
}
|
|
@@ -41004,23 +41047,23 @@ class RegionTableBase {
|
|
|
41004
41047
|
}
|
|
41005
41048
|
|
|
41006
41049
|
present() {
|
|
41007
|
-
this.
|
|
41050
|
+
this.tableDOM.style.left = `${ 0 }px`;
|
|
41008
41051
|
|
|
41009
41052
|
const { y:y_root } = this.browser.root.getBoundingClientRect();
|
|
41010
41053
|
const { y:y_parent } = this.config.parent.getBoundingClientRect();
|
|
41011
41054
|
|
|
41012
|
-
this.
|
|
41013
|
-
this.
|
|
41055
|
+
this.tableDOM.style.top = `${ y_root - y_parent }px`;
|
|
41056
|
+
this.tableDOM.style.display = 'flex';
|
|
41014
41057
|
}
|
|
41015
41058
|
|
|
41016
41059
|
dismiss() {
|
|
41017
|
-
this.
|
|
41060
|
+
this.tableDOM.style.display = 'none';
|
|
41018
41061
|
}
|
|
41019
41062
|
|
|
41020
41063
|
dispose() {
|
|
41021
41064
|
|
|
41022
|
-
this.
|
|
41023
|
-
this.
|
|
41065
|
+
this.tableDOM.innerHTML = '';
|
|
41066
|
+
this.tableDOM.remove();
|
|
41024
41067
|
|
|
41025
41068
|
for (const key of Object.keys(this)) {
|
|
41026
41069
|
this[key] = undefined;
|
|
@@ -41036,41 +41079,35 @@ class BlatTable extends RegionTableBase {
|
|
|
41036
41079
|
|
|
41037
41080
|
constructor(config) {
|
|
41038
41081
|
|
|
41039
|
-
const cooked = Object.assign({ 'width':'
|
|
41082
|
+
const cooked = Object.assign({ 'width':'1024px' }, config);
|
|
41040
41083
|
super(cooked);
|
|
41041
41084
|
|
|
41042
41085
|
this.descriptionDOM = config;
|
|
41043
41086
|
|
|
41044
41087
|
}
|
|
41045
41088
|
|
|
41046
|
-
|
|
41047
|
-
set columnTitleDOM(columnFormat) {
|
|
41048
|
-
|
|
41049
|
-
const dom = domUtils.div({ class: 'igv-roi-table-column-titles' });
|
|
41050
|
-
this.container.appendChild(dom);
|
|
41051
|
-
|
|
41052
|
-
for (const format of columnFormat) {
|
|
41053
|
-
const col = domUtils.div();
|
|
41054
|
-
dom.appendChild(col);
|
|
41055
|
-
col.style.width = format.width || 'fit-content';
|
|
41056
|
-
col.innerText = format.label;
|
|
41057
|
-
}
|
|
41058
|
-
|
|
41059
|
-
}
|
|
41060
|
-
|
|
41061
41089
|
set descriptionDOM(config) {
|
|
41062
41090
|
|
|
41063
41091
|
if (config.description) {
|
|
41064
41092
|
|
|
41065
41093
|
let dom;
|
|
41066
41094
|
|
|
41067
|
-
|
|
41095
|
+
// BLAT result for query sequence
|
|
41068
41096
|
dom = domUtils.div({ class: 'igv-roi-table-description' });
|
|
41069
|
-
this.
|
|
41097
|
+
this.tableDOM.insertBefore(dom, this.tableColumnTitles);
|
|
41098
|
+
dom.style.height = 'auto';
|
|
41099
|
+
dom.innerHTML = `BLAT result for query sequence:`;
|
|
41100
|
+
|
|
41101
|
+
// CTAATCAtctacactggtttctactg ...
|
|
41102
|
+
dom = domUtils.div({ class: 'igv-roi-table-description' });
|
|
41103
|
+
this.tableDOM.insertBefore(dom, this.tableColumnTitles);
|
|
41104
|
+
dom.style.height = 'auto';
|
|
41105
|
+
dom.style.maxHeight = '128px';
|
|
41070
41106
|
dom.innerHTML = config.description;
|
|
41071
41107
|
|
|
41108
|
+
// Select one or more rows ...
|
|
41072
41109
|
dom = domUtils.div({ class: 'igv-roi-table-goto-explainer' });
|
|
41073
|
-
this.
|
|
41110
|
+
this.tableDOM.insertBefore(dom, this.tableColumnTitles);
|
|
41074
41111
|
dom.innerHTML = `Select one or more rows and click Go To to view the regions`;
|
|
41075
41112
|
|
|
41076
41113
|
}
|
|
@@ -41100,13 +41137,13 @@ class BlatTable extends RegionTableBase {
|
|
|
41100
41137
|
|
|
41101
41138
|
renderTable(records) {
|
|
41102
41139
|
|
|
41103
|
-
Array.from(this.
|
|
41140
|
+
Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
|
|
41104
41141
|
|
|
41105
41142
|
if (records.length > 0) {
|
|
41106
41143
|
|
|
41107
41144
|
for (let record of records) {
|
|
41108
41145
|
const row = this.tableRowDOM(record);
|
|
41109
|
-
this.
|
|
41146
|
+
this.tableRowContainer.appendChild(row);
|
|
41110
41147
|
}
|
|
41111
41148
|
|
|
41112
41149
|
}
|
|
@@ -41154,7 +41191,7 @@ class BlatTable extends RegionTableBase {
|
|
|
41154
41191
|
|
|
41155
41192
|
event.stopPropagation();
|
|
41156
41193
|
|
|
41157
|
-
const selectedRows = this.
|
|
41194
|
+
const selectedRows = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
|
|
41158
41195
|
|
|
41159
41196
|
const loci = [];
|
|
41160
41197
|
for (const row of selectedRows) {
|
|
@@ -41166,7 +41203,7 @@ class BlatTable extends RegionTableBase {
|
|
|
41166
41203
|
loci.push(`${ chr }:${ start }-${ end }`);
|
|
41167
41204
|
}
|
|
41168
41205
|
|
|
41169
|
-
for (const el of this.
|
|
41206
|
+
for (const el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
|
|
41170
41207
|
el.classList.remove('igv-roi-table-row-selected');
|
|
41171
41208
|
}
|
|
41172
41209
|
|
|
@@ -41188,16 +41225,16 @@ http://genome.ucsc.edu/cgi-bin/hgBlat
|
|
|
41188
41225
|
&output=json
|
|
41189
41226
|
*/
|
|
41190
41227
|
|
|
41191
|
-
|
|
41192
41228
|
//const blatServer = "https://genome.ucsc.edu/cgi-bin/hgBlat"
|
|
41193
|
-
const
|
|
41229
|
+
const defaultBlatServer = "https://igv.org/services/blatUCSC.php";
|
|
41230
|
+
//const blatServer = "http://localhost:8000/blatUCSC.php"
|
|
41194
41231
|
|
|
41195
41232
|
|
|
41196
|
-
async function blat(userSeq, db) {
|
|
41233
|
+
async function blat({url, userSeq, db}) {
|
|
41197
41234
|
|
|
41198
|
-
|
|
41235
|
+
url = url || defaultBlatServer;
|
|
41199
41236
|
|
|
41200
|
-
const results = await
|
|
41237
|
+
const results = await postData(url, userSeq, db);
|
|
41201
41238
|
|
|
41202
41239
|
results.fields;
|
|
41203
41240
|
|
|
@@ -41206,8 +41243,19 @@ async function blat(userSeq, db) {
|
|
|
41206
41243
|
return features
|
|
41207
41244
|
}
|
|
41208
41245
|
|
|
41209
|
-
|
|
41246
|
+
async function postData(url = "", userSeq, db) {
|
|
41210
41247
|
|
|
41248
|
+
const data = new URLSearchParams();
|
|
41249
|
+
data.append("userSeq", userSeq);
|
|
41250
|
+
data.append("db", db);
|
|
41251
|
+
|
|
41252
|
+
const response = await fetch(url, { method: "post", body: data });
|
|
41253
|
+
return response.json(); // parses JSON response into native JavaScript objects
|
|
41254
|
+
}
|
|
41255
|
+
|
|
41256
|
+
const maxSequenceSize = 25000;
|
|
41257
|
+
|
|
41258
|
+
class BlatTrack extends FeatureTrack {
|
|
41211
41259
|
|
|
41212
41260
|
constructor(config, browser) {
|
|
41213
41261
|
super(config, browser);
|
|
@@ -41243,7 +41291,7 @@ class BlatTrack extends FeatureTrack {
|
|
|
41243
41291
|
browser: this.browser,
|
|
41244
41292
|
parent: this.browser.parent,
|
|
41245
41293
|
headerTitle: this.config.title,
|
|
41246
|
-
description:
|
|
41294
|
+
description: this.sequence,
|
|
41247
41295
|
dismissHandler: () => {
|
|
41248
41296
|
this.table.dismiss();
|
|
41249
41297
|
this.table.dispose();
|
|
@@ -41292,21 +41340,34 @@ class BlatTrack extends FeatureTrack {
|
|
|
41292
41340
|
|
|
41293
41341
|
async function createBlatTrack({sequence, browser, name, title}) {
|
|
41294
41342
|
|
|
41343
|
+
if (sequence.length > maxSequenceSize) {
|
|
41344
|
+
browser.alert.present(`Sequence size exceeds maximum allowed length (${sequence.length} > ${maxSequenceSize})`);
|
|
41345
|
+
return
|
|
41346
|
+
}
|
|
41347
|
+
|
|
41295
41348
|
const db = browser.genome.id; // TODO -- blat specific property
|
|
41296
41349
|
|
|
41297
|
-
const
|
|
41350
|
+
const url = browser.config["blatServerURL"];
|
|
41298
41351
|
|
|
41299
|
-
|
|
41300
|
-
|
|
41301
|
-
|
|
41302
|
-
|
|
41303
|
-
|
|
41304
|
-
|
|
41305
|
-
|
|
41352
|
+
try {
|
|
41353
|
+
|
|
41354
|
+
const features = await blat({url, userSeq: sequence, db});
|
|
41355
|
+
const trackConfig = {
|
|
41356
|
+
type: 'blat',
|
|
41357
|
+
name: name || 'blat results',
|
|
41358
|
+
title: title || 'blat results',
|
|
41359
|
+
sequence: sequence,
|
|
41360
|
+
altColor: 'rgb(176, 176, 236)',
|
|
41361
|
+
color: 'rgb(236, 176, 176)',
|
|
41362
|
+
features: features
|
|
41363
|
+
};
|
|
41306
41364
|
|
|
41307
|
-
|
|
41365
|
+
const track = await browser.loadTrack(trackConfig);
|
|
41366
|
+
track.openTableView();
|
|
41308
41367
|
|
|
41309
|
-
|
|
41368
|
+
} catch (e) {
|
|
41369
|
+
browser.alert.present(`Error performing blat search: ${e}`);
|
|
41370
|
+
}
|
|
41310
41371
|
|
|
41311
41372
|
}
|
|
41312
41373
|
|
|
@@ -41337,8 +41398,6 @@ async function createBlatTrack({sequence, browser, name, title}) {
|
|
|
41337
41398
|
|
|
41338
41399
|
const alignmentStartGap = 5;
|
|
41339
41400
|
const downsampleRowHeight = 5;
|
|
41340
|
-
const DEFAULT_COVERAGE_TRACK_HEIGHT = 50;
|
|
41341
|
-
const DEFAULT_TRACK_HEIGHT$1 = 300;
|
|
41342
41401
|
const DEFAULT_ALIGNMENT_COLOR = "rgb(185, 185, 185)";
|
|
41343
41402
|
const DEFAULT_COVERAGE_COLOR = "rgb(150, 150, 150)";
|
|
41344
41403
|
const DEFAULT_CONNECTOR_COLOR = "rgb(200, 200, 200)";
|
|
@@ -41346,35 +41405,37 @@ const MINIMUM_BLAT_LENGTH = 20;
|
|
|
41346
41405
|
|
|
41347
41406
|
class BAMTrack extends TrackBase {
|
|
41348
41407
|
|
|
41408
|
+
static defaults = {
|
|
41409
|
+
alleleFreqThreshold: 0.2,
|
|
41410
|
+
visibilityWindow: 30000,
|
|
41411
|
+
showCoverage: true,
|
|
41412
|
+
showAlignments: true,
|
|
41413
|
+
viewAsPairs: false,
|
|
41414
|
+
pairsSupported: true,
|
|
41415
|
+
showSoftClips: false,
|
|
41416
|
+
showAllBases: false,
|
|
41417
|
+
showInsertions: true,
|
|
41418
|
+
showMismatches: true,
|
|
41419
|
+
color: DEFAULT_ALIGNMENT_COLOR,
|
|
41420
|
+
coverageColor: DEFAULT_COVERAGE_COLOR,
|
|
41421
|
+
height: 300,
|
|
41422
|
+
coverageTrackHeight: 50
|
|
41423
|
+
}
|
|
41424
|
+
|
|
41349
41425
|
constructor(config, browser) {
|
|
41350
41426
|
super(config, browser);
|
|
41351
41427
|
}
|
|
41352
41428
|
|
|
41353
41429
|
init(config) {
|
|
41354
|
-
super.init(config);
|
|
41355
|
-
this.type = "alignment";
|
|
41356
|
-
|
|
41357
|
-
if (config.alleleFreqThreshold === undefined) {
|
|
41358
|
-
config.alleleFreqThreshold = 0.2;
|
|
41359
|
-
}
|
|
41360
41430
|
|
|
41431
|
+
this.type = "alignment";
|
|
41361
41432
|
this.featureSource = new BamSource(config, this.browser);
|
|
41362
|
-
|
|
41363
|
-
this.showCoverage = config.showCoverage === undefined ? true : config.showCoverage;
|
|
41364
|
-
this.showAlignments = config.showAlignments === undefined ? true : config.showAlignments;
|
|
41365
|
-
|
|
41366
41433
|
this.coverageTrack = new CoverageTrack(config, this);
|
|
41367
41434
|
this.alignmentTrack = new AlignmentTrack(config, this);
|
|
41435
|
+
|
|
41436
|
+
super.init(config);
|
|
41437
|
+
|
|
41368
41438
|
this.alignmentTrack.setTop(this.coverageTrack, this.showCoverage);
|
|
41369
|
-
this.visibilityWindow = config.visibilityWindow || 30000;
|
|
41370
|
-
this.viewAsPairs = config.viewAsPairs;
|
|
41371
|
-
this.pairsSupported = config.pairsSupported !== false;
|
|
41372
|
-
this.showSoftClips = config.showSoftClips;
|
|
41373
|
-
this.showAllBases = config.showAllBases;
|
|
41374
|
-
this.showInsertions = false !== config.showInsertions;
|
|
41375
|
-
this.showMismatches = false !== config.showMismatches;
|
|
41376
|
-
this.color = config.color;
|
|
41377
|
-
this.coverageColor = config.coverageColor;
|
|
41378
41439
|
|
|
41379
41440
|
// The sort object can be an array in the case of multi-locus view, however if multiple sort positions
|
|
41380
41441
|
// are present for a given reference frame the last one will take precedence
|
|
@@ -41387,14 +41448,12 @@ class BAMTrack extends TrackBase {
|
|
|
41387
41448
|
}
|
|
41388
41449
|
}
|
|
41389
41450
|
|
|
41390
|
-
// Invoke height setter last to allocated to coverage and alignment tracks
|
|
41391
|
-
this.height = (config.height !== undefined ? config.height : DEFAULT_TRACK_HEIGHT$1);
|
|
41392
41451
|
}
|
|
41393
41452
|
|
|
41394
41453
|
set height(h) {
|
|
41395
41454
|
this._height = h;
|
|
41396
|
-
if (this.
|
|
41397
|
-
this.alignmentTrack.height = this.showCoverage ? h - this.
|
|
41455
|
+
if (this.showAlignments) {
|
|
41456
|
+
this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrackHeight : h;
|
|
41398
41457
|
}
|
|
41399
41458
|
}
|
|
41400
41459
|
|
|
@@ -41481,16 +41540,15 @@ class BAMTrack extends TrackBase {
|
|
|
41481
41540
|
* @returns {number}
|
|
41482
41541
|
*/
|
|
41483
41542
|
computePixelHeight(alignmentContainer) {
|
|
41484
|
-
return (this.showCoverage ? this.
|
|
41485
|
-
(this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0)
|
|
41486
|
-
15
|
|
41543
|
+
return (this.showCoverage ? this.coverageTrackHeight : 0) +
|
|
41544
|
+
(this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0)
|
|
41487
41545
|
}
|
|
41488
41546
|
|
|
41489
41547
|
draw(options) {
|
|
41490
41548
|
|
|
41491
41549
|
IGVGraphics.fillRect(options.context, 0, options.pixelTop, options.pixelWidth, options.pixelHeight, {'fillStyle': "rgb(255, 255, 255)"});
|
|
41492
41550
|
|
|
41493
|
-
if (true === this.showCoverage && this.
|
|
41551
|
+
if (true === this.showCoverage && this.coverageTrackHeight > 0) {
|
|
41494
41552
|
this.trackView.axisCanvas.style.display = 'block';
|
|
41495
41553
|
this.coverageTrack.draw(options);
|
|
41496
41554
|
} else {
|
|
@@ -41505,12 +41563,12 @@ class BAMTrack extends TrackBase {
|
|
|
41505
41563
|
|
|
41506
41564
|
paintAxis(ctx, pixelWidth, pixelHeight) {
|
|
41507
41565
|
|
|
41508
|
-
this.coverageTrack.paintAxis(ctx, pixelWidth, this.
|
|
41566
|
+
this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
|
|
41509
41567
|
|
|
41510
41568
|
// if (this.browser.isMultiLocusMode()) {
|
|
41511
41569
|
// ctx.clearRect(0, 0, pixelWidth, pixelHeight);
|
|
41512
41570
|
// } else {
|
|
41513
|
-
// this.coverageTrack.paintAxis(ctx, pixelWidth, this.
|
|
41571
|
+
// this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
|
|
41514
41572
|
// }
|
|
41515
41573
|
}
|
|
41516
41574
|
|
|
@@ -41519,7 +41577,7 @@ class BAMTrack extends TrackBase {
|
|
|
41519
41577
|
}
|
|
41520
41578
|
|
|
41521
41579
|
popupData(clickState) {
|
|
41522
|
-
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.
|
|
41580
|
+
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
|
|
41523
41581
|
return this.coverageTrack.popupData(clickState)
|
|
41524
41582
|
} else {
|
|
41525
41583
|
return this.alignmentTrack.popupData(clickState)
|
|
@@ -41534,7 +41592,7 @@ class BAMTrack extends TrackBase {
|
|
|
41534
41592
|
clickedFeatures(clickState) {
|
|
41535
41593
|
|
|
41536
41594
|
let clickedObject;
|
|
41537
|
-
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.
|
|
41595
|
+
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
|
|
41538
41596
|
clickedObject = this.coverageTrack.getClickedObject(clickState);
|
|
41539
41597
|
} else {
|
|
41540
41598
|
clickedObject = this.alignmentTrack.getClickedObject(clickState);
|
|
@@ -41543,7 +41601,7 @@ class BAMTrack extends TrackBase {
|
|
|
41543
41601
|
}
|
|
41544
41602
|
|
|
41545
41603
|
hoverText(clickState) {
|
|
41546
|
-
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.
|
|
41604
|
+
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
|
|
41547
41605
|
const clickedObject = this.coverageTrack.getClickedObject(clickState);
|
|
41548
41606
|
if (clickedObject) {
|
|
41549
41607
|
return clickedObject.hoverText()
|
|
@@ -41583,8 +41641,8 @@ class BAMTrack extends TrackBase {
|
|
|
41583
41641
|
// Show coverage / alignment options
|
|
41584
41642
|
const adjustTrackHeight = () => {
|
|
41585
41643
|
if (!this.autoHeight) {
|
|
41586
|
-
const h =
|
|
41587
|
-
(this.showCoverage ? this.
|
|
41644
|
+
const h =
|
|
41645
|
+
(this.showCoverage ? this.coverageTrackHeight : 0) +
|
|
41588
41646
|
(this.showAlignments ? this.alignmentTrack.height : 0);
|
|
41589
41647
|
this.trackView.setTrackHeight(h);
|
|
41590
41648
|
}
|
|
@@ -41898,7 +41956,6 @@ class CoverageTrack {
|
|
|
41898
41956
|
constructor(config, parent) {
|
|
41899
41957
|
this.parent = parent;
|
|
41900
41958
|
this.featureSource = parent.featureSource;
|
|
41901
|
-
this.height = config.coverageTrackHeight !== undefined ? config.coverageTrackHeight : DEFAULT_COVERAGE_TRACK_HEIGHT;
|
|
41902
41959
|
|
|
41903
41960
|
this.paintAxis = paintAxis;
|
|
41904
41961
|
this.top = 0;
|
|
@@ -41913,6 +41970,10 @@ class CoverageTrack {
|
|
|
41913
41970
|
|
|
41914
41971
|
}
|
|
41915
41972
|
|
|
41973
|
+
get height() {
|
|
41974
|
+
return this.parent.coverageTrackHeight
|
|
41975
|
+
}
|
|
41976
|
+
|
|
41916
41977
|
draw(options) {
|
|
41917
41978
|
|
|
41918
41979
|
const pixelTop = options.pixelTop;
|
|
@@ -42659,18 +42720,21 @@ class AlignmentTrack {
|
|
|
42659
42720
|
// TODO if genome supports blat
|
|
42660
42721
|
const seqstring = clickedAlignment.seq;
|
|
42661
42722
|
if (seqstring && "*" != seqstring) {
|
|
42662
|
-
|
|
42663
|
-
|
|
42664
|
-
|
|
42665
|
-
|
|
42666
|
-
|
|
42667
|
-
|
|
42668
|
-
|
|
42669
|
-
|
|
42670
|
-
|
|
42723
|
+
|
|
42724
|
+
if (seqstring.length < maxSequenceSize) {
|
|
42725
|
+
list.push({
|
|
42726
|
+
label: 'BLAT read sequence',
|
|
42727
|
+
click: () => {
|
|
42728
|
+
const sequence = clickedAlignment.isNegativeStrand() ? reverseComplementSequence(seqstring) : seqstring;
|
|
42729
|
+
const name = `${clickedAlignment.readName} - blat`;
|
|
42730
|
+
const title = `${this.parent.name} - ${name}`;
|
|
42731
|
+
createBlatTrack({sequence, browser: this.browser, name, title});
|
|
42732
|
+
}
|
|
42733
|
+
});
|
|
42734
|
+
}
|
|
42671
42735
|
|
|
42672
42736
|
const softClips = clickedAlignment.softClippedBlocks();
|
|
42673
|
-
if (softClips.left && softClips.left.len > MINIMUM_BLAT_LENGTH) {
|
|
42737
|
+
if (softClips.left && softClips.left.len > MINIMUM_BLAT_LENGTH && softClips.left.len < maxSequenceSize) {
|
|
42674
42738
|
list.push({
|
|
42675
42739
|
label: 'BLAT left soft-clipped sequence',
|
|
42676
42740
|
click: () => {
|
|
@@ -42682,7 +42746,7 @@ class AlignmentTrack {
|
|
|
42682
42746
|
}
|
|
42683
42747
|
});
|
|
42684
42748
|
}
|
|
42685
|
-
if (softClips.right && softClips.right.
|
|
42749
|
+
if (softClips.right && softClips.right.len > MINIMUM_BLAT_LENGTH && softClips.right.len < maxSequenceSize) {
|
|
42686
42750
|
list.push({
|
|
42687
42751
|
label: 'BLAT right soft-clipped sequence',
|
|
42688
42752
|
click: () => {
|
|
@@ -44604,25 +44668,34 @@ function renderSVGAxis(context, track, axisCanvas, deltaX, deltaY) {
|
|
|
44604
44668
|
* THE SOFTWARE.
|
|
44605
44669
|
*/
|
|
44606
44670
|
|
|
44607
|
-
const DEFAULT_COLOR = "rgb(150,150,150)";
|
|
44608
|
-
|
|
44609
44671
|
class WigTrack extends TrackBase {
|
|
44610
44672
|
|
|
44673
|
+
static defaults = {
|
|
44674
|
+
height: 50,
|
|
44675
|
+
color: 'rgb(150, 150, 150)',
|
|
44676
|
+
altColor: 'rgb(150, 150, 150)',
|
|
44677
|
+
flipAxis: false,
|
|
44678
|
+
logScale: false,
|
|
44679
|
+
windowFunction: 'mean',
|
|
44680
|
+
graphType: 'bar',
|
|
44681
|
+
autoscale: true,
|
|
44682
|
+
normalize: undefined,
|
|
44683
|
+
scaleFactor: undefined
|
|
44684
|
+
}
|
|
44685
|
+
|
|
44611
44686
|
constructor(config, browser) {
|
|
44612
44687
|
super(config, browser);
|
|
44613
44688
|
}
|
|
44614
44689
|
|
|
44615
44690
|
init(config) {
|
|
44691
|
+
|
|
44616
44692
|
super.init(config);
|
|
44617
44693
|
|
|
44618
44694
|
this.type = "wig";
|
|
44619
|
-
this.height = config.height || 50;
|
|
44620
44695
|
this.featureType = 'numeric';
|
|
44621
44696
|
this.paintAxis = paintAxis;
|
|
44622
44697
|
|
|
44623
44698
|
const format = config.format ? config.format.toLowerCase() : config.format;
|
|
44624
|
-
this.flipAxis = config.flipAxis ? config.flipAxis : false;
|
|
44625
|
-
this.logScale = config.logScale ? config.logScale : false;
|
|
44626
44699
|
if (config.featureSource) {
|
|
44627
44700
|
this.featureSource = config.featureSource;
|
|
44628
44701
|
delete config.featureSource;
|
|
@@ -44634,18 +44707,16 @@ class WigTrack extends TrackBase {
|
|
|
44634
44707
|
this.featureSource = FeatureSource(config, this.browser.genome);
|
|
44635
44708
|
}
|
|
44636
44709
|
|
|
44637
|
-
|
|
44638
|
-
|
|
44710
|
+
|
|
44711
|
+
// Override autoscale default
|
|
44712
|
+
if(config.max === undefined || config.autoscale === true) {
|
|
44713
|
+
this.autoscale = true;
|
|
44714
|
+
} else {
|
|
44639
44715
|
this.dataRange = {
|
|
44640
44716
|
min: config.min || 0,
|
|
44641
44717
|
max: config.max
|
|
44642
44718
|
};
|
|
44643
44719
|
}
|
|
44644
|
-
|
|
44645
|
-
this.windowFunction = config.windowFunction || "mean";
|
|
44646
|
-
this.graphType = config.graphType || "bar";
|
|
44647
|
-
this.normalize = config.normalize; // boolean, for use with "TDF" files
|
|
44648
|
-
this.scaleFactor = config.scaleFactor; // optional scale factor, ignored if normalize === true;
|
|
44649
44720
|
}
|
|
44650
44721
|
|
|
44651
44722
|
async postInit() {
|
|
@@ -44735,7 +44806,7 @@ class WigTrack extends TrackBase {
|
|
|
44735
44806
|
const pixelWidth = options.pixelWidth;
|
|
44736
44807
|
options.pixelHeight;
|
|
44737
44808
|
const bpEnd = bpStart + pixelWidth * bpPerPixel + 1;
|
|
44738
|
-
const posColor = this.color ||
|
|
44809
|
+
const posColor = this.color || WigTrack.defaults.color;
|
|
44739
44810
|
|
|
44740
44811
|
let baselineColor;
|
|
44741
44812
|
if (typeof posColor === "string" && posColor.startsWith("rgb(")) {
|
|
@@ -44879,7 +44950,7 @@ class WigTrack extends TrackBase {
|
|
|
44879
44950
|
*/
|
|
44880
44951
|
|
|
44881
44952
|
getColorForFeature(f) {
|
|
44882
|
-
let c = (f.value < 0 && this.altColor) ? this.altColor : this.color ||
|
|
44953
|
+
let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || WigTrack.defaults.color;
|
|
44883
44954
|
return (typeof c === "function") ? c(f.value) : c
|
|
44884
44955
|
}
|
|
44885
44956
|
|
|
@@ -44890,20 +44961,6 @@ class WigTrack extends TrackBase {
|
|
|
44890
44961
|
this.trackView = undefined;
|
|
44891
44962
|
}
|
|
44892
44963
|
|
|
44893
|
-
/**
|
|
44894
|
-
* Return the current state of the track. Used to create sessions and bookmarks.
|
|
44895
|
-
*
|
|
44896
|
-
* @returns {*|{}}
|
|
44897
|
-
*/
|
|
44898
|
-
getState() {
|
|
44899
|
-
|
|
44900
|
-
const config = super.getState();
|
|
44901
|
-
|
|
44902
|
-
if (this.flipAxis !== undefined) config.flipAxis = this.flipAxis;
|
|
44903
|
-
if (this.logScale !== undefined) config.logScale = this.logScale;
|
|
44904
|
-
|
|
44905
|
-
return config
|
|
44906
|
-
}
|
|
44907
44964
|
}
|
|
44908
44965
|
|
|
44909
44966
|
/**
|
|
@@ -45791,6 +45848,17 @@ const DEFAULT_ARC_COLOR = "rgb(180,25,137)";
|
|
|
45791
45848
|
|
|
45792
45849
|
class InteractionTrack extends TrackBase {
|
|
45793
45850
|
|
|
45851
|
+
static defaults = {
|
|
45852
|
+
height: 250,
|
|
45853
|
+
theta: Math.PI / 4,
|
|
45854
|
+
arcOrientation: true,
|
|
45855
|
+
showBlocks: true,
|
|
45856
|
+
blockHeight: 3,
|
|
45857
|
+
thickness: 1,
|
|
45858
|
+
alpha: 0.02,
|
|
45859
|
+
logScale: true,
|
|
45860
|
+
}
|
|
45861
|
+
|
|
45794
45862
|
constructor(config, browser) {
|
|
45795
45863
|
super(config, browser);
|
|
45796
45864
|
}
|
|
@@ -45798,16 +45866,10 @@ class InteractionTrack extends TrackBase {
|
|
|
45798
45866
|
init(config) {
|
|
45799
45867
|
|
|
45800
45868
|
super.init(config);
|
|
45801
|
-
|
|
45869
|
+
|
|
45802
45870
|
this.sinTheta = Math.sin(this.theta);
|
|
45803
45871
|
this.cosTheta = Math.cos(this.theta);
|
|
45804
|
-
this.height = config.height || 250;
|
|
45805
45872
|
this.arcType = getArcType(config); // nested | proportional | inView | partialInView
|
|
45806
|
-
this.arcOrientation = (config.arcOrientation === undefined ? true : config.arcOrientation); // true for up, false for down
|
|
45807
|
-
this.showBlocks = config.showBlocks === undefined ? true : config.showBlocks;
|
|
45808
|
-
this.blockHeight = config.blockHeight || 3;
|
|
45809
|
-
this.thickness = config.thickness || 1;
|
|
45810
|
-
this.color = config.color;
|
|
45811
45873
|
this.alpha = config.alpha || 0.02; // was: 0.15
|
|
45812
45874
|
this.painter = {flipAxis: !this.arcOrientation, dataRange: this.dataRange, paintAxis: paintAxis};
|
|
45813
45875
|
|
|
@@ -45819,7 +45881,6 @@ class InteractionTrack extends TrackBase {
|
|
|
45819
45881
|
this.valueColumn = "score";
|
|
45820
45882
|
}
|
|
45821
45883
|
|
|
45822
|
-
this.logScale = config.logScale !== false; // i.e. defaul to true (undefined => true)
|
|
45823
45884
|
if (config.max) {
|
|
45824
45885
|
this.dataRange = {
|
|
45825
45886
|
min: config.min || 0,
|
|
@@ -45844,7 +45905,7 @@ class InteractionTrack extends TrackBase {
|
|
|
45844
45905
|
|
|
45845
45906
|
if (typeof this.featureSource.getHeader === "function") {
|
|
45846
45907
|
this.header = await this.featureSource.getHeader();
|
|
45847
|
-
if(this.disposed) return; // This track was removed during async load
|
|
45908
|
+
if (this.disposed) return; // This track was removed during async load
|
|
45848
45909
|
}
|
|
45849
45910
|
|
|
45850
45911
|
// Set properties from track line
|
|
@@ -45917,7 +45978,7 @@ class InteractionTrack extends TrackBase {
|
|
|
45917
45978
|
feature.drawState = undefined;
|
|
45918
45979
|
|
|
45919
45980
|
let color;
|
|
45920
|
-
if(typeof this.color === 'function') {
|
|
45981
|
+
if (typeof this.color === 'function') {
|
|
45921
45982
|
color = this.color(feature);
|
|
45922
45983
|
} else {
|
|
45923
45984
|
color = this.color || feature.color || DEFAULT_ARC_COLOR;
|
|
@@ -46262,7 +46323,7 @@ class InteractionTrack extends TrackBase {
|
|
|
46262
46323
|
contextMenuItemList(clickState) {
|
|
46263
46324
|
|
|
46264
46325
|
// Experimental JBrowse feature
|
|
46265
|
-
if (this.browser.circularView
|
|
46326
|
+
if (this.browser.circularView) {
|
|
46266
46327
|
const viewport = clickState.viewport;
|
|
46267
46328
|
const list = [];
|
|
46268
46329
|
|
|
@@ -46291,7 +46352,7 @@ class InteractionTrack extends TrackBase {
|
|
|
46291
46352
|
|
|
46292
46353
|
// inView features are simply features that have been drawn, i.e. have a drawState
|
|
46293
46354
|
const inView = cachedFeatures.filter(f => f.drawState);
|
|
46294
|
-
if(inView.length === 0) return;
|
|
46355
|
+
if (inView.length === 0) return;
|
|
46295
46356
|
|
|
46296
46357
|
const chords = makeBedPEChords(inView);
|
|
46297
46358
|
sendChords(chords, this, refFrame, 0.5);
|
|
@@ -46327,7 +46388,7 @@ class InteractionTrack extends TrackBase {
|
|
|
46327
46388
|
|
|
46328
46389
|
popupData(clickState, features) {
|
|
46329
46390
|
|
|
46330
|
-
if(features === undefined) features = this.clickedFeatures(clickState);
|
|
46391
|
+
if (features === undefined) features = this.clickedFeatures(clickState);
|
|
46331
46392
|
|
|
46332
46393
|
const data = [];
|
|
46333
46394
|
for (let feature of features) {
|
|
@@ -46351,7 +46412,7 @@ class InteractionTrack extends TrackBase {
|
|
|
46351
46412
|
const columnNames = this.header.columnNames;
|
|
46352
46413
|
const stdColumns = this.header.hiccups ? 6 : 10;
|
|
46353
46414
|
for (let i = stdColumns; i < columnNames.length; i++) {
|
|
46354
|
-
if(this.header.colorColumn === i) continue;
|
|
46415
|
+
if (this.header.colorColumn === i) continue;
|
|
46355
46416
|
if (columnNames[i] === 'info') {
|
|
46356
46417
|
extractInfoColumn(data, f.extras[i - stdColumns]);
|
|
46357
46418
|
} else {
|
|
@@ -46373,7 +46434,7 @@ class InteractionTrack extends TrackBase {
|
|
|
46373
46434
|
|
|
46374
46435
|
// We use the cached features rather than method to avoid async load. If the
|
|
46375
46436
|
// feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
|
|
46376
|
-
const featureList =
|
|
46437
|
+
const featureList = clickState.viewport.cachedFeatures;
|
|
46377
46438
|
const candidates = [];
|
|
46378
46439
|
if (featureList) {
|
|
46379
46440
|
const proportional = (this.arcType === "proportional" || this.arcType === "inView" || this.arcType === "partialInView");
|
|
@@ -46419,26 +46480,6 @@ class InteractionTrack extends TrackBase {
|
|
|
46419
46480
|
}
|
|
46420
46481
|
return candidates.map((c) => c.feature)
|
|
46421
46482
|
}
|
|
46422
|
-
|
|
46423
|
-
/**
|
|
46424
|
-
* Return the current state of the track. Used to create sessions and bookmarks.
|
|
46425
|
-
*
|
|
46426
|
-
* @returns {*|{}}
|
|
46427
|
-
*/
|
|
46428
|
-
getState() {
|
|
46429
|
-
|
|
46430
|
-
const config = super.getState();
|
|
46431
|
-
|
|
46432
|
-
// if (this.height !== undefined) config.height = this.height;
|
|
46433
|
-
if (this.arcType !== undefined) config.arcType = this.arcType;
|
|
46434
|
-
if (this.arcOrientation !== undefined) config.arcOrientation = this.arcOrientation;
|
|
46435
|
-
if (this.showBlocks !== undefined) config.showBlocks = this.showBlocks;
|
|
46436
|
-
if (this.blockHeight !== undefined) config.blockHeight = this.blockHeight;
|
|
46437
|
-
if (this.thickness !== undefined) config.thickness = this.thickness;
|
|
46438
|
-
if (this.alpha !== undefined) config.alpha = this.alpha;
|
|
46439
|
-
|
|
46440
|
-
return config
|
|
46441
|
-
}
|
|
46442
46483
|
}
|
|
46443
46484
|
|
|
46444
46485
|
function getMidpoints(feature, genome) {
|
|
@@ -46645,6 +46686,31 @@ const STANDARD_FIELDS = new Map([["REF", "referenceBases"], ["ALT", "alternateBa
|
|
|
46645
46686
|
|
|
46646
46687
|
class VariantTrack extends TrackBase {
|
|
46647
46688
|
|
|
46689
|
+
static defaults = {
|
|
46690
|
+
displayMode: "EXPANDED",
|
|
46691
|
+
sortDirection: "ASC",
|
|
46692
|
+
showGenotypes: true,
|
|
46693
|
+
squishedVariantHeight: 2,
|
|
46694
|
+
squishedCallHeight: 1,
|
|
46695
|
+
expandedCallHeight: 10,
|
|
46696
|
+
expandedVGap: 2,
|
|
46697
|
+
squishedVGap: 1,
|
|
46698
|
+
expandedGroupGap: 10,
|
|
46699
|
+
squishedGroupGap: 5,
|
|
46700
|
+
featureHeight: 14,
|
|
46701
|
+
noGenotypeColor: "rgb(200,180,180)",
|
|
46702
|
+
noCallColor: "rgb(225, 225, 225)",
|
|
46703
|
+
nonRefColor: "rgb(200, 200, 215)",
|
|
46704
|
+
mixedColor: "rgb(200, 220, 200)",
|
|
46705
|
+
homrefColor: "rgb(200, 200, 200)",
|
|
46706
|
+
homvarColor: "rgb(17,248,254)",
|
|
46707
|
+
hetvarColor: "rgb(34,12,253)",
|
|
46708
|
+
colorBy: undefined,
|
|
46709
|
+
visibilityWindow: undefined,
|
|
46710
|
+
labelDisplayMode: undefined,
|
|
46711
|
+
type: "variant"
|
|
46712
|
+
}
|
|
46713
|
+
|
|
46648
46714
|
constructor(config, browser) {
|
|
46649
46715
|
super(config, browser);
|
|
46650
46716
|
}
|
|
@@ -46653,41 +46719,18 @@ class VariantTrack extends TrackBase {
|
|
|
46653
46719
|
|
|
46654
46720
|
super.init(config);
|
|
46655
46721
|
|
|
46656
|
-
this.visibilityWindow = config.visibilityWindow;
|
|
46657
|
-
this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
|
|
46658
|
-
this.labelDisplayMode = config.labelDisplayMode;
|
|
46659
46722
|
this.expandedVariantHeight = config.expandedVariantHeight || config.variantHeight || 10;
|
|
46660
|
-
|
|
46661
|
-
this.squishedCallHeight = config.squishedCallHeight || 1;
|
|
46662
|
-
this.expandedCallHeight = config.expandedCallHeight || 10;
|
|
46663
|
-
this.expandedVGap = config.expandedVGap !== undefined ? config.expandedVGap : 2;
|
|
46664
|
-
this.squishedVGap = config.squishedVGap !== undefined ? config.squishedVGap : 1;
|
|
46665
|
-
this.expandedGroupGap = config.expandedGroupGap || 10;
|
|
46666
|
-
this.squishedGroupGap = config.squishedGroupGap || 5;
|
|
46667
|
-
this.featureHeight = config.featureHeight || 14;
|
|
46668
|
-
this.visibilityWindow = config.visibilityWindow;
|
|
46723
|
+
|
|
46669
46724
|
this.featureSource = FeatureSource(config, this.browser.genome);
|
|
46670
|
-
|
|
46671
|
-
this.noCallColor = config.noCallColor || "rgb(225, 225, 225)";
|
|
46672
|
-
this.nonRefColor = config.nonRefColor || "rgb(200, 200, 215)";
|
|
46673
|
-
this.mixedColor = config.mixedColor || "rgb(200, 220, 200)";
|
|
46674
|
-
this.homrefColor = config.homrefColor || "rgb(200, 200, 200)";
|
|
46675
|
-
this.homvarColor = config.homvarColor || "rgb(17,248,254)";
|
|
46676
|
-
this.hetvarColor = config.hetvarColor || "rgb(34,12,253)";
|
|
46677
|
-
this.sortDirection = "ASC";
|
|
46678
|
-
this.type = config.type || "variant";
|
|
46679
|
-
|
|
46680
|
-
this.colorBy = config.colorBy; // Can be undefined => default
|
|
46725
|
+
|
|
46681
46726
|
this._initColorBy = config.colorBy;
|
|
46682
46727
|
if (config.colorTable) {
|
|
46683
46728
|
this.colorTables = new Map();
|
|
46684
46729
|
this.colorTables.set(config.colorBy, new ColorTable(config.colorTable));
|
|
46685
46730
|
}
|
|
46686
|
-
|
|
46687
46731
|
this._strokecolor = config.strokecolor;
|
|
46688
46732
|
this._context_hook = config.context_hook;
|
|
46689
46733
|
|
|
46690
|
-
this.showGenotypes = config.showGenotypes === undefined ? true : config.showGenotypes;
|
|
46691
46734
|
|
|
46692
46735
|
// The number of variant rows are computed dynamically, but start with "1" by default
|
|
46693
46736
|
this.variantRowCount(1);
|
|
@@ -46697,7 +46740,7 @@ class VariantTrack extends TrackBase {
|
|
|
46697
46740
|
async postInit() {
|
|
46698
46741
|
|
|
46699
46742
|
this.header = await this.getHeader(); // cricital, don't remove'
|
|
46700
|
-
if(this.disposed) return
|
|
46743
|
+
if (this.disposed) return // This track was removed during async load
|
|
46701
46744
|
if (undefined === this.visibilityWindow && this.config.indexed !== false) {
|
|
46702
46745
|
const fn = isFile(this.config.url) ? this.config.url.name : this.config.url;
|
|
46703
46746
|
if (isString(fn) && fn.toLowerCase().includes("gnomad")) {
|
|
@@ -46800,7 +46843,7 @@ class VariantTrack extends TrackBase {
|
|
|
46800
46843
|
this.variantBandHeight = TOP_MARGIN + rowCount * (variantHeight + vGap);
|
|
46801
46844
|
|
|
46802
46845
|
let callSets = this.callSets;
|
|
46803
|
-
if(!callSets && this._f) {
|
|
46846
|
+
if (!callSets && this._f) {
|
|
46804
46847
|
callSets = this._f.callSets; // "Complementary" variant for structural variants
|
|
46805
46848
|
}
|
|
46806
46849
|
const nCalls = this.getCallsetsLength();
|
|
@@ -46840,9 +46883,9 @@ class VariantTrack extends TrackBase {
|
|
|
46840
46883
|
|
|
46841
46884
|
//only paint stroke if a color is defined
|
|
46842
46885
|
let strokecolor = this.getVariantStrokecolor(variant);
|
|
46843
|
-
if (strokecolor){
|
|
46844
|
-
|
|
46845
|
-
|
|
46886
|
+
if (strokecolor) {
|
|
46887
|
+
context.strokeStyle = strokecolor;
|
|
46888
|
+
context.strokeRect(x, y, w, h);
|
|
46846
46889
|
}
|
|
46847
46890
|
|
|
46848
46891
|
// call hook if _context_hook fn is defined
|
|
@@ -46858,7 +46901,7 @@ class VariantTrack extends TrackBase {
|
|
|
46858
46901
|
this.sampleHeight = nVariantRows * (callHeight + vGap); // For each sample, there is a call for each variant at this position
|
|
46859
46902
|
|
|
46860
46903
|
let sampleNumber = 0;
|
|
46861
|
-
if(callSets && variant.calls) {
|
|
46904
|
+
if (callSets && variant.calls) {
|
|
46862
46905
|
for (let callSet of callSets) {
|
|
46863
46906
|
const call = variant.calls[callSet.id];
|
|
46864
46907
|
if (call) {
|
|
@@ -46934,13 +46977,12 @@ class VariantTrack extends TrackBase {
|
|
|
46934
46977
|
} else if ("MIXED" === v.type) {
|
|
46935
46978
|
variantColor = this.mixedColor;
|
|
46936
46979
|
} else {
|
|
46937
|
-
variantColor = this.
|
|
46980
|
+
variantColor = this.color;
|
|
46938
46981
|
}
|
|
46939
46982
|
return variantColor
|
|
46940
46983
|
}
|
|
46941
46984
|
|
|
46942
46985
|
|
|
46943
|
-
|
|
46944
46986
|
getVariantStrokecolor(variant) {
|
|
46945
46987
|
|
|
46946
46988
|
const v = variant._f || variant;
|
|
@@ -46956,13 +46998,13 @@ class VariantTrack extends TrackBase {
|
|
|
46956
46998
|
|
|
46957
46999
|
callContextHook(variant, context, x, y, w, h) {
|
|
46958
47000
|
if (this._context_hook) {
|
|
46959
|
-
|
|
46960
|
-
|
|
47001
|
+
if (typeof this._context_hook === "function") {
|
|
47002
|
+
const v = variant._f || variant;
|
|
46961
47003
|
|
|
46962
|
-
|
|
46963
|
-
|
|
46964
|
-
|
|
46965
|
-
|
|
47004
|
+
context.save();
|
|
47005
|
+
this._context_hook(v, context, x, y, w, h);
|
|
47006
|
+
context.restore();
|
|
47007
|
+
}
|
|
46966
47008
|
}
|
|
46967
47009
|
}
|
|
46968
47010
|
|
|
@@ -47006,7 +47048,7 @@ class VariantTrack extends TrackBase {
|
|
|
47006
47048
|
*/
|
|
47007
47049
|
popupData(clickState, featureList) {
|
|
47008
47050
|
|
|
47009
|
-
if(featureList === undefined) featureList = this.clickedFeatures(clickState);
|
|
47051
|
+
if (featureList === undefined) featureList = this.clickedFeatures(clickState);
|
|
47010
47052
|
const genomicLocation = clickState.genomicLocation;
|
|
47011
47053
|
const genomeID = this.browser.genome.id;
|
|
47012
47054
|
const sampleInformation = this.browser.sampleInformation;
|
|
@@ -47234,12 +47276,12 @@ class VariantTrack extends TrackBase {
|
|
|
47234
47276
|
sendChordsForViewport(viewport) {
|
|
47235
47277
|
const refFrame = viewport.referenceFrame;
|
|
47236
47278
|
let inView;
|
|
47237
|
-
if("all" === refFrame.chr) {
|
|
47279
|
+
if ("all" === refFrame.chr) {
|
|
47238
47280
|
const all = this.featureSource.getAllFeatures();
|
|
47239
47281
|
const arrays = Object.keys(all).map(k => all[k]);
|
|
47240
47282
|
inView = [].concat(...arrays);
|
|
47241
47283
|
} else {
|
|
47242
|
-
|
|
47284
|
+
inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
|
|
47243
47285
|
|
|
47244
47286
|
}
|
|
47245
47287
|
|
|
@@ -57477,7 +57519,7 @@ async function search(browser, string) {
|
|
|
57477
57519
|
let locusObject = parseLocusString(browser, locus);
|
|
57478
57520
|
|
|
57479
57521
|
if (!locusObject) {
|
|
57480
|
-
const feature = browser.genome.featureDB
|
|
57522
|
+
const feature = browser.genome.featureDB.get(locus.toUpperCase());
|
|
57481
57523
|
if (feature) {
|
|
57482
57524
|
locusObject = {
|
|
57483
57525
|
chr: feature.chr,
|
|
@@ -59330,7 +59372,7 @@ class ROITable extends RegionTableBase {
|
|
|
59330
59372
|
|
|
59331
59373
|
renderTable(records) {
|
|
59332
59374
|
|
|
59333
|
-
Array.from(this.
|
|
59375
|
+
Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
|
|
59334
59376
|
|
|
59335
59377
|
if (records.length > 0) {
|
|
59336
59378
|
|
|
@@ -59338,7 +59380,7 @@ class ROITable extends RegionTableBase {
|
|
|
59338
59380
|
|
|
59339
59381
|
for (let record of sortedRecords) {
|
|
59340
59382
|
const row = this.tableRowDOM(record);
|
|
59341
|
-
this.
|
|
59383
|
+
this.tableRowContainer.appendChild(row);
|
|
59342
59384
|
}
|
|
59343
59385
|
|
|
59344
59386
|
}
|
|
@@ -59378,14 +59420,14 @@ class ROITable extends RegionTableBase {
|
|
|
59378
59420
|
|
|
59379
59421
|
event.stopPropagation();
|
|
59380
59422
|
|
|
59381
|
-
const selected = this.
|
|
59423
|
+
const selected = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
|
|
59382
59424
|
const loci = [];
|
|
59383
59425
|
for (let el of selected) {
|
|
59384
59426
|
const { locus } = parseRegionKey(el.dataset.region);
|
|
59385
59427
|
loci.push(locus);
|
|
59386
59428
|
}
|
|
59387
59429
|
|
|
59388
|
-
for (let el of this.
|
|
59430
|
+
for (let el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
|
|
59389
59431
|
el.classList.remove('igv-roi-table-row-selected');
|
|
59390
59432
|
}
|
|
59391
59433
|
|
|
@@ -60923,6 +60965,7 @@ class Browser {
|
|
|
60923
60965
|
|
|
60924
60966
|
updateLocusSearchWidget() {
|
|
60925
60967
|
|
|
60968
|
+
if(!this.referenceFrameList) return
|
|
60926
60969
|
const referenceFrameList = this.referenceFrameList;
|
|
60927
60970
|
|
|
60928
60971
|
// Update end position of reference frames based on pixel widths. This is hacky, but its been done here
|
|
@@ -60976,6 +61019,8 @@ class Browser {
|
|
|
60976
61019
|
|
|
60977
61020
|
async zoomWithScaleFactor(scaleFactor, centerBPOrUndefined, referenceFrameOrUndefined) {
|
|
60978
61021
|
|
|
61022
|
+
if(!this.referenceFrameList) return
|
|
61023
|
+
|
|
60979
61024
|
const viewportWidth = this.calculateViewportWidth(this.referenceFrameList.length);
|
|
60980
61025
|
|
|
60981
61026
|
let referenceFrames = referenceFrameOrUndefined ? [referenceFrameOrUndefined] : this.referenceFrameList;
|
|
@@ -60994,6 +61039,8 @@ class Browser {
|
|
|
60994
61039
|
*/
|
|
60995
61040
|
async addMultiLocusPanel(chr, start, end, referenceFrameLeft) {
|
|
60996
61041
|
|
|
61042
|
+
if(!this.referenceFrameList) return
|
|
61043
|
+
|
|
60997
61044
|
// account for reduced viewport width as a result of adding right mate pair panel
|
|
60998
61045
|
const viewportWidth = this.calculateViewportWidth(1 + this.referenceFrameList.length);
|
|
60999
61046
|
const scaleFactor = this.calculateViewportWidth(this.referenceFrameList.length) / this.calculateViewportWidth(1 + this.referenceFrameList.length);
|
|
@@ -61607,6 +61654,8 @@ class Browser {
|
|
|
61607
61654
|
*/
|
|
61608
61655
|
async function resize() {
|
|
61609
61656
|
|
|
61657
|
+
if(!this.referenceFrameList) return
|
|
61658
|
+
|
|
61610
61659
|
const viewportWidth = this.calculateViewportWidth(this.referenceFrameList.length);
|
|
61611
61660
|
|
|
61612
61661
|
for (let referenceFrame of this.referenceFrameList) {
|
|
@@ -62011,7 +62060,7 @@ async function createTrack(config, browser) {
|
|
|
62011
62060
|
|
|
62012
62061
|
function embedCSS() {
|
|
62013
62062
|
|
|
62014
|
-
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: 12px;\n height: 12px;\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: 12px;\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: 12px;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n.igv-multi-locus-ruler-label > div {\n cursor: pointer;\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-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: 50%;\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}\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 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 cursor: default;\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-description {\n height: fit-content;\n padding: 4px;\n margin-left: 4px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-roi-table > .igv-roi-table-goto-explainer {\n margin-left: 4px;\n color: #7F7F7F;\n font-style: italic;\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-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\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: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: #7f7f7f;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\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: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: transparent;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:last-child {\n border-right: unset;\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-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n cursor: pointer;\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 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 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 line-height: 1;\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';
|
|
62063
|
+
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: 12px;\n height: 12px;\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: 12px;\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: 12px;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n.igv-multi-locus-ruler-label > div {\n cursor: pointer;\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-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: 50%;\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}\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 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: min-content;\n max-width: 1600px;\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 cursor: default;\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 white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n margin-left: 4px;\n margin-right: 4px;\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-description {\n padding: 4px;\n margin-left: 4px;\n word-break: break-all;\n overflow-y: auto;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n background-color: transparent;\n}\n.igv-roi-table > .igv-roi-table-goto-explainer {\n margin-top: 5px;\n margin-left: 4px;\n color: #7F7F7F;\n font-style: italic;\n height: 24px;\n border-top: solid lightgray;\n background-color: transparent;\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-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\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: left;\n margin-left: 4px;\n height: 24px;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: #7f7f7f;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n overflow: auto;\n resize: both;\n max-width: 1600px;\n height: 360px;\n background-color: transparent;\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: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: transparent;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:last-child {\n border-right: unset;\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 background-color: #eee;\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 cursor: pointer;\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 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 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 line-height: 1;\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';
|
|
62015
62064
|
|
|
62016
62065
|
var style = document.createElement('style');
|
|
62017
62066
|
style.setAttribute('type', 'text/css');
|