@datagrok-libraries/bio 0.0.6 → 0.0.8
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/.eslintrc.json +29 -7
- package/detectors.js +47 -0
- package/package.json +11 -11
- package/src/aminoacids.d.ts +31 -0
- package/src/aminoacids.d.ts.map +1 -0
- package/src/aminoacids.js +226 -0
- package/src/index.d.ts +7 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +6 -0
- package/src/index.ts +8 -0
- package/src/nucleotides.d.ts +12 -0
- package/src/nucleotides.d.ts.map +1 -0
- package/src/nucleotides.js +27 -0
- package/src/package.d.ts +1 -0
- package/src/package.d.ts.map +1 -0
- package/src/package.js +2 -0
- package/src/seq-palettes.d.ts +16 -0
- package/src/seq-palettes.d.ts.map +1 -0
- package/src/seq-palettes.js +38 -0
- package/src/viewers/web-logo.d.ts +67 -0
- package/src/viewers/web-logo.d.ts.map +1 -0
- package/src/viewers/web-logo.js +345 -0
package/.eslintrc.json
CHANGED
|
@@ -6,10 +6,14 @@
|
|
|
6
6
|
"extends": [
|
|
7
7
|
"google"
|
|
8
8
|
],
|
|
9
|
+
"parser": "@typescript-eslint/parser",
|
|
9
10
|
"parserOptions": {
|
|
10
11
|
"ecmaVersion": 12,
|
|
11
12
|
"sourceType": "module"
|
|
12
13
|
},
|
|
14
|
+
"plugins": [
|
|
15
|
+
"@typescript-eslint"
|
|
16
|
+
],
|
|
13
17
|
"rules": {
|
|
14
18
|
"indent": [
|
|
15
19
|
"error",
|
|
@@ -19,11 +23,29 @@
|
|
|
19
23
|
"error",
|
|
20
24
|
120
|
|
21
25
|
],
|
|
26
|
+
"no-unused-vars": "warn",
|
|
22
27
|
"require-jsdoc": "off",
|
|
23
|
-
"spaced-comment": "off"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
"spaced-comment": "off",
|
|
29
|
+
"linebreak-style": "off",
|
|
30
|
+
"curly": [
|
|
31
|
+
"error",
|
|
32
|
+
"multi-or-nest",
|
|
33
|
+
"consistent"
|
|
34
|
+
],
|
|
35
|
+
"brace-style": [
|
|
36
|
+
"error",
|
|
37
|
+
"1tbs",
|
|
38
|
+
{
|
|
39
|
+
"allowSingleLine": true
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"block-spacing": [2, "always"],
|
|
43
|
+
"comma-dangle": ["error", {
|
|
44
|
+
"arrays": "only-multiline",
|
|
45
|
+
"functions": "never",
|
|
46
|
+
"objects": "only-multiline",
|
|
47
|
+
"imports": "only-multiline"
|
|
48
|
+
}],
|
|
49
|
+
"guard-for-in": "off"
|
|
50
|
+
}
|
|
51
|
+
}
|
package/detectors.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import * as grok from 'datagrok-api/grok';
|
|
2
|
+
import * as ui from 'datagrok-api/ui';
|
|
3
|
+
import * as DG from 'datagrok-api/dg';
|
|
4
|
+
import {Aminoacids} from './src/aminoacids';
|
|
5
|
+
import {Nucleotides} from './src/nucleotides';
|
|
6
|
+
|
|
1
7
|
/**
|
|
2
8
|
* The class contains semantic type detectors.
|
|
3
9
|
* Detectors are functions tagged with `DG.FUNC_TYPES.SEM_TYPE_DETECTOR`.
|
|
@@ -6,4 +12,45 @@
|
|
|
6
12
|
* Follow this naming convention to ensure that your detectors are properly loaded.
|
|
7
13
|
*/
|
|
8
14
|
class BioPackageDetectors extends DG.Package {
|
|
15
|
+
//tags: semTypeDetector
|
|
16
|
+
//input: column col
|
|
17
|
+
//output: string semType
|
|
18
|
+
detectNucleotidesSeq(col) {
|
|
19
|
+
const alphabet = Nucleotides.Names + {'-': 'gap'};
|
|
20
|
+
return DG.Detector.sampleCategories(col, (s) => {
|
|
21
|
+
return s.split('').every((n) => n in alphabet);
|
|
22
|
+
}) ? Nucleotides.SemType : null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
//tags: semTypeDetector
|
|
26
|
+
//input: column col
|
|
27
|
+
//output: string semType
|
|
28
|
+
detectAminoacidsSeq(col) {
|
|
29
|
+
const alphabet = Aminoacids.Names + {'-': 'gap'};
|
|
30
|
+
return DG.Detector.sampleCategories(col, (s) => {
|
|
31
|
+
return s.split('').every((aa) => aa in alphabet);
|
|
32
|
+
}) ? Aminoacids.SemType : null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
//tags: semTypeDetector
|
|
36
|
+
//input: column col
|
|
37
|
+
//output: string semType
|
|
38
|
+
detectMultipleAlignmentNucleotidesSeq(col) {
|
|
39
|
+
const alphabet = Nucleotides.Names + {'-': 'gap'};
|
|
40
|
+
const len = col.get(0).length;
|
|
41
|
+
return DG.Detector.sampleCategories(col, (s) => {
|
|
42
|
+
return s.length == len && s.split('').every((n) => n in alphabet);
|
|
43
|
+
}) ? Nucleotides.SemTypeMultipleAlignment : null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
//tags: semTypeDetector
|
|
47
|
+
//input: column col
|
|
48
|
+
//output: string semType
|
|
49
|
+
detectMultipleAlignmentAminoacidsSeq(col) {
|
|
50
|
+
const alphabet = Aminoacids.Names + {'-': 'gap'};
|
|
51
|
+
const len = col.get(0).length;
|
|
52
|
+
return DG.Detector.sampleCategories(col, (s) => {
|
|
53
|
+
return s.length == len && s.split('').every((aa) => aa in alphabet);
|
|
54
|
+
}) ? Aminoacids.SemTypeMultipleAlignment : null;
|
|
55
|
+
}
|
|
9
56
|
}
|
package/package.json
CHANGED
|
@@ -5,23 +5,23 @@
|
|
|
5
5
|
},
|
|
6
6
|
"beta": true,
|
|
7
7
|
"friendlyName": "Datagrok bio library",
|
|
8
|
-
"version": "0.0.
|
|
8
|
+
"version": "0.0.8",
|
|
9
9
|
"description": "",
|
|
10
|
+
"main": "src/index.ts",
|
|
10
11
|
"dependencies": {
|
|
11
|
-
"datagrok-api": ">=0.108.0",
|
|
12
12
|
"@datagrok-libraries/utils": ">=0.0.22",
|
|
13
13
|
"cash-dom": "latest",
|
|
14
|
-
"
|
|
14
|
+
"datagrok-api": ">=0.108.0",
|
|
15
|
+
"dayjs": "latest",
|
|
16
|
+
"rxjs": "^6.5.5"
|
|
15
17
|
},
|
|
16
18
|
"devDependencies": {
|
|
17
|
-
"typescript": "^4.2.3",
|
|
18
|
-
"ts-loader": "^9.2.6",
|
|
19
|
-
"webpack": "latest",
|
|
20
|
-
"webpack-cli": "latest",
|
|
21
19
|
"@typescript-eslint/eslint-plugin": "^4.29.1",
|
|
22
20
|
"@typescript-eslint/parser": "^4.29.1",
|
|
23
|
-
"eslint": "
|
|
24
|
-
"eslint-config-google": "
|
|
21
|
+
"eslint": "latest",
|
|
22
|
+
"eslint-config-google": "latest",
|
|
23
|
+
"ts-loader": "^9.2.6",
|
|
24
|
+
"typescript": "^4.2.3"
|
|
25
25
|
},
|
|
26
26
|
"scripts": {
|
|
27
27
|
"link": "npm link",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"release-bio-public": "grok publish public --rebuild --release",
|
|
37
37
|
"debug-bio-local": "grok publish local --rebuild",
|
|
38
38
|
"release-bio-local": "grok publish local --rebuild --release",
|
|
39
|
-
"lint": "eslint src
|
|
40
|
-
"lint-fix": "eslint src
|
|
39
|
+
"lint": "eslint \"./src/**/*.ts\"",
|
|
40
|
+
"lint-fix": "eslint \"./src/**/*.ts\" --fix"
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { StringDictionary } from '@datagrok-libraries/utils/src/type-declarations';
|
|
2
|
+
import { SeqPalette, SeqPaletteBase } from './seq-palettes';
|
|
3
|
+
export declare class AminoacidsPalettes extends SeqPaletteBase {
|
|
4
|
+
private static lesk;
|
|
5
|
+
static get Lesk(): SeqPalette;
|
|
6
|
+
private static grokGroups;
|
|
7
|
+
static get GrokGroups(): SeqPalette;
|
|
8
|
+
private static rasMol;
|
|
9
|
+
static get RasMol(): SeqPalette;
|
|
10
|
+
}
|
|
11
|
+
export declare class Aminoacids {
|
|
12
|
+
static readonly SemType: string;
|
|
13
|
+
static readonly SemTypeMultipleAlignment: string;
|
|
14
|
+
static undefinedColor: string;
|
|
15
|
+
static Names: StringDictionary;
|
|
16
|
+
static AASmiles: StringDictionary;
|
|
17
|
+
static AASmilesTruncated: StringDictionary;
|
|
18
|
+
/** TODO: Full?
|
|
19
|
+
*/
|
|
20
|
+
static AAFullNames: StringDictionary;
|
|
21
|
+
static getPalette(scheme?: string): SeqPalette;
|
|
22
|
+
/**
|
|
23
|
+
* Returns divided amino acid with its content in the bracket, if the content is number, then its omitted
|
|
24
|
+
*
|
|
25
|
+
* @param {string} c raw amino
|
|
26
|
+
* @return {[string, string]} outer and inner content
|
|
27
|
+
*/
|
|
28
|
+
static getInnerOuter(c: string): [string, string];
|
|
29
|
+
static getColorAAPivot(monomer?: string, scheme?: 'grok'): [string, string, string, number];
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=aminoacids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aminoacids.d.ts","sourceRoot":"","sources":["aminoacids.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,gBAAgB,EAAC,MAAM,iDAAiD,CAAC;AACjF,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,MAAM,gBAAgB,CAAC;AAE1D,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAa;IAEhC,WAAkB,IAAI,IAAI,UAAU,CAWnC;IAED,OAAO,CAAC,MAAM,CAAC,UAAU,CAAa;IAEtC,WAAkB,UAAU,IAAI,UAAU,CAYzC;IAED,OAAO,CAAC,MAAM,CAAC,MAAM,CAAa;IAElC,WAAkB,MAAM,IAAI,UAAU,CA4BrC;CACF;AAED,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAgB;IAE/C,MAAM,CAAC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAiC;IAEjF,MAAM,CAAC,cAAc,SAAsB;IAE3C,OAAc,KAAK,EAAE,gBAAgB,CAqBnC;IAEF,OAAc,QAAQ,EAAE,gBAAgB,CAqBtC;IAEF,OAAc,iBAAiB,EAAE,gBAAgB,CAqB/C;IAEF;OACG;IACH,OAAc,WAAW,EAAE,gBAAgB,CAqBzC;WAEY,UAAU,CAAC,MAAM,GAAE,MAAe,GAAG,UAAU;IAW7D;;;;;OAKG;WACW,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;WAmB1C,eAAe,CAAC,OAAO,GAAE,MAAW,EAAE,MAAM,GAAE,MAAe,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;CA6C/G"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { SeqPaletteBase } from './seq-palettes';
|
|
2
|
+
export class AminoacidsPalettes extends SeqPaletteBase {
|
|
3
|
+
static get Lesk() {
|
|
4
|
+
if (this.lesk === void 0) {
|
|
5
|
+
this.lesk = this.makePalette([
|
|
6
|
+
[['G', 'A', 'S', 'T'], 'orange'],
|
|
7
|
+
[['C', 'V', 'I', 'L', 'P', 'F', 'Y', 'M', 'W'], 'all_green'],
|
|
8
|
+
[['N', 'Q', 'H'], 'magenta'],
|
|
9
|
+
[['D', 'E'], 'red'],
|
|
10
|
+
[['K', 'R'], 'all_blue'],
|
|
11
|
+
]);
|
|
12
|
+
}
|
|
13
|
+
return this.lesk;
|
|
14
|
+
}
|
|
15
|
+
static get GrokGroups() {
|
|
16
|
+
if (this.grokGroups === void 0) {
|
|
17
|
+
this.grokGroups = this.makePalette([
|
|
18
|
+
[['C', 'U'], 'yellow'],
|
|
19
|
+
[['G', 'P'], 'red'],
|
|
20
|
+
[['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'], 'all_green'],
|
|
21
|
+
[['R', 'H', 'K'], 'light_blue'],
|
|
22
|
+
[['D', 'E'], 'dark_blue'],
|
|
23
|
+
[['S', 'T', 'N', 'Q'], 'orange'],
|
|
24
|
+
]);
|
|
25
|
+
}
|
|
26
|
+
return this.grokGroups;
|
|
27
|
+
}
|
|
28
|
+
static get RasMol() {
|
|
29
|
+
if (this.rasMol === void 0) {
|
|
30
|
+
this.rasMol = {
|
|
31
|
+
// http://acces.ens-lyon.fr/biotic/rastop/help/colour.htm
|
|
32
|
+
'D': '#E60A0A',
|
|
33
|
+
'E': '#E60A0A',
|
|
34
|
+
'C': '#E6E600',
|
|
35
|
+
'M': '#E6E600',
|
|
36
|
+
'K': '#145AFF',
|
|
37
|
+
'R': '#145AFF',
|
|
38
|
+
'S': '#FA9600',
|
|
39
|
+
'T': '#FA9600',
|
|
40
|
+
'F': '#3232AA',
|
|
41
|
+
'Y': '#3232AA',
|
|
42
|
+
'N': '#00DCDC',
|
|
43
|
+
'Q': '#00DCDC',
|
|
44
|
+
'G': '#EBEBEB',
|
|
45
|
+
'L': '#0F820F',
|
|
46
|
+
'V': '#0F820F',
|
|
47
|
+
'I': '#0F820F',
|
|
48
|
+
'A': '#C8C8C8',
|
|
49
|
+
'W': '#B45AB4',
|
|
50
|
+
'H': '#8282D2',
|
|
51
|
+
'P': '#DC9682',
|
|
52
|
+
'others': '#BEA06E',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return this.rasMol;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export class Aminoacids {
|
|
59
|
+
static getPalette(scheme = 'grok') {
|
|
60
|
+
switch (scheme) {
|
|
61
|
+
case 'grok':
|
|
62
|
+
return AminoacidsPalettes.GrokGroups;
|
|
63
|
+
case 'lesk':
|
|
64
|
+
return AminoacidsPalettes.Lesk;
|
|
65
|
+
default:
|
|
66
|
+
throw new Error(`ChemPalette: scheme \`${scheme}\` does not exist`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Returns divided amino acid with its content in the bracket, if the content is number, then its omitted
|
|
71
|
+
*
|
|
72
|
+
* @param {string} c raw amino
|
|
73
|
+
* @return {[string, string]} outer and inner content
|
|
74
|
+
*/
|
|
75
|
+
static getInnerOuter(c) {
|
|
76
|
+
let isInner = 0;
|
|
77
|
+
let inner = '';
|
|
78
|
+
let outer = '';
|
|
79
|
+
for (const char of c) {
|
|
80
|
+
if (char == '(')
|
|
81
|
+
isInner++;
|
|
82
|
+
else if (char == ')')
|
|
83
|
+
isInner--;
|
|
84
|
+
else if (isInner)
|
|
85
|
+
inner += char;
|
|
86
|
+
else
|
|
87
|
+
outer += char;
|
|
88
|
+
}
|
|
89
|
+
return !isNaN(parseInt(inner)) ? [outer, ''] : [outer, inner];
|
|
90
|
+
}
|
|
91
|
+
static getColorAAPivot(monomer = '', scheme = 'grok') {
|
|
92
|
+
var _a, _b, _c;
|
|
93
|
+
//const chemPaletteInstance = AAPalettes.GrokGroups();
|
|
94
|
+
const chemPaletteInstance = this.getPalette(scheme);
|
|
95
|
+
let [outerMonomer, innerMonomer] = this.getInnerOuter(monomer);
|
|
96
|
+
outerMonomer = (outerMonomer.length > 6 ? `${outerMonomer.slice(0, 3)}...` : outerMonomer);
|
|
97
|
+
innerMonomer = (innerMonomer.length > 6 ? `${innerMonomer.slice(0, 3)}...` : innerMonomer);
|
|
98
|
+
if (monomer.length == 1 || monomer[1] == '(') {
|
|
99
|
+
const amino = (_a = monomer[0]) === null || _a === void 0 ? void 0 : _a.toUpperCase();
|
|
100
|
+
return amino in chemPaletteInstance ?
|
|
101
|
+
[chemPaletteInstance[amino], amino, innerMonomer, 1] :
|
|
102
|
+
[this.undefinedColor, outerMonomer, innerMonomer, 1];
|
|
103
|
+
}
|
|
104
|
+
if (monomer[0] == 'd' && monomer[1] in chemPaletteInstance) {
|
|
105
|
+
if (monomer.length == 2 || monomer[2] == '(') {
|
|
106
|
+
const amino = (_b = monomer[1]) === null || _b === void 0 ? void 0 : _b.toUpperCase();
|
|
107
|
+
return amino in chemPaletteInstance ?
|
|
108
|
+
[chemPaletteInstance[amino], amino, innerMonomer, 2] :
|
|
109
|
+
[this.undefinedColor, outerMonomer, innerMonomer, 2];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (monomer.substring(0, 3) in this.AAFullNames) {
|
|
113
|
+
if (monomer.length == 3 || monomer[3] == '(') {
|
|
114
|
+
const amino = this.AAFullNames[monomer.substring(0, 3)];
|
|
115
|
+
return amino in chemPaletteInstance ?
|
|
116
|
+
[chemPaletteInstance[amino], amino, innerMonomer, 3] :
|
|
117
|
+
[this.undefinedColor, outerMonomer, innerMonomer, 3];
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (((_c = monomer[0]) === null || _c === void 0 ? void 0 : _c.toLowerCase()) == monomer[0]) {
|
|
121
|
+
if (monomer.substring(1, 3) in this.AAFullNames) {
|
|
122
|
+
if (monomer.length == 4 || monomer[4] == '(') {
|
|
123
|
+
const amino = this.AAFullNames[monomer.substring(1, 3)];
|
|
124
|
+
return amino in chemPaletteInstance ?
|
|
125
|
+
[chemPaletteInstance[amino], amino, innerMonomer, 4] :
|
|
126
|
+
[this.undefinedColor, outerMonomer, innerMonomer, 4];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return [this.undefinedColor, outerMonomer, innerMonomer, 0];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
Aminoacids.SemType = 'Aminoacids';
|
|
134
|
+
Aminoacids.SemTypeMultipleAlignment = 'AminoacidsMultipleAlignment';
|
|
135
|
+
Aminoacids.undefinedColor = 'rgb(100,100,100)';
|
|
136
|
+
Aminoacids.Names = {
|
|
137
|
+
'G': 'Glycine',
|
|
138
|
+
'L': 'Leucine',
|
|
139
|
+
'Y': 'Tyrosine',
|
|
140
|
+
'S': 'Serine',
|
|
141
|
+
'E': 'Glutamic acid',
|
|
142
|
+
'Q': 'Glutamine',
|
|
143
|
+
'D': 'Aspartic acid',
|
|
144
|
+
'N': 'Asparagine',
|
|
145
|
+
'F': 'Phenylalanine',
|
|
146
|
+
'A': 'Alanine',
|
|
147
|
+
'K': 'Lysine',
|
|
148
|
+
'R': 'Arginine',
|
|
149
|
+
'H': 'Histidine',
|
|
150
|
+
'C': 'Cysteine',
|
|
151
|
+
'V': 'Valine',
|
|
152
|
+
'P': 'Proline',
|
|
153
|
+
'W': 'Tryptophan',
|
|
154
|
+
'I': 'Isoleucine',
|
|
155
|
+
'M': 'Methionine',
|
|
156
|
+
'T': 'Threonine',
|
|
157
|
+
};
|
|
158
|
+
Aminoacids.AASmiles = {
|
|
159
|
+
'G': 'NCC(=O)O',
|
|
160
|
+
'L': 'N[C@H](CC(C)C)C(=O)O',
|
|
161
|
+
'Y': 'NC(CC1=CC=C(O)C=C1)C(=O)O',
|
|
162
|
+
'S': 'NC(CO)C(=O)O',
|
|
163
|
+
'E': 'N[C@@H](CCC(O)=O)C(=O)O',
|
|
164
|
+
'Q': 'N[C@@H](CCC(N)=O)C(=O)O',
|
|
165
|
+
'D': 'N[C@@H](CC(O)=O)C(=O)O',
|
|
166
|
+
'N': 'N[C@@H](CC(N)=O)C(=O)O',
|
|
167
|
+
'F': 'NC(CC1=CC=CC=C1)C(=O)O',
|
|
168
|
+
'A': 'N[C@H](C)C(=O)O',
|
|
169
|
+
'K': 'NC(CCCCN)C(=O)O',
|
|
170
|
+
'R': 'N[C@H](CCCNC(=N)C)C(=O)O',
|
|
171
|
+
'H': 'NC(CC1=CN=C[N]1)C(=O)O',
|
|
172
|
+
'C': 'N[C@@H](CS)C(=O)O',
|
|
173
|
+
'V': 'NC(C(C)C)C(=O)O',
|
|
174
|
+
'P': 'N(CCC1)C1C(=O)O',
|
|
175
|
+
'W': 'N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O',
|
|
176
|
+
'I': 'N[C@H]([C@H](C)CC)C(=O)O',
|
|
177
|
+
'M': 'NC(CCSC)C(=O)O',
|
|
178
|
+
'T': 'NC(C(O)C)C(=O)O',
|
|
179
|
+
};
|
|
180
|
+
Aminoacids.AASmilesTruncated = {
|
|
181
|
+
'G': '*C*',
|
|
182
|
+
'L': 'CC(C)C[C@H](*)*',
|
|
183
|
+
'Y': 'C1=CC(=CC=C1CC(*)*)O',
|
|
184
|
+
'S': 'OCC(*)C*',
|
|
185
|
+
'E': '*[C@@H](CCC(O)=O)*',
|
|
186
|
+
'Q': '*N[C@@H](CCC(N)=O)*',
|
|
187
|
+
'D': '*[C@@H](CC(O)=O)*',
|
|
188
|
+
'N': '*[C@@H](CC(N)=O)*',
|
|
189
|
+
'F': 'C1=CC=C(C=C1)CC(*)*',
|
|
190
|
+
'A': 'C[C@H](*)*',
|
|
191
|
+
'K': 'C(CCN)CC(*)*',
|
|
192
|
+
'R': '*[C@H](CCCNC(=N)C)*',
|
|
193
|
+
'H': 'C1=C(NC=N1)CC(*)*',
|
|
194
|
+
'C': 'C([C@@H](*)*)S',
|
|
195
|
+
'V': 'CC(C)C(*)*',
|
|
196
|
+
'P': 'C1CCN(*)C1*',
|
|
197
|
+
'W': '*[C@@H](Cc1c2ccccc2n([H])c1)*',
|
|
198
|
+
'I': 'CC[C@H](C)[C@H](*)*',
|
|
199
|
+
'M': 'CSCCC(*)*',
|
|
200
|
+
'T': 'CC(O)C(*)*',
|
|
201
|
+
};
|
|
202
|
+
/** TODO: Full?
|
|
203
|
+
*/
|
|
204
|
+
Aminoacids.AAFullNames = {
|
|
205
|
+
'Ala': 'A',
|
|
206
|
+
'Arg': 'R',
|
|
207
|
+
'Asn': 'N',
|
|
208
|
+
'Asp': 'D',
|
|
209
|
+
'Cys': 'C',
|
|
210
|
+
'Gln': 'Q',
|
|
211
|
+
'Glu': 'E',
|
|
212
|
+
'Gly': 'G',
|
|
213
|
+
'His': 'H',
|
|
214
|
+
'Ile': 'I',
|
|
215
|
+
'Leu': 'L',
|
|
216
|
+
'Lys': 'K',
|
|
217
|
+
'Met': 'M',
|
|
218
|
+
'Phe': 'F',
|
|
219
|
+
'Pro': 'P',
|
|
220
|
+
'Ser': 'S',
|
|
221
|
+
'Thr': 'T',
|
|
222
|
+
'Trp': 'W',
|
|
223
|
+
'Tyr': 'Y',
|
|
224
|
+
'Val': 'V',
|
|
225
|
+
};
|
|
226
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1pbm9hY2lkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFtaW5vYWNpZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFhLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTFELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxjQUFjO0lBRzdDLE1BQU0sS0FBSyxJQUFJO1FBQ3BCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQztnQkFDNUQsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDO2dCQUM1QixDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUM7YUFDekIsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUlNLE1BQU0sS0FBSyxVQUFVO1FBQzFCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDO2dCQUN0QixDQUFDLENBQUMsR0FBRyxF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QUFFLGFBQWE7SUFDbEIsR0FBRyxFQUFFLCtCQUErQjtJQUNwQyxHQUFHLEVBQUUscUJBQXFCO0lBQzFCLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLEdBQUcsRUFBRSxZQUFZO0NBQ2xCLENBQUM7QUFFRjtHQUNHO0FBQ1csc0JBQVcsR0FBcUI7SUFDNUMsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztDQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1N0cmluZ0RpY3Rpb25hcnl9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7U2VxUGFsZXR0ZSwgU2VxUGFsZXR0ZUJhc2V9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcblxuZXhwb3J0IGNsYXNzIEFtaW5vYWNpZHNQYWxldHRlcyBleHRlbmRzIFNlcVBhbGV0dGVCYXNlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgbGVzazogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBMZXNrKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmxlc2sgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5sZXNrID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgIFtbJ0cnLCAnQScsICdTJywgJ1QnXSwgJ29yYW5nZSddLFxuICAgICAgICBbWydDJywgJ1YnLCAnSScsICdMJywgJ1AnLCAnRicsICdZJywgJ00nLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgIFtbJ04nLCAnUScsICdIJ10sICdtYWdlbnRhJ10sXG4gICAgICAgIFtbJ0QnLCAnRSddLCAncmVkJ10sXG4gICAgICAgIFtbJ0snLCAnUiddLCAnYWxsX2JsdWUnXSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sZXNrO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ3Jva0dyb3VwczogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBHcm9rR3JvdXBzKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmdyb2tHcm91cHMgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5ncm9rR3JvdXBzID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgIFtbJ0MnLCAnVSddLCAneWVsbG93J10sXG4gICAgICAgIFtbJ0cnLCAnUCddLCAncmVkJ10sXG4gICAgICAgIFtbJ0EnLCAnVicsICdJJywgJ0wnLCAnTScsICdGJywgJ1knLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgIFtbJ1InLCAnSCcsICdLJ10sICdsaWdodF9ibHVlJ10sXG4gICAgICAgIFtbJ0QnLCAnRSddLCAnZGFya19ibHVlJ10sXG4gICAgICAgIFtbJ1MnLCAnVCcsICdOJywgJ1EnXSwgJ29yYW5nZSddLFxuICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdyb2tHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByYXNNb2w6IFNlcVBhbGV0dGU7XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgUmFzTW9sKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLnJhc01vbCA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLnJhc01vbCA9IHtcbiAgICAgICAgLy8gaHR0cDovL2FjY2VzLmVucy1seW9uLmZyL2Jpb3RpYy9yYXN0b3AvaGVscC9jb2xvdXIuaHRtXG4gICAgICAgICdEJzogJyNFNjBBMEEnLCAvLyBhc3AsIGFzcGFydGljIGFjaWQsIGFzcFxuICAgICAgICAnRSc6ICcjRTYwQTBBJywgLy8gZ2x1LCBnbHV0YW1pYyBhY2lkXG4gICAgICAgICdDJzogJyNFNkU2MDAnLCAvLyBjeXMsIGN5c3RlaW5lXG4gICAgICAgICdNJzogJyNFNkU2MDAnLCAvLyBtZXQsIG1ldGhpb25pbmVcbiAgICAgICAgJ0snOiAnIzE0NUFGRicsIC8vIGx5cywgbHlzaW5lXG4gICAgICAgICdSJzogJyMxNDVBRkYnLCAvLyBhcmcsIGFyZ2luaW5lXG4gICAgICAgICdTJzogJyNGQTk2MDAnLCAvLyBzZXIsIHNlcmluZVxuICAgICAgICAnVCc6ICcjRkE5NjAwJywgLy8gdGhyLCB0aHJlb25pbmVcbiAgICAgICAgJ0YnOiAnIzMyMzJBQScsIC8vIHBoZSwgcGhlbnlsYWxhbmluZVxuICAgICAgICAnWSc6ICcjMzIzMkFBJywgLy8gdHlyLCB0eXJvc2luZVxuICAgICAgICAnTic6ICcjMDBEQ0RDJywgLy8gYXNuLCBhc3BhcmFnaW5lXG4gICAgICAgICdRJzogJyMwMERDREMnLCAvLyBnbG4sIGdsdXRhbWluZVxuICAgICAgICAnRyc6ICcjRUJFQkVCJywgLy8gZ2x5LCBnbHljaW5lXG4gICAgICAgICdMJzogJyMwRjgyMEYnLCAvLyBsZXUsIGxldWNpbmVcbiAgICAgICAgJ1YnOiAnIzBGODIwRicsIC8vIHZhbCwgdmFsaW5lXG4gICAgICAgICdJJzogJyMwRjgyMEYnLCAvLyBpbGUsIGlzb2xldWNpbmVcbiAgICAgICAgJ0EnOiAnI0M4QzhDOCcsIC8vIGFsYSwgYWxhbmluZVxuICAgICAgICAnVyc6ICcjQjQ1QUI0JywgLy8gdHJwLCB0cnlwdG9waGFuXG4gICAgICAgICdIJzogJyM4MjgyRDInLCAvLyBoaXMsIGhpc3RpZGluZVxuICAgICAgICAnUCc6ICcjREM5NjgyJywgLy8gcHJvLCBwcm9saW5lXG4gICAgICAgICdvdGhlcnMnOiAnI0JFQTA2RScsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yYXNNb2w7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFtaW5vYWNpZHMge1xuICBzdGF0aWMgcmVhZG9ubHkgU2VtVHlwZTogc3RyaW5nID0gJ0FtaW5vYWNpZHMnO1xuXG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlTXVsdGlwbGVBbGlnbm1lbnQ6IHN0cmluZyA9ICdBbWlub2FjaWRzTXVsdGlwbGVBbGlnbm1lbnQnO1xuXG4gIHN0YXRpYyB1bmRlZmluZWRDb2xvciA9ICdyZ2IoMTAwLDEwMCwxMDApJztcblxuICBwdWJsaWMgc3RhdGljIE5hbWVzOiBTdHJpbmdEaWN0aW9uYXJ5ID0ge1xuICAgICdHJzogJ0dseWNpbmUnLFxuICAgICdMJzogJ0xldWNpbmUnLFxuICAgICdZJzogJ1R5cm9zaW5lJyxcbiAgICAnUyc6ICdTZXJpbmUnLFxuICAgICdFJzogJ0dsdXRhbWljIGFjaWQnLFxuICAgICdRJzogJ0dsdXRhbWluZScsXG4gICAgJ0QnOiAnQXNwYXJ0aWMgYWNpZCcsXG4gICAgJ04nOiAnQXNwYXJhZ2luZScsXG4gICAgJ0YnOiAnUGhlbnlsYWxhbmluZScsXG4gICAgJ0EnOiAnQWxhbmluZScsXG4gICAgJ0snOiAnTHlzaW5lJyxcbiAgICAnUic6ICdBcmdpbmluZScsXG4gICAgJ0gnOiAnSGlzdGlkaW5lJyxcbiAgICAnQyc6ICdDeXN0ZWluZScsXG4gICAgJ1YnOiAnVmFsaW5lJyxcbiAgICAnUCc6ICdQcm9saW5lJyxcbiAgICAnVyc6ICdUcnlwdG9waGFuJyxcbiAgICAnSSc6ICdJc29sZXVjaW5lJyxcbiAgICAnTSc6ICdNZXRoaW9uaW5lJyxcbiAgICAnVCc6ICdUaHJlb25pbmUnLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgQUFTbWlsZXM6IFN0cmluZ0RpY3Rpb25hcnkgPSB7XG4gICAgJ0cnOiAnTkNDKD1PKU8nLFxuICAgICdMJzogJ05bQ0BIXShDQyhDKUMpQyg9TylPJyxcbiAgICAnWSc6ICdOQyhDQzE9Q0M9QyhPKUM9QzEpQyg9TylPJyxcbiAgICAnUyc6ICdOQyhDTylDKD1PKU8nLFxuICAgICdFJzogJ05bQ0BASF0oQ0NDKE8pPU8pQyg9TylPJyxcbiAgICAnUSc6ICdOW0NAQEhdKENDQyhOKT1PKUMoPU8pTycsXG4gICAgJ0QnOiAnTltDQEBIXShDQyhPKT1PKUMoPU8pTycsXG4gICAgJ04nOiAnTltDQEBIXShDQyhOKT1PKUMoPU8pTycsXG4gICAgJ0YnOiAnTkMoQ0MxPUNDPUNDPUMxKUMoPU8pTycsXG4gICAgJ0EnOiAnTltDQEhdKEMpQyg9TylPJyxcbiAgICAnSyc6ICdOQyhDQ0NDTilDKD1PKU8nLFxuICAgICdSJzogJ05bQ0BIXShDQ0NOQyg9TilDKUMoPU8pTycsXG4gICAgJ0gnOiAnTkMoQ0MxPUNOPUNbTl0xKUMoPU8pTycsXG4gICAgJ0MnOiAnTltDQEBIXShDUylDKD1PKU8nLFxuICAgICdWJzogJ05DKEMoQylDKUMoPU8pTycsXG4gICAgJ1AnOiAnTihDQ0MxKUMxQyg9TylPJyxcbiAgICAnVyc6ICdOW0NAQEhdKENjMWMyY2NjY2MybihbSF0pYzEpQyg9TylPJyxcbiAgICAnSSc6ICdOW0NASF0oW0NASF0oQylDQylDKD1PKU8nLFxuICAgICdNJzogJ05DKENDU0MpQyg9TylPJyxcbiAgICAnVCc6ICdOQyhDKE8pQylDKD1PKU8nLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgQUFTbWlsZXNUcnVuY2F0ZWQ6IFN0cmluZ0RpY3Rpb25hcnkgPSB7XG4gICAgJ0cnOiAnKkMqJyxcbiAgICAnTCc6ICdDQyhDKUNbQ0BIXSgqKSonLFxuICAgICdZJzogJ0MxPUNDKD1DQz1DMUNDKCopKilPJyxcbiAgICAnUyc6ICdPQ0MoKilDKicsXG4gICAgJ0UnOiAnKltDQEBIXShDQ0MoTyk9TykqJyxcbiAgICAnUSc6ICcqTltDQEBIXShDQ0MoTik9TykqJyxcbiAgICAnRCc6ICcqW0NAQEhdKENDKE8pPU8pKicsXG4gICAgJ04nOiAnKltDQEBIXShDQyhOKT1PKSonLFxuICAgICdGJzogJ0MxPUNDPUMoQz1DMSlDQygqKSonLFxuICAgICdBJzogJ0NbQ0BIXSgqKSonLFxuICAgICdLJzogJ0MoQ0NOKUNDKCopKicsXG4gICAgJ1InOiAnKltDQEhdKENDQ05DKD1OKUMpKicsXG4gICAgJ0gnOiAnQzE9QyhOQz1OMSlDQygqKSonLFxuICAgICdDJzogJ0MoW0NAQEhdKCopKilTJyxcbiAgICAnVic6ICdDQyhDKUMoKikqJyxcbiAgICAnUCc6ICdDMUNDTigqKUMxKicsXG4gICAgJ1cnOiAnKltDQEBIXShDYzFjMmNjY2NjMm4oW0hdKWMxKSonLFxuICAgICdJJzogJ0NDW0NASF0oQylbQ0BIXSgqKSonLFxuICAgICdNJzogJ0NTQ0NDKCopKicsXG4gICAgJ1QnOiAnQ0MoTylDKCopKicsXG4gIH07XG5cbiAgLyoqIFRPRE86IEZ1bGw/XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIEFBRnVsbE5hbWVzOiBTdHJpbmdEaWN0aW9uYXJ5ID0ge1xuICAgICdBbGEnOiAnQScsXG4gICAgJ0FyZyc6ICdSJyxcbiAgICAnQXNuJzogJ04nLFxuICAgICdBc3AnOiAnRCcsXG4gICAgJ0N5cyc6ICdDJyxcbiAgICAnR2xuJzogJ1EnLFxuICAgICdHbHUnOiAnRScsXG4gICAgJ0dseSc6ICdHJyxcbiAgICAnSGlzJzogJ0gnLFxuICAgICdJbGUnOiAnSScsXG4gICAgJ0xldSc6ICdMJyxcbiAgICAnTHlzJzogJ0snLFxuICAgICdNZXQnOiAnTScsXG4gICAgJ1BoZSc6ICdGJyxcbiAgICAnUHJvJzogJ1AnLFxuICAgICdTZXInOiAnUycsXG4gICAgJ1Rocic6ICdUJyxcbiAgICAnVHJwJzogJ1cnLFxuICAgICdUeXInOiAnWScsXG4gICAgJ1ZhbCc6ICdWJyxcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIGdldFBhbGV0dGUoc2NoZW1lOiBzdHJpbmcgPSAnZ3JvaycpOiBTZXFQYWxldHRlIHtcbiAgICBzd2l0Y2ggKHNjaGVtZSkge1xuICAgIGNhc2UgJ2dyb2snOlxuICAgICAgcmV0dXJuIEFtaW5vYWNpZHNQYWxldHRlcy5Hcm9rR3JvdXBzO1xuICAgIGNhc2UgJ2xlc2snOlxuICAgICAgcmV0dXJuIEFtaW5vYWNpZHNQYWxldHRlcy5MZXNrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENoZW1QYWxldHRlOiBzY2hlbWUgXFxgJHtzY2hlbWV9XFxgIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZGl2aWRlZCBhbWlubyBhY2lkIHdpdGggaXRzIGNvbnRlbnQgaW4gdGhlIGJyYWNrZXQsIGlmIHRoZSBjb250ZW50IGlzIG51bWJlciwgdGhlbiBpdHMgb21pdHRlZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYyByYXcgYW1pbm9cbiAgICogQHJldHVybiB7W3N0cmluZywgc3RyaW5nXX0gb3V0ZXIgYW5kIGlubmVyIGNvbnRlbnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5uZXJPdXRlcihjOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBsZXQgaXNJbm5lciA9IDA7XG4gICAgbGV0IGlubmVyID0gJyc7XG4gICAgbGV0IG91dGVyID0gJyc7XG5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgYykge1xuICAgICAgaWYgKGNoYXIgPT0gJygnKVxuICAgICAgICBpc0lubmVyKys7XG4gICAgICBlbHNlIGlmIChjaGFyID09ICcpJylcbiAgICAgICAgaXNJbm5lci0tO1xuICAgICAgZWxzZSBpZiAoaXNJbm5lcilcbiAgICAgICAgaW5uZXIgKz0gY2hhcjtcbiAgICAgIGVsc2VcbiAgICAgICAgb3V0ZXIgKz0gY2hhcjtcbiAgICB9XG5cbiAgICByZXR1cm4gIWlzTmFOKHBhcnNlSW50KGlubmVyKSkgPyBbb3V0ZXIsICcnXSA6IFtvdXRlciwgaW5uZXJdO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRDb2xvckFBUGl2b3QobW9ub21lcjogc3RyaW5nID0gJycsIHNjaGVtZTogJ2dyb2snID0gJ2dyb2snKTogW3N0cmluZywgc3RyaW5nLCBzdHJpbmcsIG51bWJlcl0ge1xuICAgIC8vY29uc3QgY2hlbVBhbGV0dGVJbnN0YW5jZSA9IEFBUGFsZXR0ZXMuR3Jva0dyb3VwcygpO1xuICAgIGNvbnN0IGNoZW1QYWxldHRlSW5zdGFuY2UgPSB0aGlzLmdldFBhbGV0dGUoc2NoZW1lKTtcbiAgICBsZXQgW291dGVyTW9ub21lciwgaW5uZXJNb25vbWVyXSA9IHRoaXMuZ2V0SW5uZXJPdXRlcihtb25vbWVyKTtcbiAgICBvdXRlck1vbm9tZXIgPSAob3V0ZXJNb25vbWVyLmxlbmd0aCA+IDYgPyBgJHtvdXRlck1vbm9tZXIuc2xpY2UoMCwgMyl9Li4uYCA6IG91dGVyTW9ub21lcik7XG4gICAgaW5uZXJNb25vbWVyID0gKGlubmVyTW9ub21lci5sZW5ndGggPiA2ID8gYCR7aW5uZXJNb25vbWVyLnNsaWNlKDAsIDMpfS4uLmAgOiBpbm5lck1vbm9tZXIpO1xuXG4gICAgaWYgKG1vbm9tZXIubGVuZ3RoID09IDEgfHwgbW9ub21lclsxXSA9PSAnKCcpIHtcbiAgICAgIGNvbnN0IGFtaW5vID0gbW9ub21lclswXT8udG9VcHBlckNhc2UoKSE7XG4gICAgICByZXR1cm4gYW1pbm8gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSA/XG4gICAgICAgIFtjaGVtUGFsZXR0ZUluc3RhbmNlW2FtaW5vXSwgYW1pbm8sIGlubmVyTW9ub21lciwgMV0gOlxuICAgICAgICBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDFdO1xuICAgIH1cblxuICAgIGlmIChtb25vbWVyWzBdID09ICdkJyAmJiBtb25vbWVyWzFdISBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlKSB7XG4gICAgICBpZiAobW9ub21lci5sZW5ndGggPT0gMiB8fCBtb25vbWVyWzJdID09ICcoJykge1xuICAgICAgICBjb25zdCBhbWlubyA9IG1vbm9tZXJbMV0/LnRvVXBwZXJDYXNlKCkhO1xuICAgICAgICByZXR1cm4gYW1pbm8gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSA/XG4gICAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2VbYW1pbm9dLCBhbWlubywgaW5uZXJNb25vbWVyLCAyXSA6XG4gICAgICAgICAgW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCAyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9ub21lci5zdWJzdHJpbmcoMCwgMykgaW4gdGhpcy5BQUZ1bGxOYW1lcykge1xuICAgICAgaWYgKG1vbm9tZXIubGVuZ3RoID09IDMgfHwgbW9ub21lclszXSA9PSAnKCcpIHtcbiAgICAgICAgY29uc3QgYW1pbm8gPSB0aGlzLkFBRnVsbE5hbWVzW21vbm9tZXIuc3Vic3RyaW5nKDAsIDMpXTtcbiAgICAgICAgcmV0dXJuIGFtaW5vIGluIGNoZW1QYWxldHRlSW5zdGFuY2UgP1xuICAgICAgICAgIFtjaGVtUGFsZXR0ZUluc3RhbmNlW2FtaW5vXSwgYW1pbm8sIGlubmVyTW9ub21lciwgM10gOlxuICAgICAgICAgIFt0aGlzLnVuZGVmaW5lZENvbG9yLCBvdXRlck1vbm9tZXIsIGlubmVyTW9ub21lciwgM107XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vbm9tZXJbMF0/LnRvTG93ZXJDYXNlKCkgPT0gbW9ub21lclswXSkge1xuICAgICAgaWYgKG1vbm9tZXIuc3Vic3RyaW5nKDEsIDMpIGluIHRoaXMuQUFGdWxsTmFtZXMpIHtcbiAgICAgICAgaWYgKG1vbm9tZXIubGVuZ3RoID09IDQgfHwgbW9ub21lcls0XSA9PSAnKCcpIHtcbiAgICAgICAgICBjb25zdCBhbWlubyA9IHRoaXMuQUFGdWxsTmFtZXNbbW9ub21lci5zdWJzdHJpbmcoMSwgMyldO1xuICAgICAgICAgIHJldHVybiBhbWlubyBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlID9cbiAgICAgICAgICAgIFtjaGVtUGFsZXR0ZUluc3RhbmNlW2FtaW5vXSwgYW1pbm8sIGlubmVyTW9ub21lciwgNF0gOlxuICAgICAgICAgICAgW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCA0XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDBdO1xuICB9XG59XG4iXX0=
|
package/src/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SeqPalette } from './seq-palettes';
|
|
2
|
+
import { Aminoacids, AminoacidsPalettes } from './aminoacids';
|
|
3
|
+
import { Nucleotides, NucleotidesPalettes } from './nucleotides';
|
|
4
|
+
import { WebLogo, PositionInfo, PositionMonomerInfo } from './viewers/web-logo';
|
|
5
|
+
export { SeqPalette, AminoacidsPalettes, Aminoacids, NucleotidesPalettes, Nucleotides };
|
|
6
|
+
export { WebLogo, PositionInfo, PositionMonomerInfo };
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAC,UAAU,EAAE,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAC,WAAW,EAAE,mBAAmB,EAAC,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAC,MAAM,oBAAoB,CAAC;AAE9E,OAAO,EAAC,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAC,CAAC;AACtF,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAC,CAAC"}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Aminoacids, AminoacidsPalettes } from './aminoacids';
|
|
2
|
+
import { Nucleotides, NucleotidesPalettes } from './nucleotides';
|
|
3
|
+
import { WebLogo, PositionInfo, PositionMonomerInfo } from './viewers/web-logo';
|
|
4
|
+
export { AminoacidsPalettes, Aminoacids, NucleotidesPalettes, Nucleotides };
|
|
5
|
+
export { WebLogo, PositionInfo, PositionMonomerInfo };
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzVELE9BQU8sRUFBQyxXQUFXLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUU5RSxPQUFPLEVBQWEsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBQyxDQUFDO0FBQ3RGLE9BQU8sRUFBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NlcVBhbGV0dGV9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcbmltcG9ydCB7QW1pbm9hY2lkcywgQW1pbm9hY2lkc1BhbGV0dGVzfSBmcm9tICcuL2FtaW5vYWNpZHMnO1xuaW1wb3J0IHtOdWNsZW90aWRlcywgTnVjbGVvdGlkZXNQYWxldHRlc30gZnJvbSAnLi9udWNsZW90aWRlcyc7XG5pbXBvcnQge1dlYkxvZ28sIFBvc2l0aW9uSW5mbywgUG9zaXRpb25Nb25vbWVySW5mb30gZnJvbSAnLi92aWV3ZXJzL3dlYi1sb2dvJztcblxuZXhwb3J0IHtTZXFQYWxldHRlLCBBbWlub2FjaWRzUGFsZXR0ZXMsIEFtaW5vYWNpZHMsIE51Y2xlb3RpZGVzUGFsZXR0ZXMsIE51Y2xlb3RpZGVzfTtcbmV4cG9ydCB7V2ViTG9nbywgUG9zaXRpb25JbmZvLCBQb3NpdGlvbk1vbm9tZXJJbmZvfTtcblxuIl19
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import {SeqPalette} from './seq-palettes';
|
|
2
|
+
import {Aminoacids, AminoacidsPalettes} from './aminoacids';
|
|
3
|
+
import {Nucleotides, NucleotidesPalettes} from './nucleotides';
|
|
4
|
+
import {WebLogo, PositionInfo, PositionMonomerInfo} from './viewers/web-logo';
|
|
5
|
+
|
|
6
|
+
export {SeqPalette, AminoacidsPalettes, Aminoacids, NucleotidesPalettes, Nucleotides};
|
|
7
|
+
export {WebLogo, PositionInfo, PositionMonomerInfo};
|
|
8
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { StringDictionary } from '@datagrok-libraries/utils/src/type-declarations';
|
|
2
|
+
import { SeqPalette, SeqPaletteBase } from './seq-palettes';
|
|
3
|
+
export declare class NucleotidesPalettes extends SeqPaletteBase {
|
|
4
|
+
private static chromatogram;
|
|
5
|
+
static get Chromatogram(): SeqPalette;
|
|
6
|
+
}
|
|
7
|
+
export declare class Nucleotides {
|
|
8
|
+
static readonly SemType: string;
|
|
9
|
+
static readonly SemTypeMultipleAlignment: string;
|
|
10
|
+
static Names: StringDictionary;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=nucleotides.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nucleotides.d.ts","sourceRoot":"","sources":["nucleotides.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,gBAAgB,EAAC,MAAM,iDAAiD,CAAC;AACjF,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,MAAM,gBAAgB,CAAC;AAE1D,qBAAa,mBAAoB,SAAQ,cAAc;IACrD,OAAO,CAAC,MAAM,CAAC,YAAY,CAAa;IAExC,WAAkB,YAAY,IAAI,UAAU,CAW3C;CACF;AAED,qBAAa,WAAW;IACtB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAuB;IAEtD,MAAM,CAAC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAkC;IAElF,OAAc,KAAK,EAAE,gBAAgB,CAMnC;CACH"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { SeqPaletteBase } from './seq-palettes';
|
|
2
|
+
export class NucleotidesPalettes extends SeqPaletteBase {
|
|
3
|
+
static get Chromatogram() {
|
|
4
|
+
if (this.chromatogram === void 0) {
|
|
5
|
+
this.chromatogram = {
|
|
6
|
+
'A': 'green',
|
|
7
|
+
'C': 'blue',
|
|
8
|
+
'G': 'black',
|
|
9
|
+
'T': 'red', 'U': 'red',
|
|
10
|
+
'others': 'gray',
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
return this.chromatogram;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class Nucleotides {
|
|
17
|
+
}
|
|
18
|
+
Nucleotides.SemType = 'MultipleAlignment';
|
|
19
|
+
Nucleotides.SemTypeMultipleAlignment = 'NucleotidesMultipleAlignment';
|
|
20
|
+
Nucleotides.Names = {
|
|
21
|
+
'A': 'Adenine',
|
|
22
|
+
'C': 'Cytosine',
|
|
23
|
+
'G': 'Guanine',
|
|
24
|
+
'T': 'Thymine',
|
|
25
|
+
'U': 'Uracil',
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGVvdGlkZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJudWNsZW90aWRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQWEsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGNBQWM7SUFHOUMsTUFBTSxLQUFLLFlBQVk7UUFDNUIsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUc7Z0JBQ2xCLEdBQUcsRUFBRSxPQUFPO2dCQUNaLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEdBQUcsRUFBRSxPQUFPO2dCQUNaLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUs7Z0JBQ3RCLFFBQVEsRUFBRSxNQUFNO2FBQ2pCLENBQUM7U0FDSDtRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sV0FBVzs7QUFDTixtQkFBTyxHQUFXLG1CQUFtQixDQUFDO0FBRXRDLG9DQUF3QixHQUFXLDhCQUE4QixDQUFDO0FBRXBFLGlCQUFLLEdBQXFCO0lBQ3RDLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFVBQVU7SUFDZixHQUFHLEVBQUUsU0FBUztJQUNkLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFFBQVE7Q0FDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcblxuaW1wb3J0IHtTdHJpbmdEaWN0aW9uYXJ5fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge1NlcVBhbGV0dGUsIFNlcVBhbGV0dGVCYXNlfSBmcm9tICcuL3NlcS1wYWxldHRlcyc7XG5cbmV4cG9ydCBjbGFzcyBOdWNsZW90aWRlc1BhbGV0dGVzIGV4dGVuZHMgU2VxUGFsZXR0ZUJhc2Uge1xuICBwcml2YXRlIHN0YXRpYyBjaHJvbWF0b2dyYW06IFNlcVBhbGV0dGU7XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgQ2hyb21hdG9ncmFtKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmNocm9tYXRvZ3JhbSA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLmNocm9tYXRvZ3JhbSA9IHtcbiAgICAgICAgJ0EnOiAnZ3JlZW4nLFxuICAgICAgICAnQyc6ICdibHVlJyxcbiAgICAgICAgJ0cnOiAnYmxhY2snLCAvLyBvcmFuZ2UgP1xuICAgICAgICAnVCc6ICdyZWQnLCAnVSc6ICdyZWQnLFxuICAgICAgICAnb3RoZXJzJzogJ2dyYXknLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hyb21hdG9ncmFtO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOdWNsZW90aWRlcyB7XG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlOiBzdHJpbmcgPSAnTXVsdGlwbGVBbGlnbm1lbnQnO1xuXG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlTXVsdGlwbGVBbGlnbm1lbnQ6IHN0cmluZyA9ICdOdWNsZW90aWRlc011bHRpcGxlQWxpZ25tZW50JztcblxuICBwdWJsaWMgc3RhdGljIE5hbWVzOiBTdHJpbmdEaWN0aW9uYXJ5ID0ge1xuICAgICdBJzogJ0FkZW5pbmUnLFxuICAgICdDJzogJ0N5dG9zaW5lJyxcbiAgICAnRyc6ICdHdWFuaW5lJyxcbiAgICAnVCc6ICdUaHltaW5lJyxcbiAgICAnVSc6ICdVcmFjaWwnLFxuICB9O1xufVxuIl19
|
package/src/package.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=package.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.d.ts","sourceRoot":"","sources":["package.ts"],"names":[],"mappings":""}
|
package/src/package.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface SeqPalette {
|
|
2
|
+
/**
|
|
3
|
+
* @param {string} m Monomer character
|
|
4
|
+
* @return {string} Color
|
|
5
|
+
*/
|
|
6
|
+
[m: string]: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class SeqPaletteBase {
|
|
9
|
+
/** Palette with shades of primary colors
|
|
10
|
+
*/
|
|
11
|
+
private static colourPalette;
|
|
12
|
+
protected static makePalette(dt: [string[], string][], simplified?: boolean): {
|
|
13
|
+
[key: string]: string;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=seq-palettes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seq-palettes.d.ts","sourceRoot":"","sources":["seq-palettes.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACrB;AAED,qBAAa,cAAc;IACzB;OACG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa,CAqB1B;IAEF,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,UAAQ;;;CAW1E"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export class SeqPaletteBase {
|
|
2
|
+
static makePalette(dt, simplified = false) {
|
|
3
|
+
const palette = {};
|
|
4
|
+
dt.forEach((cp) => {
|
|
5
|
+
const objList = cp[0];
|
|
6
|
+
const colour = cp[1];
|
|
7
|
+
objList.forEach((obj, ind) => {
|
|
8
|
+
palette[obj] = this.colourPalette[colour][simplified ? 0 : ind];
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
return palette;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** Palette with shades of primary colors
|
|
15
|
+
*/
|
|
16
|
+
SeqPaletteBase.colourPalette = {
|
|
17
|
+
'orange': ['rgb(255,187,120)', 'rgb(245,167,100)', 'rgb(235,137,70)', 'rgb(205, 111, 71)'],
|
|
18
|
+
'all_green': ['rgb(44,160,44)', 'rgb(74,160,74)', 'rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)',
|
|
19
|
+
'rgb(24,110,79)', 'rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],
|
|
20
|
+
'all_blue': ['rgb(31,119,180)', 'rgb(23,190,207)', 'rgb(122, 102, 189)', 'rgb(158,218,229)', 'rgb(141, 124, 217)',
|
|
21
|
+
'rgb(31, 120, 150)'],
|
|
22
|
+
'magenta': ['rgb(162,106,192)', 'rgb(197,165,224)', 'rgb(208,113,218)'],
|
|
23
|
+
'red': ['rgb(214,39,40)', 'rgb(255,152,150)'],
|
|
24
|
+
'st_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(31,119,180)'],
|
|
25
|
+
'dark_blue': ['rgb(31,119,180)', 'rgb(31, 120, 150)'],
|
|
26
|
+
'light_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(108, 218, 229)', 'rgb(23,190,227)'],
|
|
27
|
+
'lilac_blue': ['rgb(124,102,211)', 'rgb(149,134,217)', 'rgb(97, 81, 150)'],
|
|
28
|
+
'dark_green': ['rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)', 'rgb(24,110,79)'],
|
|
29
|
+
'green': ['rgb(44,160,44)', 'rgb(74,160,74)'],
|
|
30
|
+
'light_green': ['rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],
|
|
31
|
+
'st_green': ['rgb(44,160,44)', 'rgb(152,223,138)', 'rgb(39, 174, 96)', 'rgb(74,160,74)'],
|
|
32
|
+
'pink': ['rgb(247,182,210)'],
|
|
33
|
+
'brown': ['rgb(140,86,75)', 'rgb(102, 62, 54)'],
|
|
34
|
+
'gray': ['rgb(127,127,127)', 'rgb(199,199,199)', 'rgb(196,156,148)', 'rgb(222, 222, 180)'],
|
|
35
|
+
'yellow': ['rgb(188,189,34)'],
|
|
36
|
+
'white': ['rgb(230,230,230)'],
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxLXBhbGV0dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VxLXBhbGV0dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlBLE1BQU0sT0FBTyxjQUFjO0lBMEJmLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBd0IsRUFBRSxVQUFVLEdBQUcsS0FBSztRQUN2RSxNQUFNLE9BQU8sR0FBOEIsRUFBRSxDQUFDO1FBQzlDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNoQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzs7QUFuQ0Q7R0FDRztBQUNZLDRCQUFhLEdBQWdDO0lBQzFELFFBQVEsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDO0lBQzFGLFdBQVcsRUFBRSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQjtRQUNwRyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQztJQUNuRixVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0I7UUFDL0csbUJBQW1CLENBQUM7SUFDdEIsU0FBUyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDdkUsS0FBSyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7SUFDN0MsU0FBUyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7SUFDckUsV0FBVyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUM7SUFDckQsWUFBWSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUM7SUFDOUYsWUFBWSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDMUUsWUFBWSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDdEYsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDN0MsYUFBYSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUM7SUFDL0UsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUM7SUFDeEYsTUFBTSxFQUFFLENBQUMsa0JBQWtCLENBQUM7SUFDNUIsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7SUFDL0MsTUFBTSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUM7SUFDMUYsUUFBUSxFQUFFLENBQUMsaUJBQWlCLENBQUM7SUFDN0IsT0FBTyxFQUFFLENBQUMsa0JBQWtCLENBQUM7Q0FDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VxUGFsZXR0ZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbSBNb25vbWVyIGNoYXJhY3RlclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbG9yXG4gICAqL1xuICBbbTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU2VxUGFsZXR0ZUJhc2Uge1xuICAvKiogUGFsZXR0ZSB3aXRoIHNoYWRlcyBvZiBwcmltYXJ5IGNvbG9yc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY29sb3VyUGFsZXR0ZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge1xuICAgICdvcmFuZ2UnOiBbJ3JnYigyNTUsMTg3LDEyMCknLCAncmdiKDI0NSwxNjcsMTAwKScsICdyZ2IoMjM1LDEzNyw3MCknLCAncmdiKDIwNSwgMTExLCA3MSknXSxcbiAgICAnYWxsX2dyZWVuJzogWydyZ2IoNDQsMTYwLDQ0KScsICdyZ2IoNzQsMTYwLDc0KScsICdyZ2IoMjMsMTAzLDU3KScsICdyZ2IoMzAsMTEwLDk2KScsICdyZ2IoNjAsMTMxLDk1KScsXG4gICAgICAncmdiKDI0LDExMCw3OSknLCAncmdiKDE1MiwyMjMsMTM4KScsICdyZ2IoMTgyLCAyMjMsIDEzOCknLCAncmdiKDE1MiwgMTkzLCAxMzgpJ10sXG4gICAgJ2FsbF9ibHVlJzogWydyZ2IoMzEsMTE5LDE4MCknLCAncmdiKDIzLDE5MCwyMDcpJywgJ3JnYigxMjIsIDEwMiwgMTg5KScsICdyZ2IoMTU4LDIxOCwyMjkpJywgJ3JnYigxNDEsIDEyNCwgMjE3KScsXG4gICAgICAncmdiKDMxLCAxMjAsIDE1MCknXSxcbiAgICAnbWFnZW50YSc6IFsncmdiKDE2MiwxMDYsMTkyKScsICdyZ2IoMTk3LDE2NSwyMjQpJywgJ3JnYigyMDgsMTEzLDIxOCknXSxcbiAgICAncmVkJzogWydyZ2IoMjE0LDM5LDQwKScsICdyZ2IoMjU1LDE1MiwxNTApJ10sXG4gICAgJ3N0X2JsdWUnOiBbJ3JnYigyMywxOTAsMjA3KScsICdyZ2IoMTU4LDIxOCwyMjkpJywgJ3JnYigzMSwxMTksMTgwKSddLFxuICAgICdkYXJrX2JsdWUnOiBbJ3JnYigzMSwxMTksMTgwKScsICdyZ2IoMzEsIDEyMCwgMTUwKSddLFxuICAgICdsaWdodF9ibHVlJzogWydyZ2IoMjMsMTkwLDIwNyknLCAncmdiKDE1OCwyMTgsMjI5KScsICdyZ2IoMTA4LCAyMTgsIDIyOSknLCAncmdiKDIzLDE5MCwyMjcpJ10sXG4gICAgJ2xpbGFjX2JsdWUnOiBbJ3JnYigxMjQsMTAyLDIxMSknLCAncmdiKDE0OSwxMzQsMjE3KScsICdyZ2IoOTcsIDgxLCAxNTApJ10sXG4gICAgJ2RhcmtfZ3JlZW4nOiBbJ3JnYigyMywxMDMsNTcpJywgJ3JnYigzMCwxMTAsOTYpJywgJ3JnYig2MCwxMzEsOTUpJywgJ3JnYigyNCwxMTAsNzkpJ10sXG4gICAgJ2dyZWVuJzogWydyZ2IoNDQsMTYwLDQ0KScsICdyZ2IoNzQsMTYwLDc0KSddLFxuICAgICdsaWdodF9ncmVlbic6IFsncmdiKDE1MiwyMjMsMTM4KScsICdyZ2IoMTgyLCAyMjMsIDEzOCknLCAncmdiKDE1MiwgMTkzLCAxMzgpJ10sXG4gICAgJ3N0X2dyZWVuJzogWydyZ2IoNDQsMTYwLDQ0KScsICdyZ2IoMTUyLDIyMywxMzgpJywgJ3JnYigzOSwgMTc0LCA5NiknLCAncmdiKDc0LDE2MCw3NCknXSxcbiAgICAncGluayc6IFsncmdiKDI0NywxODIsMjEwKSddLFxuICAgICdicm93bic6IFsncmdiKDE0MCw4Niw3NSknLCAncmdiKDEwMiwgNjIsIDU0KSddLFxuICAgICdncmF5JzogWydyZ2IoMTI3LDEyNywxMjcpJywgJ3JnYigxOTksMTk5LDE5OSknLCAncmdiKDE5NiwxNTYsMTQ4KScsICdyZ2IoMjIyLCAyMjIsIDE4MCknXSxcbiAgICAneWVsbG93JzogWydyZ2IoMTg4LDE4OSwzNCknXSxcbiAgICAnd2hpdGUnOiBbJ3JnYigyMzAsMjMwLDIzMCknXSxcbiAgfTtcblxuICBwcm90ZWN0ZWQgc3RhdGljIG1ha2VQYWxldHRlKGR0OiBbc3RyaW5nW10sIHN0cmluZ11bXSwgc2ltcGxpZmllZCA9IGZhbHNlKSB7XG4gICAgY29uc3QgcGFsZXR0ZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIGR0LmZvckVhY2goKGNwKSA9PiB7XG4gICAgICBjb25zdCBvYmpMaXN0ID0gY3BbMF07XG4gICAgICBjb25zdCBjb2xvdXIgPSBjcFsxXTtcbiAgICAgIG9iakxpc3QuZm9yRWFjaCgob2JqLCBpbmQpID0+IHtcbiAgICAgICAgcGFsZXR0ZVtvYmpdID0gdGhpcy5jb2xvdXJQYWxldHRlW2NvbG91cl1bc2ltcGxpZmllZCA/IDAgOiBpbmRdO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhbGV0dGU7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import * as DG from 'datagrok-api/dg';
|
|
2
|
+
import { StringDictionary } from '@datagrok-libraries/utils/src/type-declarations';
|
|
3
|
+
declare module 'datagrok-api/src/grid' {
|
|
4
|
+
interface Rect {
|
|
5
|
+
contains(x: number, y: number): boolean;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
declare global {
|
|
9
|
+
interface HTMLCanvasElement {
|
|
10
|
+
getCursorPosition(event: MouseEvent): DG.Point;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export declare class PositionMonomerInfo {
|
|
14
|
+
/** Sequences count with monomer in position
|
|
15
|
+
*/
|
|
16
|
+
count: number;
|
|
17
|
+
/** Remember screen coords rect
|
|
18
|
+
*/
|
|
19
|
+
bounds: DG.Rect;
|
|
20
|
+
constructor();
|
|
21
|
+
}
|
|
22
|
+
export declare class PositionInfo {
|
|
23
|
+
readonly name: string;
|
|
24
|
+
freq: {
|
|
25
|
+
[m: string]: PositionMonomerInfo;
|
|
26
|
+
};
|
|
27
|
+
rowCount: number;
|
|
28
|
+
/** freq = {}, rowCount = 0
|
|
29
|
+
* @param {string} name Name of position ('111A', '111.1', etc)
|
|
30
|
+
*/
|
|
31
|
+
constructor(name: string);
|
|
32
|
+
}
|
|
33
|
+
export declare class WebLogo extends DG.JsViewer {
|
|
34
|
+
static residuesSet: string;
|
|
35
|
+
protected cp: StringDictionary | null;
|
|
36
|
+
private canvas?;
|
|
37
|
+
private slider?;
|
|
38
|
+
private textBaseline;
|
|
39
|
+
private axisHeight;
|
|
40
|
+
private positionWidth;
|
|
41
|
+
private seqCol;
|
|
42
|
+
private positions;
|
|
43
|
+
private rowsMasked;
|
|
44
|
+
private rowsNull;
|
|
45
|
+
minHeight: number;
|
|
46
|
+
maxHeight: number;
|
|
47
|
+
considerNullSequences: boolean;
|
|
48
|
+
sequenceColumnName: string;
|
|
49
|
+
startPositionName: string;
|
|
50
|
+
endPositionName: string;
|
|
51
|
+
private positionNames;
|
|
52
|
+
private startPosition;
|
|
53
|
+
private endPosition;
|
|
54
|
+
private get Length();
|
|
55
|
+
constructor();
|
|
56
|
+
init(): Promise<void>;
|
|
57
|
+
rootOnSizeChanged(args: any): void;
|
|
58
|
+
/** Assigns {@link seqCol} and {@link cp} based on {@link sequenceColumnName} and calls {@link render}().
|
|
59
|
+
*/
|
|
60
|
+
updateSeqCol(): void;
|
|
61
|
+
onPropertyChanged(property: DG.Property): void;
|
|
62
|
+
onTableAttached(): void;
|
|
63
|
+
protected _nullSequence(fillerResidue?: string): string;
|
|
64
|
+
protected _calculate(): void;
|
|
65
|
+
render(recalc?: boolean): void;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=web-logo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-logo.d.ts","sourceRoot":"","sources":["web-logo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAItC,OAAO,EAAC,gBAAgB,EAAC,MAAM,iDAAiD,CAAC;AAOjF,OAAO,QAAQ,uBAAuB,CAAC;IACrC,UAAU,IAAI;QACZ,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;KACzC;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,iBAAiB;QACzB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC;KAChD;CACF;AAWD,qBAAa,mBAAmB;IAC9B;OACG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;OACG;IACH,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC;;CAMjB;AAED,qBAAa,YAAY;IACvB,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAA;KAAE,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;gBACS,IAAI,EAAE,MAAM;CAKzB;AAED,qBAAa,OAAQ,SAAQ,EAAE,CAAC,QAAQ;IACtC,OAAc,WAAW,SAAiB;IAG1C,SAAS,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAG7C,OAAO,CAAC,MAAM,CAAC,CAAoB;IACnC,OAAO,CAAC,MAAM,CAAC,CAAiB;IAChC,OAAO,CAAC,YAAY,CAAqB;IAEzC,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,aAAa,CAAc;IAEnC,OAAO,CAAC,MAAM,CAA0B;IAExC,OAAO,CAAC,SAAS,CAAsB;IAEvC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAa;IAGtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,aAAa,CAAgB;IAErC,OAAO,CAAC,aAAa,CAAc;IAEnC,OAAO,CAAC,WAAW,CAAc;IAEjC,OAAO,KAAK,MAAM,GAAgE;;IAiB5E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmF3B,iBAAiB,CAAC,IAAI,EAAE,GAAG;IAmB3B;OACG;IACH,YAAY,IAAI,IAAI;IAuCpB,iBAAiB,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,IAAI;IAyB9C,eAAe;IAiBf,SAAS,CAAC,aAAa,CAAC,aAAa,SAAM,GAAG,MAAM;IAOpD,SAAS,CAAC,UAAU;IAoFpB,MAAM,CAAC,MAAM,UAAO;CA8DrB"}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import * as ui from 'datagrok-api/ui';
|
|
11
|
+
import * as DG from 'datagrok-api/dg';
|
|
12
|
+
import * as rxjs from 'rxjs';
|
|
13
|
+
import { Aminoacids, AminoacidsPalettes } from '../aminoacids';
|
|
14
|
+
import { Nucleotides, NucleotidesPalettes } from '../nucleotides';
|
|
15
|
+
HTMLCanvasElement.prototype.getCursorPosition = function (event) {
|
|
16
|
+
const rect = this.getBoundingClientRect();
|
|
17
|
+
return new DG.Point(event.clientX - rect.left, event.clientY - rect.top);
|
|
18
|
+
};
|
|
19
|
+
DG.Rect.prototype.contains = function (x, y) {
|
|
20
|
+
return this.left <= x && x <= this.right && this.top <= y && y <= this.bottom;
|
|
21
|
+
};
|
|
22
|
+
export class PositionMonomerInfo {
|
|
23
|
+
constructor() {
|
|
24
|
+
this.count = 0;
|
|
25
|
+
this.bounds = new DG.Rect(0, 0, 0, 0);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export class PositionInfo {
|
|
29
|
+
/** freq = {}, rowCount = 0
|
|
30
|
+
* @param {string} name Name of position ('111A', '111.1', etc)
|
|
31
|
+
*/
|
|
32
|
+
constructor(name) {
|
|
33
|
+
this.name = name;
|
|
34
|
+
this.freq = {};
|
|
35
|
+
this.rowCount = 0;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export class WebLogo extends DG.JsViewer {
|
|
39
|
+
constructor() {
|
|
40
|
+
super();
|
|
41
|
+
// private readonly colorScheme: ColorScheme = ColorSchemes[NucleotidesWebLogo.residuesSet];
|
|
42
|
+
this.cp = null;
|
|
43
|
+
this.axisHeight = 12;
|
|
44
|
+
this.positionWidth = 16;
|
|
45
|
+
this.seqCol = null;
|
|
46
|
+
// private maxLength: number = 100;
|
|
47
|
+
this.positions = [];
|
|
48
|
+
this.rowsMasked = 0;
|
|
49
|
+
this.rowsNull = 0;
|
|
50
|
+
this.positionNames = [];
|
|
51
|
+
this.startPosition = -1;
|
|
52
|
+
this.endPosition = -1;
|
|
53
|
+
this.textBaseline = 'top';
|
|
54
|
+
this.minHeight = this.float('minHeight', 50);
|
|
55
|
+
this.maxHeight = this.float('maxHeight', 100);
|
|
56
|
+
this.considerNullSequences = this.bool('considerNullSequences', false);
|
|
57
|
+
this.sequenceColumnName = this.string('sequenceColumnName', null);
|
|
58
|
+
this.startPositionName = this.string('startPositionName', null);
|
|
59
|
+
this.endPositionName = this.string('endPositionName', null);
|
|
60
|
+
}
|
|
61
|
+
get Length() { return this.endPosition - this.startPosition + 1; }
|
|
62
|
+
init() {
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
this.canvas = ui.canvas();
|
|
65
|
+
this.canvas.style.width = '100%';
|
|
66
|
+
this.slider = ui.rangeSlider(0, 20, 2, 5);
|
|
67
|
+
this.slider.root.style.width = '100%';
|
|
68
|
+
this.slider.root.style.height = '12px';
|
|
69
|
+
// this.host = ui.divV([/*this.slider,*/this.canvas]);
|
|
70
|
+
const getMonomer = (p) => {
|
|
71
|
+
const jPos = Math.floor(p.x / this.positionWidth);
|
|
72
|
+
const position = this.positions[jPos];
|
|
73
|
+
if (position === void 0)
|
|
74
|
+
return [jPos, null, null];
|
|
75
|
+
const monomer = Object.keys(position.freq)
|
|
76
|
+
.find((m) => position.freq[m].bounds.contains(p.x, p.y));
|
|
77
|
+
if (monomer === undefined)
|
|
78
|
+
return [jPos, null, null];
|
|
79
|
+
return [jPos, monomer, position.freq[monomer]];
|
|
80
|
+
};
|
|
81
|
+
this.canvas.onmouseover = (e) => {
|
|
82
|
+
};
|
|
83
|
+
rxjs.fromEvent(this.canvas, 'mousemove').subscribe((e) => {
|
|
84
|
+
if (!this.canvas)
|
|
85
|
+
return;
|
|
86
|
+
const args = e;
|
|
87
|
+
const [jPos, monomer] = getMonomer(this.canvas.getCursorPosition(args));
|
|
88
|
+
//if (this.dataFrame && this.seqCol && monomer) {
|
|
89
|
+
if (this.dataFrame && this.seqCol && monomer) {
|
|
90
|
+
ui.tooltip.showRowGroup(this.dataFrame, (iRow) => {
|
|
91
|
+
const seq = this.seqCol.get(iRow);
|
|
92
|
+
const mSeq = seq ? seq[this.startPosition + jPos] : null;
|
|
93
|
+
return mSeq === monomer;
|
|
94
|
+
}, args.x + 16, args.y + 16);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
ui.tooltip.hide();
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
rxjs.fromEvent(this.canvas, 'mousedown').subscribe((e) => {
|
|
101
|
+
if (!this.canvas)
|
|
102
|
+
return;
|
|
103
|
+
const args = e;
|
|
104
|
+
const [jPos, monomer] = getMonomer(this.canvas.getCursorPosition(args));
|
|
105
|
+
// prevents deselect all rows if we miss monomer bounds
|
|
106
|
+
//if (this.dataFrame && this.seqCol && monomer) {
|
|
107
|
+
if (this.dataFrame && this.seqCol && monomer) {
|
|
108
|
+
this.dataFrame.selection.init((iRow) => {
|
|
109
|
+
const seq = this.seqCol.get(iRow);
|
|
110
|
+
const mSeq = seq ? seq[this.startPosition + jPos] : null;
|
|
111
|
+
return mSeq === monomer;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
this.root.append(this.canvas);
|
|
116
|
+
// this.root.appendChild(this.slider.root);
|
|
117
|
+
// this.root.append(this.host);
|
|
118
|
+
// ui.onSizeChanged(this.canvas).subscribe(this.canvasOnSizeChanged.bind(this));
|
|
119
|
+
ui.onSizeChanged(this.root).subscribe(this.rootOnSizeChanged.bind(this));
|
|
120
|
+
this.render(true);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
// canvasOnSizeChanged(args: any) {
|
|
124
|
+
// this.canvas.width = this.canvas.clientWidth;
|
|
125
|
+
// this.canvas.height = this.canvas.clientHeight;
|
|
126
|
+
// console.debug(`WebLogo.onSizeChanged() width=${this.canvas.width}, height=${this.canvas.height}`);
|
|
127
|
+
// this.render(false);
|
|
128
|
+
// }
|
|
129
|
+
rootOnSizeChanged(args) {
|
|
130
|
+
if (!this.canvas)
|
|
131
|
+
return;
|
|
132
|
+
// this.canvas.width calculate in this._calculate() method
|
|
133
|
+
const height = Math.min(this.maxHeight, Math.max(this.minHeight, this.root.clientHeight));
|
|
134
|
+
// if (this.canvas.width > this.root.clientWidth) /* horizontal scroller is enabled */
|
|
135
|
+
// height -= 6; /* free some space for horizontal scroller */
|
|
136
|
+
this.canvas.height = height;
|
|
137
|
+
this.canvas.style.height = `${height}px`;
|
|
138
|
+
// console.debug(`WebLogo.onRootSizeChanged() ` +
|
|
139
|
+
// `root.width=${this.root.clientWidth}, root.height=${this.root.clientHeight}, ` +
|
|
140
|
+
// `canvas.width=${this.canvas.width}, canvas.height=${this.canvas.height} .`);
|
|
141
|
+
this.render(true);
|
|
142
|
+
}
|
|
143
|
+
/** Assigns {@link seqCol} and {@link cp} based on {@link sequenceColumnName} and calls {@link render}().
|
|
144
|
+
*/
|
|
145
|
+
updateSeqCol() {
|
|
146
|
+
if (this.dataFrame) {
|
|
147
|
+
this.seqCol = this.dataFrame.col(this.sequenceColumnName);
|
|
148
|
+
if (this.seqCol) {
|
|
149
|
+
let maxLength = 0;
|
|
150
|
+
for (const category of this.seqCol.categories)
|
|
151
|
+
maxLength = Math.max(maxLength, category.length);
|
|
152
|
+
// Get position names from data column tag 'positionNames'
|
|
153
|
+
const positionNamesTxt = this.seqCol.getTag('positionNames');
|
|
154
|
+
// Fallback if 'positionNames' tag is not provided
|
|
155
|
+
this.positionNames = positionNamesTxt ? positionNamesTxt.split(', ').map((n) => n.trim()) :
|
|
156
|
+
[...Array(maxLength).keys()].map((jPos) => `${jPos + 1}`);
|
|
157
|
+
this.startPosition = this.startPositionName && this.positionNames ?
|
|
158
|
+
this.positionNames.indexOf(this.startPositionName) : 0;
|
|
159
|
+
this.endPosition = this.endPositionName && this.positionNames ?
|
|
160
|
+
this.positionNames.indexOf(this.endPositionName) : maxLength;
|
|
161
|
+
//#region -- palette --
|
|
162
|
+
switch (this.seqCol.semType) {
|
|
163
|
+
case Aminoacids.SemTypeMultipleAlignment:
|
|
164
|
+
this.cp = AminoacidsPalettes.GrokGroups;
|
|
165
|
+
break;
|
|
166
|
+
case Nucleotides.SemTypeMultipleAlignment:
|
|
167
|
+
this.cp = NucleotidesPalettes.Chromatogram;
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
//#endregion -- palette --
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
this.cp = null;
|
|
174
|
+
this.positionNames = [];
|
|
175
|
+
this.startPosition = -1;
|
|
176
|
+
this.endPosition = -1;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
this.render();
|
|
180
|
+
}
|
|
181
|
+
onPropertyChanged(property) {
|
|
182
|
+
super.onPropertyChanged(property);
|
|
183
|
+
switch (property.name) {
|
|
184
|
+
case 'considerNullSequences':
|
|
185
|
+
this.render();
|
|
186
|
+
break;
|
|
187
|
+
case 'sequenceColumnName':
|
|
188
|
+
this.updateSeqCol();
|
|
189
|
+
break;
|
|
190
|
+
case 'startPositionName':
|
|
191
|
+
this.updateSeqCol();
|
|
192
|
+
break;
|
|
193
|
+
case 'endPositionName':
|
|
194
|
+
this.updateSeqCol();
|
|
195
|
+
break;
|
|
196
|
+
case 'minHeight':
|
|
197
|
+
this.render(true);
|
|
198
|
+
break;
|
|
199
|
+
case 'maxHeight':
|
|
200
|
+
this.render(true);
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
onTableAttached() {
|
|
205
|
+
this.updateSeqCol();
|
|
206
|
+
if (this.dataFrame !== void 0) {
|
|
207
|
+
// There are two approaches:
|
|
208
|
+
// first - look in the dataFrame for the first matching column by semType of the
|
|
209
|
+
// corresponding viewer (but we want only one class of a more universal viewer),
|
|
210
|
+
// second - draw column data if the passed column is of suitable semType
|
|
211
|
+
// We decided that we will not search, but we will display asked data if we can
|
|
212
|
+
// const semType = (<typeof NucleotidesWebLogo>(this.constructor)).residuesSet;
|
|
213
|
+
// this.seqCol = (this.dataFrame.columns as DG.ColumnList).bySemType(semType);
|
|
214
|
+
this.dataFrame.selection.onChanged.subscribe((_) => this.render());
|
|
215
|
+
this.dataFrame.filter.onChanged.subscribe((_) => this.render());
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
_nullSequence(fillerResidue = 'X') {
|
|
219
|
+
if (this.considerNullSequences)
|
|
220
|
+
return new Array(this.Length).fill(fillerResidue).join('');
|
|
221
|
+
return '';
|
|
222
|
+
}
|
|
223
|
+
_calculate() {
|
|
224
|
+
if (!this.canvas || !this.seqCol || !this.dataFrame || this.startPosition === -1 || this.endPosition === -1)
|
|
225
|
+
return;
|
|
226
|
+
const width = this.Length * this.positionWidth;
|
|
227
|
+
this.canvas.width = width;
|
|
228
|
+
this.canvas.style.width = `${width}px`;
|
|
229
|
+
this.root.style.width = `${this.canvas.width}px`;
|
|
230
|
+
this.positions = new Array(this.Length);
|
|
231
|
+
for (let jPos = 0; jPos < this.Length; jPos++) {
|
|
232
|
+
const posName = this.positionNames[this.startPosition + jPos];
|
|
233
|
+
this.positions[jPos] = new PositionInfo(posName);
|
|
234
|
+
}
|
|
235
|
+
// 2022-05-05 askalkin instructed to show WebLogo based on filter (not selection)
|
|
236
|
+
const indices = this.dataFrame.filter.getSelectedIndexes();
|
|
237
|
+
// const indices = this.dataFrame.selection.trueCount > 0 ? this.dataFrame.selection.getSelectedIndexes() :
|
|
238
|
+
// this.dataFrame.filter.getSelectedIndexes();
|
|
239
|
+
this.rowsMasked = indices.length;
|
|
240
|
+
this.rowsNull = 0;
|
|
241
|
+
for (const i of indices) {
|
|
242
|
+
let s = (this.seqCol.get(i));
|
|
243
|
+
if (!s) {
|
|
244
|
+
s = this._nullSequence();
|
|
245
|
+
++this.rowsNull;
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
for (let jPos = 0; jPos < this.Length; jPos++) {
|
|
249
|
+
const pmInfo = this.positions[jPos].freq;
|
|
250
|
+
const m = s[this.startPosition + jPos];
|
|
251
|
+
if (!(m in pmInfo))
|
|
252
|
+
pmInfo[m] = new PositionMonomerInfo();
|
|
253
|
+
pmInfo[m].count++;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
//#region Polish freq counts
|
|
258
|
+
for (let jPos = 0; jPos < this.Length; jPos++) {
|
|
259
|
+
// delete this.positions[jPos].freq['-'];
|
|
260
|
+
this.positions[jPos].rowCount = 0;
|
|
261
|
+
for (const m in this.positions[jPos].freq)
|
|
262
|
+
this.positions[jPos].rowCount += this.positions[jPos].freq[m].count;
|
|
263
|
+
}
|
|
264
|
+
//#endregion
|
|
265
|
+
const maxHeight = this.canvas.height - this.axisHeight;
|
|
266
|
+
// console.debug(`WebLogo._calculate() maxHeight=${maxHeight}.`);
|
|
267
|
+
//#region Calculate screen
|
|
268
|
+
for (let jPos = 0; jPos < this.Length; jPos++) {
|
|
269
|
+
const freq = this.positions[jPos].freq;
|
|
270
|
+
const rowCount = this.positions[jPos].rowCount;
|
|
271
|
+
let y = this.axisHeight;
|
|
272
|
+
const entries = Object.entries(freq).sort((a, b) => {
|
|
273
|
+
if (a[0] !== '-' && b[0] !== '-')
|
|
274
|
+
return b[1].count - a[1].count;
|
|
275
|
+
else if (a[0] === '-' && b[0] === '-')
|
|
276
|
+
return 0;
|
|
277
|
+
else if (a[0] === '-')
|
|
278
|
+
return -1;
|
|
279
|
+
else /* (b[0] === '-') */
|
|
280
|
+
return +1;
|
|
281
|
+
});
|
|
282
|
+
for (const entry of entries) {
|
|
283
|
+
const pmInfo = entry[1];
|
|
284
|
+
// const m: string = entry[0];
|
|
285
|
+
const h = maxHeight * pmInfo.count / rowCount;
|
|
286
|
+
pmInfo.bounds = new DG.Rect(jPos * this.positionWidth, y, this.positionWidth, h);
|
|
287
|
+
y += h;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
//#endregion
|
|
291
|
+
}
|
|
292
|
+
// reflect changes made to filter/selection
|
|
293
|
+
render(recalc = true) {
|
|
294
|
+
var _a;
|
|
295
|
+
if (!this.canvas || !this.seqCol || !this.dataFrame || !this.cp ||
|
|
296
|
+
this.startPosition === -1 || this.endPosition === -1)
|
|
297
|
+
return;
|
|
298
|
+
const g = this.canvas.getContext('2d');
|
|
299
|
+
if (!g)
|
|
300
|
+
return;
|
|
301
|
+
if (recalc)
|
|
302
|
+
this._calculate();
|
|
303
|
+
// let rowCount = this.rowsMasked;
|
|
304
|
+
// if (!this.considerNullSequences)
|
|
305
|
+
// rowCount -= this.rowsNull;
|
|
306
|
+
g.resetTransform();
|
|
307
|
+
g.clearRect(0, 0, this.canvas.width, this.canvas.height);
|
|
308
|
+
g.textBaseline = this.textBaseline;
|
|
309
|
+
for (let jPos = 0; jPos < this.Length; jPos++) {
|
|
310
|
+
const pos = this.positions[jPos];
|
|
311
|
+
g.resetTransform();
|
|
312
|
+
g.fillStyle = 'black';
|
|
313
|
+
g.textAlign = 'center';
|
|
314
|
+
g.font = '10px Roboto, Roboto Local, sans-serif';
|
|
315
|
+
const posNameTm = g.measureText(pos.name);
|
|
316
|
+
const jPosWidth = posNameTm.width < (this.positionWidth - 2) ? posNameTm.width : (this.positionWidth - 2);
|
|
317
|
+
g.setTransform(jPosWidth / posNameTm.width, 0, 0, 1, jPos * this.positionWidth + this.positionWidth / 2, 0);
|
|
318
|
+
g.fillText(pos.name, 0, 0);
|
|
319
|
+
for (const [monomer, pmInfo] of Object.entries(this.positions[jPos].freq)) {
|
|
320
|
+
if (monomer !== '-') {
|
|
321
|
+
const b = pmInfo.bounds;
|
|
322
|
+
const fontStyle = '16px Roboto, Roboto Local, sans-serif';
|
|
323
|
+
// Hacks to scale uppercase characters to target rectangle
|
|
324
|
+
const uppercaseLetterAscent = 0.25;
|
|
325
|
+
const uppercaseLetterHeight = 12.2;
|
|
326
|
+
g.resetTransform();
|
|
327
|
+
g.strokeStyle = 'lightgray';
|
|
328
|
+
g.lineWidth = 1;
|
|
329
|
+
g.rect(b.left, b.top, b.width, b.height);
|
|
330
|
+
g.fillStyle = (_a = this.cp[monomer]) !== null && _a !== void 0 ? _a : this.cp['other'];
|
|
331
|
+
g.textAlign = 'left';
|
|
332
|
+
g.font = fontStyle;
|
|
333
|
+
//g.fillRect(b.left, b.top, b.width, b.height);
|
|
334
|
+
const mTm = g.measureText(monomer);
|
|
335
|
+
// if (mM.actualBoundingBoxAscent != 0)
|
|
336
|
+
// console.debug(`m: ${m}, mM.actualBoundingBoxAscent: ${mM.actualBoundingBoxAscent}`);
|
|
337
|
+
g.setTransform(b.width / mTm.width, 0, 0, b.height / uppercaseLetterHeight, b.left, b.top);
|
|
338
|
+
g.fillText(monomer, 0, -uppercaseLetterAscent);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
WebLogo.residuesSet = 'nucleotides';
|
|
345
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWxvZ28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWItbG9nby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFJN0IsT0FBTyxFQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFnQmhFLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxVQUFTLEtBQWlCO0lBQ3hFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQzFDLE9BQU8sSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzRSxDQUFDLENBQUM7QUFFRixFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBUyxDQUFTLEVBQUUsQ0FBUztJQUN4RCxPQUFPLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQ2hGLENBQUMsQ0FBQztBQUVGLE1BQU0sT0FBTyxtQkFBbUI7SUFTOUI7UUFDRSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxZQUFZO0lBS3ZCOztPQUVHO0lBQ0gsWUFBWSxJQUFZO1FBQ3RCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLE9BQVEsU0FBUSxFQUFFLENBQUMsUUFBUTtJQXFDdEM7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQW5DViw0RkFBNEY7UUFDbEYsT0FBRSxHQUE0QixJQUFJLENBQUM7UUFPckMsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUN4QixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUUzQixXQUFNLEdBQXFCLElBQUksQ0FBQztRQUN4QyxtQ0FBbUM7UUFDM0IsY0FBUyxHQUFtQixFQUFFLENBQUM7UUFFL0IsZUFBVSxHQUFXLENBQUMsQ0FBQztRQUN2QixhQUFRLEdBQVcsQ0FBQyxDQUFDO1FBVXJCLGtCQUFhLEdBQWEsRUFBRSxDQUFDO1FBRTdCLGtCQUFhLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFM0IsZ0JBQVcsR0FBVyxDQUFDLENBQUMsQ0FBQztRQU8vQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUUxQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFOUMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFbEUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFmRCxJQUFZLE1BQU0sS0FBYSxPQUFPLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBaUI1RSxJQUFJOztZQUNSLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFFakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBRXZDLHNEQUFzRDtZQUV0RCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQVcsRUFBdUQsRUFBRTtnQkFDdEYsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFdEMsSUFBSSxRQUFRLEtBQUssS0FBSyxDQUFDO29CQUNyQixPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFFNUIsTUFBTSxPQUFPLEdBQXVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztxQkFDM0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxPQUFPLEtBQUssU0FBUztvQkFDdkIsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBRTVCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNqRCxDQUFDLENBQUM7WUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQWEsRUFBRSxFQUFFO1lBRTVDLENBQUMsQ0FBQztZQUVGLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFRLEVBQUUsRUFBRTtnQkFDOUQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO29CQUNkLE9BQU87Z0JBRVQsTUFBTSxJQUFJLEdBQUcsQ0FBZSxDQUFDO2dCQUM3QixNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBRXhFLGlEQUFpRDtnQkFDakQsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxFQUFFO29CQUM1QyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQy9DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNuQyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7d0JBQ3pELE9BQU8sSUFBSSxLQUFLLE9BQU8sQ0FBQztvQkFDMUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7aUJBQzlCO3FCQUFNO29CQUNMLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQ25CO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUU7Z0JBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtvQkFDZCxPQUFPO2dCQUVULE1BQU0sSUFBSSxHQUFHLENBQWUsQ0FBQztnQkFDN0IsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUV4RSx1REFBdUQ7Z0JBQ3ZELGlEQUFpRDtnQkFDakQsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxFQUFFO29CQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTt3QkFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ25DLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzt3QkFDekQsT0FBTyxJQUFJLEtBQUssT0FBTyxDQUFDO29CQUMxQixDQUFDLENBQUMsQ0FBQztpQkFDSjtZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlCLDJDQUEyQztZQUMzQywrQkFBK0I7WUFFL0IsZ0ZBQWdGO1lBQ2hGLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFekUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixDQUFDO0tBQUE7SUFFRCxtQ0FBbUM7SUFDbkMsaURBQWlEO0lBQ2pELG1EQUFtRDtJQUNuRCx1R0FBdUc7SUFDdkcsd0JBQXdCO0lBQ3hCLElBQUk7SUFFSixpQkFBaUIsQ0FBQyxJQUFTO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUNkLE9BQU87UUFFVCwwREFBMEQ7UUFFMUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDMUYsc0ZBQXNGO1FBQ3RGLCtEQUErRDtRQUMvRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUM7UUFFekMsaURBQWlEO1FBQ2pELHFGQUFxRjtRQUNyRixpRkFBaUY7UUFFakYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQ7T0FDRztJQUNILFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUMxRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2YsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQixLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtvQkFDM0MsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFbkQsMERBQTBEO2dCQUMxRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUM3RCxrREFBa0Q7Z0JBQ2xELElBQUksQ0FBQyxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3pGLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRTVELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDakUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBRS9ELHVCQUF1QjtnQkFDdkIsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtvQkFDN0IsS0FBSyxVQUFVLENBQUMsd0JBQXdCO3dCQUN0QyxJQUFJLENBQUMsRUFBRSxHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQzt3QkFDeEMsTUFBTTtvQkFDUixLQUFLLFdBQVcsQ0FBQyx3QkFBd0I7d0JBQ3ZDLElBQUksQ0FBQyxFQUFFLEdBQUcsbUJBQW1CLENBQUMsWUFBWSxDQUFDO3dCQUMzQyxNQUFNO2lCQUNQO2dCQUNELDBCQUEwQjthQUMzQjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQztnQkFDZixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUN2QjtTQUNGO1FBQ0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxRQUFxQjtRQUNyQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbEMsUUFBUSxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLEtBQUssdUJBQXVCO2dCQUMxQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2QsTUFBTTtZQUNSLEtBQUssb0JBQW9CO2dCQUN2QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3BCLE1BQU07WUFDUixLQUFLLG1CQUFtQjtnQkFDdEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNwQixNQUFNO1lBQ1IsS0FBSyxpQkFBaUI7Z0JBQ3BCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEIsTUFBTTtZQUNSLEtBQUssV0FBVztnQkFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQixNQUFNO1lBQ1IsS0FBSyxXQUFXO2dCQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xCLE1BQU07U0FDUDtJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBCLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsRUFBRTtZQUM3Qiw0QkFBNEI7WUFDNUIsaUZBQWlGO1lBQ2pGLHlGQUF5RjtZQUN6Rix3RUFBd0U7WUFDeEUsK0VBQStFO1lBQy9FLCtFQUErRTtZQUMvRSw4RUFBOEU7WUFFOUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDakU7SUFDSCxDQUFDO0lBRVMsYUFBYSxDQUFDLGFBQWEsR0FBRyxHQUFHO1FBQ3pDLElBQUksSUFBSSxDQUFDLHFCQUFxQjtZQUM1QixPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTdELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVTLFVBQVU7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxDQUFDO1lBQ3pHLE9BQU87UUFFVCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLEtBQUssSUFBSSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUM7UUFFakQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDN0MsTUFBTSxPQUFPLEdBQVcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbEQ7UUFFRCxpRkFBaUY7UUFDakYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzRCwyR0FBMkc7UUFDM0csZ0RBQWdEO1FBRWhELElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUVsQixLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sRUFBRTtZQUN2QixJQUFJLENBQUMsR0FBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTdDLElBQUksQ0FBQyxDQUFDLEVBQUU7Z0JBQ04sQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDekIsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ2pCO2lCQUFNO2dCQUNMLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFO29CQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDekMsTUFBTSxDQUFDLEdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLENBQUM7b0JBQy9DLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUM7d0JBQ2hCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7b0JBRXhDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDbkI7YUFDRjtTQUNGO1FBRUQsNEJBQTRCO1FBQzVCLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQzdDLHlDQUF5QztZQUV6QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDbEMsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUk7Z0JBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUN2RTtRQUNELFlBQVk7UUFFWixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3ZELGlFQUFpRTtRQUVqRSwwQkFBMEI7UUFDMUIsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDN0MsTUFBTSxJQUFJLEdBQXlDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzdFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBRS9DLElBQUksQ0FBQyxHQUFXLElBQUksQ0FBQyxVQUFVLENBQUM7WUFFaEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztvQkFDOUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7cUJBQzVCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztvQkFDbkMsT0FBTyxDQUFDLENBQUM7cUJBQ04sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztvQkFDbkIsT0FBTyxDQUFDLENBQUMsQ0FBQztxQkFDUCxvQkFBb0I7b0JBQ3ZCLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztZQUNILEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFO2dCQUMzQixNQUFNLE1BQU0sR0FBd0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3Qyw4QkFBOEI7Z0JBQzlCLE1BQU0sQ0FBQyxHQUFXLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztnQkFFdEQsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pGLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDUjtTQUNGO1FBQ0QsWUFBWTtJQUNkLENBQUM7SUFFRCwyQ0FBMkM7SUFDM0MsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJOztRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDN0QsSUFBSSxDQUFDLGFBQWEsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLENBQUMsQ0FBQztZQUNwRCxPQUFPO1FBRVQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPO1FBRWYsSUFBSSxNQUFNO1lBQ1IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRXBCLGtDQUFrQztRQUNsQyxtQ0FBbUM7UUFDbkMsK0JBQStCO1FBRS9CLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNuQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFFbkMsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDN0MsTUFBTSxHQUFHLEdBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0MsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ25CLENBQUMsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxJQUFJLEdBQUcsdUNBQXVDLENBQUM7WUFDakQsTUFBTSxTQUFTLEdBQWdCLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUcsQ0FBQyxDQUFDLFlBQVksQ0FDWixTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFDcEMsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUUzQixLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN6RSxJQUFJLE9BQU8sS0FBSyxHQUFHLEVBQUU7b0JBQ25CLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBRXhCLE1BQU0sU0FBUyxHQUFHLHVDQUF1QyxDQUFDO29CQUMxRCwwREFBMEQ7b0JBQzFELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDO29CQUNuQyxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQztvQkFFbkMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUNuQixDQUFDLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztvQkFDNUIsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7b0JBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN6QyxDQUFDLENBQUMsU0FBUyxHQUFHLE1BQUEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsbUNBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDbkQsQ0FBQyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7b0JBQ3JCLENBQUMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO29CQUNuQiwrQ0FBK0M7b0JBQy9DLE1BQU0sR0FBRyxHQUFnQixDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUVoRCx1Q0FBdUM7b0JBQ3ZDLHlGQUF5RjtvQkFFekYsQ0FBQyxDQUFDLFlBQVksQ0FDWixDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLHFCQUFxQixFQUMzRCxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDakIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQztpQkFDaEQ7YUFDRjtTQUNGO0lBQ0gsQ0FBQzs7QUFwWWEsbUJBQVcsR0FBRyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQgKiBhcyByeGpzIGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1N0cmluZ0RpY3Rpb25hcnl9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcblxuaW1wb3J0IHtBbWlub2FjaWRzLCBBbWlub2FjaWRzUGFsZXR0ZXN9IGZyb20gJy4uL2FtaW5vYWNpZHMnO1xuaW1wb3J0IHtOdWNsZW90aWRlcywgTnVjbGVvdGlkZXNQYWxldHRlc30gZnJvbSAnLi4vbnVjbGVvdGlkZXMnO1xuXG4vLyBVc2luZyBjb2xvciBzY2hlbWVzIGZyb20gY2hlbS1wYWxldHRlXG5cbmRlY2xhcmUgbW9kdWxlICdkYXRhZ3Jvay1hcGkvc3JjL2dyaWQnIHtcbiAgaW50ZXJmYWNlIFJlY3Qge1xuICAgIGNvbnRhaW5zKHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbjtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MQ2FudmFzRWxlbWVudCB7XG4gICAgZ2V0Q3Vyc29yUG9zaXRpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiBERy5Qb2ludDtcbiAgfVxufVxuXG5IVE1MQ2FudmFzRWxlbWVudC5wcm90b3R5cGUuZ2V0Q3Vyc29yUG9zaXRpb24gPSBmdW5jdGlvbihldmVudDogTW91c2VFdmVudCk6IERHLlBvaW50IHtcbiAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiBuZXcgREcuUG9pbnQoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCwgZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKTtcbn07XG5cbkRHLlJlY3QucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRoaXMubGVmdCA8PSB4ICYmIHggPD0gdGhpcy5yaWdodCAmJiB0aGlzLnRvcCA8PSB5ICYmIHkgPD0gdGhpcy5ib3R0b207XG59O1xuXG5leHBvcnQgY2xhc3MgUG9zaXRpb25Nb25vbWVySW5mbyB7XG4gIC8qKiBTZXF1ZW5jZXMgY291bnQgd2l0aCBtb25vbWVyIGluIHBvc2l0aW9uXG4gICAqL1xuICBjb3VudDogbnVtYmVyO1xuXG4gIC8qKiBSZW1lbWJlciBzY3JlZW4gY29vcmRzIHJlY3RcbiAgICovXG4gIGJvdW5kczogREcuUmVjdDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvdW50ID0gMDtcbiAgICB0aGlzLmJvdW5kcyA9IG5ldyBERy5SZWN0KDAsIDAsIDAsIDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQb3NpdGlvbkluZm8ge1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBmcmVxOiB7IFttOiBzdHJpbmddOiBQb3NpdGlvbk1vbm9tZXJJbmZvIH07XG4gIHJvd0NvdW50OiBudW1iZXI7XG5cbiAgLyoqIGZyZXEgPSB7fSwgcm93Q291bnQgPSAwXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgcG9zaXRpb24gKCcxMTFBJywgJzExMS4xJywgZXRjKVxuICAgKi9cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmZyZXEgPSB7fTtcbiAgICB0aGlzLnJvd0NvdW50ID0gMDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2ViTG9nbyBleHRlbmRzIERHLkpzVmlld2VyIHtcbiAgcHVibGljIHN0YXRpYyByZXNpZHVlc1NldCA9ICdudWNsZW90aWRlcyc7XG5cbiAgLy8gcHJpdmF0ZSByZWFkb25seSBjb2xvclNjaGVtZTogQ29sb3JTY2hlbWUgPSBDb2xvclNjaGVtZXNbTnVjbGVvdGlkZXNXZWJMb2dvLnJlc2lkdWVzU2V0XTtcbiAgcHJvdGVjdGVkIGNwOiBTdHJpbmdEaWN0aW9uYXJ5IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gcHJpdmF0ZSByZWFkb25seSBob3N0OiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSBjYW52YXM/OiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgcHJpdmF0ZSBzbGlkZXI/OiBERy5SYW5nZVNsaWRlcjtcbiAgcHJpdmF0ZSB0ZXh0QmFzZWxpbmU6IENhbnZhc1RleHRCYXNlbGluZTtcblxuICBwcml2YXRlIGF4aXNIZWlnaHQ6IG51bWJlciA9IDEyO1xuICBwcml2YXRlIHBvc2l0aW9uV2lkdGg6IG51bWJlciA9IDE2O1xuXG4gIHByaXZhdGUgc2VxQ29sOiBERy5Db2x1bW4gfCBudWxsID0gbnVsbDtcbiAgLy8gcHJpdmF0ZSBtYXhMZW5ndGg6IG51bWJlciA9IDEwMDtcbiAgcHJpdmF0ZSBwb3NpdGlvbnM6IFBvc2l0aW9uSW5mb1tdID0gW107XG5cbiAgcHJpdmF0ZSByb3dzTWFza2VkOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJvd3NOdWxsOiBudW1iZXIgPSAwO1xuXG4gIC8vIFZpZXdlcidzIHByb3BlcnRpZXMgKGxpa2VseSB0aGV5IHNob3VsZCBiZSBwdWJsaWMgc28gdGhhdCB0aGV5IGNhbiBiZSBzZXQgb3V0c2lkZSlcbiAgcHVibGljIG1pbkhlaWdodDogbnVtYmVyO1xuICBwdWJsaWMgbWF4SGVpZ2h0OiBudW1iZXI7XG4gIHB1YmxpYyBjb25zaWRlck51bGxTZXF1ZW5jZXM6IGJvb2xlYW47XG4gIHB1YmxpYyBzZXF1ZW5jZUNvbHVtbk5hbWU6IHN0cmluZztcbiAgcHVibGljIHN0YXJ0UG9zaXRpb25OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBlbmRQb3NpdGlvbk5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIHBvc2l0aW9uTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgcHJpdmF0ZSBzdGFydFBvc2l0aW9uOiBudW1iZXIgPSAtMTtcblxuICBwcml2YXRlIGVuZFBvc2l0aW9uOiBudW1iZXIgPSAtMTtcblxuICBwcml2YXRlIGdldCBMZW5ndGgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLnN0YXJ0UG9zaXRpb24gKyAxOyB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMudGV4dEJhc2VsaW5lID0gJ3RvcCc7XG5cbiAgICB0aGlzLm1pbkhlaWdodCA9IHRoaXMuZmxvYXQoJ21pbkhlaWdodCcsIDUwKTtcbiAgICB0aGlzLm1heEhlaWdodCA9IHRoaXMuZmxvYXQoJ21heEhlaWdodCcsIDEwMCk7XG5cbiAgICB0aGlzLmNvbnNpZGVyTnVsbFNlcXVlbmNlcyA9IHRoaXMuYm9vbCgnY29uc2lkZXJOdWxsU2VxdWVuY2VzJywgZmFsc2UpO1xuICAgIHRoaXMuc2VxdWVuY2VDb2x1bW5OYW1lID0gdGhpcy5zdHJpbmcoJ3NlcXVlbmNlQ29sdW1uTmFtZScsIG51bGwpO1xuXG4gICAgdGhpcy5zdGFydFBvc2l0aW9uTmFtZSA9IHRoaXMuc3RyaW5nKCdzdGFydFBvc2l0aW9uTmFtZScsIG51bGwpO1xuICAgIHRoaXMuZW5kUG9zaXRpb25OYW1lID0gdGhpcy5zdHJpbmcoJ2VuZFBvc2l0aW9uTmFtZScsIG51bGwpO1xuICB9XG5cbiAgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNhbnZhcyA9IHVpLmNhbnZhcygpO1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuXG4gICAgdGhpcy5zbGlkZXIgPSB1aS5yYW5nZVNsaWRlcigwLCAyMCwgMiwgNSk7XG4gICAgdGhpcy5zbGlkZXIucm9vdC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICB0aGlzLnNsaWRlci5yb290LnN0eWxlLmhlaWdodCA9ICcxMnB4JztcblxuICAgIC8vIHRoaXMuaG9zdCA9IHVpLmRpdlYoWy8qdGhpcy5zbGlkZXIsKi90aGlzLmNhbnZhc10pO1xuXG4gICAgY29uc3QgZ2V0TW9ub21lciA9IChwOiBERy5Qb2ludCk6IFtudW1iZXIsIHN0cmluZyB8IG51bGwsIFBvc2l0aW9uTW9ub21lckluZm8gfCBudWxsXSA9PiB7XG4gICAgICBjb25zdCBqUG9zID0gTWF0aC5mbG9vcihwLnggLyB0aGlzLnBvc2l0aW9uV2lkdGgpO1xuICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uc1tqUG9zXTtcblxuICAgICAgaWYgKHBvc2l0aW9uID09PSB2b2lkIDApXG4gICAgICAgIHJldHVybiBbalBvcywgbnVsbCwgbnVsbF07XG5cbiAgICAgIGNvbnN0IG1vbm9tZXI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IE9iamVjdC5rZXlzKHBvc2l0aW9uLmZyZXEpXG4gICAgICAgIC5maW5kKChtKSA9PiBwb3NpdGlvbi5mcmVxW21dLmJvdW5kcy5jb250YWlucyhwLngsIHAueSkpO1xuICAgICAgaWYgKG1vbm9tZXIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIFtqUG9zLCBudWxsLCBudWxsXTtcblxuICAgICAgcmV0dXJuIFtqUG9zLCBtb25vbWVyLCBwb3NpdGlvbi5mcmVxW21vbm9tZXJdXTtcbiAgICB9O1xuXG4gICAgdGhpcy5jYW52YXMub25tb3VzZW92ZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuXG4gICAgfTtcblxuICAgIHJ4anMuZnJvbUV2ZW50KHRoaXMuY2FudmFzLCAnbW91c2Vtb3ZlJykuc3Vic2NyaWJlKChlOiBFdmVudCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmNhbnZhcylcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhcmdzID0gZSBhcyBNb3VzZUV2ZW50O1xuICAgICAgY29uc3QgW2pQb3MsIG1vbm9tZXJdID0gZ2V0TW9ub21lcih0aGlzLmNhbnZhcy5nZXRDdXJzb3JQb3NpdGlvbihhcmdzKSk7XG5cbiAgICAgIC8vaWYgKHRoaXMuZGF0YUZyYW1lICYmIHRoaXMuc2VxQ29sICYmIG1vbm9tZXIpIHtcbiAgICAgIGlmICh0aGlzLmRhdGFGcmFtZSAmJiB0aGlzLnNlcUNvbCAmJiBtb25vbWVyKSB7XG4gICAgICAgIHVpLnRvb2x0aXAuc2hvd1Jvd0dyb3VwKHRoaXMuZGF0YUZyYW1lLCAoaVJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlcSA9IHRoaXMuc2VxQ29sIS5nZXQoaVJvdyk7XG4gICAgICAgICAgY29uc3QgbVNlcSA9IHNlcSA/IHNlcVt0aGlzLnN0YXJ0UG9zaXRpb24gKyBqUG9zXSA6IG51bGw7XG4gICAgICAgICAgcmV0dXJuIG1TZXEgPT09IG1vbm9tZXI7XG4gICAgICAgIH0sIGFyZ3MueCArIDE2LCBhcmdzLnkgKyAxNik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1aS50b29sdGlwLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJ4anMuZnJvbUV2ZW50KHRoaXMuY2FudmFzLCAnbW91c2Vkb3duJykuc3Vic2NyaWJlKChlOiBFdmVudCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmNhbnZhcylcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhcmdzID0gZSBhcyBNb3VzZUV2ZW50O1xuICAgICAgY29uc3QgW2pQb3MsIG1vbm9tZXJdID0gZ2V0TW9ub21lcih0aGlzLmNhbnZhcy5nZXRDdXJzb3JQb3NpdGlvbihhcmdzKSk7XG5cbiAgICAgIC8vIHByZXZlbnRzIGRlc2VsZWN0IGFsbCByb3dzIGlmIHdlIG1pc3MgbW9ub21lciBib3VuZHNcbiAgICAgIC8vaWYgKHRoaXMuZGF0YUZyYW1lICYmIHRoaXMuc2VxQ29sICYmIG1vbm9tZXIpIHtcbiAgICAgIGlmICh0aGlzLmRhdGFGcmFtZSAmJiB0aGlzLnNlcUNvbCAmJiBtb25vbWVyKSB7XG4gICAgICAgIHRoaXMuZGF0YUZyYW1lLnNlbGVjdGlvbi5pbml0KChpUm93KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VxID0gdGhpcy5zZXFDb2whLmdldChpUm93KTtcbiAgICAgICAgICBjb25zdCBtU2VxID0gc2VxID8gc2VxW3RoaXMuc3RhcnRQb3NpdGlvbiArIGpQb3NdIDogbnVsbDtcbiAgICAgICAgICByZXR1cm4gbVNlcSA9PT0gbW9ub21lcjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJvb3QuYXBwZW5kKHRoaXMuY2FudmFzKTtcbiAgICAvLyB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5zbGlkZXIucm9vdCk7XG4gICAgLy8gdGhpcy5yb290LmFwcGVuZCh0aGlzLmhvc3QpO1xuXG4gICAgLy8gdWkub25TaXplQ2hhbmdlZCh0aGlzLmNhbnZhcykuc3Vic2NyaWJlKHRoaXMuY2FudmFzT25TaXplQ2hhbmdlZC5iaW5kKHRoaXMpKTtcbiAgICB1aS5vblNpemVDaGFuZ2VkKHRoaXMucm9vdCkuc3Vic2NyaWJlKHRoaXMucm9vdE9uU2l6ZUNoYW5nZWQuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgfVxuXG4gIC8vIGNhbnZhc09uU2l6ZUNoYW5nZWQoYXJnczogYW55KSB7XG4gIC8vICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNhbnZhcy5jbGllbnRXaWR0aDtcbiAgLy8gICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQ7XG4gIC8vICAgY29uc29sZS5kZWJ1ZyhgV2ViTG9nby5vblNpemVDaGFuZ2VkKCkgd2lkdGg9JHt0aGlzLmNhbnZhcy53aWR0aH0sIGhlaWdodD0ke3RoaXMuY2FudmFzLmhlaWdodH1gKTtcbiAgLy8gICB0aGlzLnJlbmRlcihmYWxzZSk7XG4gIC8vIH1cblxuICByb290T25TaXplQ2hhbmdlZChhcmdzOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuY2FudmFzKVxuICAgICAgcmV0dXJuO1xuXG4gICAgLy8gdGhpcy5jYW52YXMud2lkdGggY2FsY3VsYXRlIGluIHRoaXMuX2NhbGN1bGF0ZSgpIG1ldGhvZFxuXG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5taW4odGhpcy5tYXhIZWlnaHQsIE1hdGgubWF4KHRoaXMubWluSGVpZ2h0LCB0aGlzLnJvb3QuY2xpZW50SGVpZ2h0KSk7XG4gICAgLy8gaWYgKHRoaXMuY2FudmFzLndpZHRoID4gdGhpcy5yb290LmNsaWVudFdpZHRoKSAvKiBob3Jpem9udGFsIHNjcm9sbGVyIGlzIGVuYWJsZWQgKi9cbiAgICAvLyAgIGhlaWdodCAtPSA2OyAvKiBmcmVlIHNvbWUgc3BhY2UgZm9yIGhvcml6b250YWwgc2Nyb2xsZXIgKi9cbiAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5jYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcblxuICAgIC8vIGNvbnNvbGUuZGVidWcoYFdlYkxvZ28ub25Sb290U2l6ZUNoYW5nZWQoKSBgICtcbiAgICAvLyAgIGByb290LndpZHRoPSR7dGhpcy5yb290LmNsaWVudFdpZHRofSwgcm9vdC5oZWlnaHQ9JHt0aGlzLnJvb3QuY2xpZW50SGVpZ2h0fSwgYCArXG4gICAgLy8gICBgY2FudmFzLndpZHRoPSR7dGhpcy5jYW52YXMud2lkdGh9LCBjYW52YXMuaGVpZ2h0PSR7dGhpcy5jYW52YXMuaGVpZ2h0fSAuYCk7XG5cbiAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgfVxuXG4gIC8qKiBBc3NpZ25zIHtAbGluayBzZXFDb2x9IGFuZCB7QGxpbmsgY3B9IGJhc2VkIG9uIHtAbGluayBzZXF1ZW5jZUNvbHVtbk5hbWV9IGFuZCBjYWxscyB7QGxpbmsgcmVuZGVyfSgpLlxuICAgKi9cbiAgdXBkYXRlU2VxQ29sKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGFGcmFtZSkge1xuICAgICAgdGhpcy5zZXFDb2wgPSB0aGlzLmRhdGFGcmFtZS5jb2wodGhpcy5zZXF1ZW5jZUNvbHVtbk5hbWUpO1xuICAgICAgaWYgKHRoaXMuc2VxQ29sKSB7XG4gICAgICAgIGxldCBtYXhMZW5ndGggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIHRoaXMuc2VxQ29sLmNhdGVnb3JpZXMpXG4gICAgICAgICAgbWF4TGVuZ3RoID0gTWF0aC5tYXgobWF4TGVuZ3RoLCBjYXRlZ29yeS5sZW5ndGgpO1xuXG4gICAgICAgIC8vIEdldCBwb3NpdGlvbiBuYW1lcyBmcm9tIGRhdGEgY29sdW1uIHRhZyAncG9zaXRpb25OYW1lcydcbiAgICAgICAgY29uc3QgcG9zaXRpb25OYW1lc1R4dCA9IHRoaXMuc2VxQ29sLmdldFRhZygncG9zaXRpb25OYW1lcycpO1xuICAgICAgICAvLyBGYWxsYmFjayBpZiAncG9zaXRpb25OYW1lcycgdGFnIGlzIG5vdCBwcm92aWRlZFxuICAgICAgICB0aGlzLnBvc2l0aW9uTmFtZXMgPSBwb3NpdGlvbk5hbWVzVHh0ID8gcG9zaXRpb25OYW1lc1R4dC5zcGxpdCgnLCAnKS5tYXAoKG4pID0+IG4udHJpbSgpKSA6XG4gICAgICAgICAgWy4uLkFycmF5KG1heExlbmd0aCkua2V5cygpXS5tYXAoKGpQb3MpID0+IGAke2pQb3MgKyAxfWApO1xuXG4gICAgICAgIHRoaXMuc3RhcnRQb3NpdGlvbiA9IHRoaXMuc3RhcnRQb3NpdGlvbk5hbWUgJiYgdGhpcy5wb3NpdGlvbk5hbWVzID9cbiAgICAgICAgICB0aGlzLnBvc2l0aW9uTmFtZXMuaW5kZXhPZih0aGlzLnN0YXJ0UG9zaXRpb25OYW1lKSA6IDA7XG4gICAgICAgIHRoaXMuZW5kUG9zaXRpb24gPSB0aGlzLmVuZFBvc2l0aW9uTmFtZSAmJiB0aGlzLnBvc2l0aW9uTmFtZXMgP1xuICAgICAgICAgIHRoaXMucG9zaXRpb25OYW1lcy5pbmRleE9mKHRoaXMuZW5kUG9zaXRpb25OYW1lKSA6IG1heExlbmd0aDtcblxuICAgICAgICAvLyNyZWdpb24gLS0gcGFsZXR0ZSAtLVxuICAgICAgICBzd2l0Y2ggKHRoaXMuc2VxQ29sLnNlbVR5cGUpIHtcbiAgICAgICAgY2FzZSBBbWlub2FjaWRzLlNlbVR5cGVNdWx0aXBsZUFsaWdubWVudDpcbiAgICAgICAgICB0aGlzLmNwID0gQW1pbm9hY2lkc1BhbGV0dGVzLkdyb2tHcm91cHM7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTnVjbGVvdGlkZXMuU2VtVHlwZU11bHRpcGxlQWxpZ25tZW50OlxuICAgICAgICAgIHRoaXMuY3AgPSBOdWNsZW90aWRlc1BhbGV0dGVzLkNocm9tYXRvZ3JhbTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyNlbmRyZWdpb24gLS0gcGFsZXR0ZSAtLVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jcCA9IG51bGw7XG4gICAgICAgIHRoaXMucG9zaXRpb25OYW1lcyA9IFtdO1xuICAgICAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPSAtMTtcbiAgICAgICAgdGhpcy5lbmRQb3NpdGlvbiA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgb25Qcm9wZXJ0eUNoYW5nZWQocHJvcGVydHk6IERHLlByb3BlcnR5KTogdm9pZCB7XG4gICAgc3VwZXIub25Qcm9wZXJ0eUNoYW5nZWQocHJvcGVydHkpO1xuXG4gICAgc3dpdGNoIChwcm9wZXJ0eS5uYW1lKSB7XG4gICAgY2FzZSAnY29uc2lkZXJOdWxsU2VxdWVuY2VzJzpcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZXF1ZW5jZUNvbHVtbk5hbWUnOlxuICAgICAgdGhpcy51cGRhdGVTZXFDb2woKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3N0YXJ0UG9zaXRpb25OYW1lJzpcbiAgICAgIHRoaXMudXBkYXRlU2VxQ29sKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdlbmRQb3NpdGlvbk5hbWUnOlxuICAgICAgdGhpcy51cGRhdGVTZXFDb2woKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21pbkhlaWdodCc6XG4gICAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21heEhlaWdodCc6XG4gICAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG9uVGFibGVBdHRhY2hlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZVNlcUNvbCgpO1xuXG4gICAgaWYgKHRoaXMuZGF0YUZyYW1lICE9PSB2b2lkIDApIHtcbiAgICAgIC8vIFRoZXJlIGFyZSB0d28gYXBwcm9hY2hlczpcbiAgICAgIC8vIGZpcnN0ICAtIGxvb2sgaW4gdGhlIGRhdGFGcmFtZSBmb3IgdGhlIGZpcnN0IG1hdGNoaW5nIGNvbHVtbiBieSBzZW1UeXBlIG9mIHRoZVxuICAgICAgLy8gICAgICAgICAgY29ycmVzcG9uZGluZyB2aWV3ZXIgKGJ1dCB3ZSB3YW50IG9ubHkgb25lIGNsYXNzIG9mIGEgbW9yZSB1bml2ZXJzYWwgdmlld2VyKSxcbiAgICAgIC8vIHNlY29uZCAtIGRyYXcgY29sdW1uIGRhdGEgaWYgdGhlIHBhc3NlZCBjb2x1bW4gaXMgb2Ygc3VpdGFibGUgc2VtVHlwZVxuICAgICAgLy8gV2UgZGVjaWRlZCB0aGF0IHdlIHdpbGwgbm90IHNlYXJjaCwgYnV0IHdlIHdpbGwgZGlzcGxheSBhc2tlZCBkYXRhIGlmIHdlIGNhblxuICAgICAgLy8gY29uc3Qgc2VtVHlwZSA9ICg8dHlwZW9mIE51Y2xlb3RpZGVzV2ViTG9nbz4odGhpcy5jb25zdHJ1Y3RvcikpLnJlc2lkdWVzU2V0O1xuICAgICAgLy8gdGhpcy5zZXFDb2wgPSAodGhpcy5kYXRhRnJhbWUuY29sdW1ucyBhcyBERy5Db2x1bW5MaXN0KS5ieVNlbVR5cGUoc2VtVHlwZSk7XG5cbiAgICAgIHRoaXMuZGF0YUZyYW1lLnNlbGVjdGlvbi5vbkNoYW5nZWQuc3Vic2NyaWJlKChfKSA9PiB0aGlzLnJlbmRlcigpKTtcbiAgICAgIHRoaXMuZGF0YUZyYW1lLmZpbHRlci5vbkNoYW5nZWQuc3Vic2NyaWJlKChfKSA9PiB0aGlzLnJlbmRlcigpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX251bGxTZXF1ZW5jZShmaWxsZXJSZXNpZHVlID0gJ1gnKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jb25zaWRlck51bGxTZXF1ZW5jZXMpXG4gICAgICByZXR1cm4gbmV3IEFycmF5KHRoaXMuTGVuZ3RoKS5maWxsKGZpbGxlclJlc2lkdWUpLmpvaW4oJycpO1xuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jYWxjdWxhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmNhbnZhcyB8fCAhdGhpcy5zZXFDb2wgfHwgIXRoaXMuZGF0YUZyYW1lIHx8IHRoaXMuc3RhcnRQb3NpdGlvbiA9PT0gLTEgfHwgdGhpcy5lbmRQb3NpdGlvbiA9PT0gLTEpXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCB3aWR0aCA9IHRoaXMuTGVuZ3RoICogdGhpcy5wb3NpdGlvbldpZHRoO1xuICAgIHRoaXMuY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5jYW52YXMuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgdGhpcy5yb290LnN0eWxlLndpZHRoID0gYCR7dGhpcy5jYW52YXMud2lkdGh9cHhgO1xuXG4gICAgdGhpcy5wb3NpdGlvbnMgPSBuZXcgQXJyYXkodGhpcy5MZW5ndGgpO1xuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgY29uc3QgcG9zTmFtZTogc3RyaW5nID0gdGhpcy5wb3NpdGlvbk5hbWVzW3RoaXMuc3RhcnRQb3NpdGlvbiArIGpQb3NdO1xuICAgICAgdGhpcy5wb3NpdGlvbnNbalBvc10gPSBuZXcgUG9zaXRpb25JbmZvKHBvc05hbWUpO1xuICAgIH1cblxuICAgIC8vIDIwMjItMDUtMDUgYXNrYWxraW4gaW5zdHJ1Y3RlZCB0byBzaG93IFdlYkxvZ28gYmFzZWQgb24gZmlsdGVyIChub3Qgc2VsZWN0aW9uKVxuICAgIGNvbnN0IGluZGljZXMgPSB0aGlzLmRhdGFGcmFtZS5maWx0ZXIuZ2V0U2VsZWN0ZWRJbmRleGVzKCk7XG4gICAgLy8gY29uc3QgaW5kaWNlcyA9IHRoaXMuZGF0YUZyYW1lLnNlbGVjdGlvbi50cnVlQ291bnQgPiAwID8gdGhpcy5kYXRhRnJhbWUuc2VsZWN0aW9uLmdldFNlbGVjdGVkSW5kZXhlcygpIDpcbiAgICAvLyAgIHRoaXMuZGF0YUZyYW1lLmZpbHRlci5nZXRTZWxlY3RlZEluZGV4ZXMoKTtcblxuICAgIHRoaXMucm93c01hc2tlZCA9IGluZGljZXMubGVuZ3RoO1xuICAgIHRoaXMucm93c051bGwgPSAwO1xuXG4gICAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIHtcbiAgICAgIGxldCBzOiBzdHJpbmcgPSA8c3RyaW5nPih0aGlzLnNlcUNvbC5nZXQoaSkpO1xuXG4gICAgICBpZiAoIXMpIHtcbiAgICAgICAgcyA9IHRoaXMuX251bGxTZXF1ZW5jZSgpO1xuICAgICAgICArK3RoaXMucm93c051bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBqUG9zID0gMDsgalBvcyA8IHRoaXMuTGVuZ3RoOyBqUG9zKyspIHtcbiAgICAgICAgICBjb25zdCBwbUluZm8gPSB0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxO1xuICAgICAgICAgIGNvbnN0IG06IHN0cmluZyA9IHNbdGhpcy5zdGFydFBvc2l0aW9uICsgalBvc107XG4gICAgICAgICAgaWYgKCEobSBpbiBwbUluZm8pKVxuICAgICAgICAgICAgcG1JbmZvW21dID0gbmV3IFBvc2l0aW9uTW9ub21lckluZm8oKTtcblxuICAgICAgICAgIHBtSW5mb1ttXS5jb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8jcmVnaW9uIFBvbGlzaCBmcmVxIGNvdW50c1xuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgLy8gZGVsZXRlIHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXFbJy0nXTtcblxuICAgICAgdGhpcy5wb3NpdGlvbnNbalBvc10ucm93Q291bnQgPSAwO1xuICAgICAgZm9yIChjb25zdCBtIGluIHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXEpXG4gICAgICAgIHRoaXMucG9zaXRpb25zW2pQb3NdLnJvd0NvdW50ICs9IHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXFbbV0uY291bnQ7XG4gICAgfVxuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gdGhpcy5jYW52YXMuaGVpZ2h0IC0gdGhpcy5heGlzSGVpZ2h0O1xuICAgIC8vIGNvbnNvbGUuZGVidWcoYFdlYkxvZ28uX2NhbGN1bGF0ZSgpIG1heEhlaWdodD0ke21heEhlaWdodH0uYCk7XG5cbiAgICAvLyNyZWdpb24gQ2FsY3VsYXRlIHNjcmVlblxuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgY29uc3QgZnJlcTogeyBbYzogc3RyaW5nXTogUG9zaXRpb25Nb25vbWVySW5mbyB9ID0gdGhpcy5wb3NpdGlvbnNbalBvc10uZnJlcTtcbiAgICAgIGNvbnN0IHJvd0NvdW50ID0gdGhpcy5wb3NpdGlvbnNbalBvc10ucm93Q291bnQ7XG5cbiAgICAgIGxldCB5OiBudW1iZXIgPSB0aGlzLmF4aXNIZWlnaHQ7XG5cbiAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhmcmVxKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGlmIChhWzBdICE9PSAnLScgJiYgYlswXSAhPT0gJy0nKVxuICAgICAgICAgIHJldHVybiBiWzFdLmNvdW50IC0gYVsxXS5jb3VudDtcbiAgICAgICAgZWxzZSBpZiAoYVswXSA9PT0gJy0nICYmIGJbMF0gPT09ICctJylcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgZWxzZSBpZiAoYVswXSA9PT0gJy0nKVxuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgZWxzZSAvKiAoYlswXSA9PT0gJy0nKSAqL1xuICAgICAgICAgIHJldHVybiArMTtcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IHBtSW5mbzogUG9zaXRpb25Nb25vbWVySW5mbyA9IGVudHJ5WzFdO1xuICAgICAgICAvLyBjb25zdCBtOiBzdHJpbmcgPSBlbnRyeVswXTtcbiAgICAgICAgY29uc3QgaDogbnVtYmVyID0gbWF4SGVpZ2h0ICogcG1JbmZvLmNvdW50IC8gcm93Q291bnQ7XG5cbiAgICAgICAgcG1JbmZvLmJvdW5kcyA9IG5ldyBERy5SZWN0KGpQb3MgKiB0aGlzLnBvc2l0aW9uV2lkdGgsIHksIHRoaXMucG9zaXRpb25XaWR0aCwgaCk7XG4gICAgICAgIHkgKz0gaDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8jZW5kcmVnaW9uXG4gIH1cblxuICAvLyByZWZsZWN0IGNoYW5nZXMgbWFkZSB0byBmaWx0ZXIvc2VsZWN0aW9uXG4gIHJlbmRlcihyZWNhbGMgPSB0cnVlKSB7XG4gICAgaWYgKCF0aGlzLmNhbnZhcyB8fCAhdGhpcy5zZXFDb2wgfHwgIXRoaXMuZGF0YUZyYW1lIHx8ICF0aGlzLmNwIHx8XG4gICAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPT09IC0xIHx8IHRoaXMuZW5kUG9zaXRpb24gPT09IC0xKVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgZyA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFnKSByZXR1cm47XG5cbiAgICBpZiAocmVjYWxjKVxuICAgICAgdGhpcy5fY2FsY3VsYXRlKCk7XG5cbiAgICAvLyBsZXQgcm93Q291bnQgPSB0aGlzLnJvd3NNYXNrZWQ7XG4gICAgLy8gaWYgKCF0aGlzLmNvbnNpZGVyTnVsbFNlcXVlbmNlcylcbiAgICAvLyAgIHJvd0NvdW50IC09IHRoaXMucm93c051bGw7XG5cbiAgICBnLnJlc2V0VHJhbnNmb3JtKCk7XG4gICAgZy5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XG4gICAgZy50ZXh0QmFzZWxpbmUgPSB0aGlzLnRleHRCYXNlbGluZTtcblxuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgY29uc3QgcG9zOiBQb3NpdGlvbkluZm8gPSB0aGlzLnBvc2l0aW9uc1tqUG9zXTtcbiAgICAgIGcucmVzZXRUcmFuc2Zvcm0oKTtcbiAgICAgIGcuZmlsbFN0eWxlID0gJ2JsYWNrJztcbiAgICAgIGcudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICBnLmZvbnQgPSAnMTBweCBSb2JvdG8sIFJvYm90byBMb2NhbCwgc2Fucy1zZXJpZic7XG4gICAgICBjb25zdCBwb3NOYW1lVG06IFRleHRNZXRyaWNzID0gZy5tZWFzdXJlVGV4dChwb3MubmFtZSk7XG4gICAgICBjb25zdCBqUG9zV2lkdGggPSBwb3NOYW1lVG0ud2lkdGggPCAodGhpcy5wb3NpdGlvbldpZHRoIC0gMikgPyBwb3NOYW1lVG0ud2lkdGggOiAodGhpcy5wb3NpdGlvbldpZHRoIC0gMik7XG4gICAgICBnLnNldFRyYW5zZm9ybShcbiAgICAgICAgalBvc1dpZHRoIC8gcG9zTmFtZVRtLndpZHRoLCAwLCAwLCAxLFxuICAgICAgICBqUG9zICogdGhpcy5wb3NpdGlvbldpZHRoICsgdGhpcy5wb3NpdGlvbldpZHRoIC8gMiwgMCk7XG4gICAgICBnLmZpbGxUZXh0KHBvcy5uYW1lLCAwLCAwKTtcblxuICAgICAgZm9yIChjb25zdCBbbW9ub21lciwgcG1JbmZvXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxKSkge1xuICAgICAgICBpZiAobW9ub21lciAhPT0gJy0nKSB7XG4gICAgICAgICAgY29uc3QgYiA9IHBtSW5mby5ib3VuZHM7XG5cbiAgICAgICAgICBjb25zdCBmb250U3R5bGUgPSAnMTZweCBSb2JvdG8sIFJvYm90byBMb2NhbCwgc2Fucy1zZXJpZic7XG4gICAgICAgICAgLy8gSGFja3MgdG8gc2NhbGUgdXBwZXJjYXNlIGNoYXJhY3RlcnMgdG8gdGFyZ2V0IHJlY3RhbmdsZVxuICAgICAgICAgIGNvbnN0IHVwcGVyY2FzZUxldHRlckFzY2VudCA9IDAuMjU7XG4gICAgICAgICAgY29uc3QgdXBwZXJjYXNlTGV0dGVySGVpZ2h0ID0gMTIuMjtcblxuICAgICAgICAgIGcucmVzZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJ2xpZ2h0Z3JheSc7XG4gICAgICAgICAgZy5saW5lV2lkdGggPSAxO1xuICAgICAgICAgIGcucmVjdChiLmxlZnQsIGIudG9wLCBiLndpZHRoLCBiLmhlaWdodCk7XG4gICAgICAgICAgZy5maWxsU3R5bGUgPSB0aGlzLmNwW21vbm9tZXJdID8/IHRoaXMuY3BbJ290aGVyJ107XG4gICAgICAgICAgZy50ZXh0QWxpZ24gPSAnbGVmdCc7XG4gICAgICAgICAgZy5mb250ID0gZm9udFN0eWxlO1xuICAgICAgICAgIC8vZy5maWxsUmVjdChiLmxlZnQsIGIudG9wLCBiLndpZHRoLCBiLmhlaWdodCk7XG4gICAgICAgICAgY29uc3QgbVRtOiBUZXh0TWV0cmljcyA9IGcubWVhc3VyZVRleHQobW9ub21lcik7XG5cbiAgICAgICAgICAvLyBpZiAobU0uYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQgIT0gMClcbiAgICAgICAgICAvLyAgIGNvbnNvbGUuZGVidWcoYG06ICR7bX0sIG1NLmFjdHVhbEJvdW5kaW5nQm94QXNjZW50OiAke21NLmFjdHVhbEJvdW5kaW5nQm94QXNjZW50fWApO1xuXG4gICAgICAgICAgZy5zZXRUcmFuc2Zvcm0oXG4gICAgICAgICAgICBiLndpZHRoIC8gbVRtLndpZHRoLCAwLCAwLCBiLmhlaWdodCAvIHVwcGVyY2FzZUxldHRlckhlaWdodCxcbiAgICAgICAgICAgIGIubGVmdCwgYi50b3ApO1xuICAgICAgICAgIGcuZmlsbFRleHQobW9ub21lciwgMCwgLXVwcGVyY2FzZUxldHRlckFzY2VudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|