@datagrok/bio 2.11.11 → 2.11.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/23.js +2 -0
- package/dist/23.js.map +1 -0
- package/dist/282.js +2 -0
- package/dist/282.js.map +1 -0
- package/dist/361.js +1 -1
- package/dist/361.js.map +1 -1
- package/dist/40.js +2 -0
- package/dist/40.js.map +1 -0
- package/dist/562.js +2 -0
- package/dist/562.js.map +1 -0
- package/dist/586.js +2 -0
- package/dist/586.js.map +1 -0
- package/dist/65.js +2 -0
- package/dist/65.js.map +1 -0
- package/dist/935.js +3 -0
- package/dist/935.js.map +1 -0
- package/dist/package-test.js +1 -1
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/files/tests/to-atomic-level-peptides-fasta-output.csv +139 -139
- package/files/tests/to-atomic-level-pt-fasta-2.mol +1 -1
- package/package.json +8 -8
- package/scripts/sequence_generator.py +24 -22
- package/src/demo/bio05-helm-msa-sequence-space.ts +53 -13
- package/src/demo/utils.ts +2 -1
- package/src/function-edtiors/split-to-monomers-editor.ts +2 -2
- package/src/package.ts +80 -177
- package/src/tests/WebLogo-positions-test.ts +3 -3
- package/src/tests/mm-distance-tests.ts +4 -4
- package/src/tests/pepsea-tests.ts +1 -1
- package/src/tests/sequence-space-utils.ts +6 -2
- package/src/tests/similarity-diversity-tests.ts +16 -4
- package/src/tests/splitters-test.ts +0 -3
- package/src/tests/to-atomic-level-tests.ts +3 -3
- package/src/utils/cell-renderer.ts +1 -1
- package/src/utils/helm-to-molfile.ts +1 -1
- package/src/utils/monomer-lib.ts +1 -1
- package/src/utils/pepsea.ts +16 -1
- package/src/viewers/vd-regions-viewer.ts +43 -17
- package/src/viewers/web-logo-viewer.ts +40 -20
- package/dist/1.js +0 -2
- package/dist/1.js.map +0 -1
- package/dist/190.js +0 -2
- package/dist/190.js.map +0 -1
- package/dist/381.js +0 -2
- package/dist/381.js.map +0 -1
- package/dist/770.js +0 -2
- package/dist/770.js.map +0 -1
- package/dist/868.js +0 -2
- package/dist/868.js.map +0 -1
- package/dist/931.js +0 -3
- package/dist/931.js.map +0 -1
- package/src/utils/err-info.ts +0 -28
- /package/dist/{931.js.LICENSE.txt → 935.js.LICENSE.txt} +0 -0
|
@@ -16,7 +16,7 @@ category('PepSeA', () => {
|
|
|
16
16
|
await awaitContainerStart();
|
|
17
17
|
const table = DG.DataFrame.fromCsv(testCsv);
|
|
18
18
|
const alignedCol = await runPepsea(table.getCol('HELM'), 'msa(HELM)');
|
|
19
|
-
expect(alignedCol !== null, true, 'PepSeA
|
|
19
|
+
expect(alignedCol !== null, true, 'PepSeA container has not started');
|
|
20
20
|
const alignedTestCol = table.getCol('MSA');
|
|
21
21
|
for (let i = 0; i < alignedCol!.length; ++i)
|
|
22
22
|
expect(alignedCol!.get(i) == alignedTestCol.get(i), true);
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import * as DG from 'datagrok-api/dg';
|
|
2
2
|
import * as grok from 'datagrok-api/grok';
|
|
3
3
|
import {expect} from '@datagrok-libraries/utils/src/test';
|
|
4
|
-
import {
|
|
4
|
+
import {sequenceSpaceTopMenu} from '../package';
|
|
5
5
|
import {MmDistanceFunctionsNames} from '@datagrok-libraries/ml/src/macromolecule-distance-functions';
|
|
6
6
|
import {DimReductionMethods} from '@datagrok-libraries/ml/src/reduce-dimensionality';
|
|
7
|
+
import {BYPASS_LARGE_DATA_WARNING} from '@datagrok-libraries/ml/src/functionEditors/consts';
|
|
7
8
|
|
|
8
9
|
export async function _testSequenceSpaceReturnsResult(
|
|
9
10
|
df: DG.DataFrame, algorithm: DimReductionMethods, colName: string,
|
|
@@ -14,7 +15,10 @@ export async function _testSequenceSpaceReturnsResult(
|
|
|
14
15
|
if (semType)
|
|
15
16
|
col.semType = semType;
|
|
16
17
|
|
|
18
|
+
const preprocessingFunc = DG.Func.find({package: 'Bio', name: 'macromoleculePreprocessingFunction'})[0];
|
|
19
|
+
if (!preprocessingFunc)
|
|
20
|
+
throw new Error('Preprocessing function not found');
|
|
17
21
|
const sp = await sequenceSpaceTopMenu(df, df.col(colName)!, algorithm, MmDistanceFunctionsNames.LEVENSHTEIN, true,
|
|
18
|
-
|
|
22
|
+
preprocessingFunc, {[BYPASS_LARGE_DATA_WARNING]: true});
|
|
19
23
|
expect(sp != null, true);
|
|
20
24
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import {category, test, expect, awaitCheck, delay} from '@datagrok-libraries/utils/src/test';
|
|
2
1
|
import * as DG from 'datagrok-api/dg';
|
|
3
|
-
import {createTableView} from './utils';
|
|
4
2
|
import * as grok from 'datagrok-api/grok';
|
|
3
|
+
|
|
4
|
+
import {category, test, expect, awaitCheck, delay} from '@datagrok-libraries/utils/src/test';
|
|
5
5
|
import {SequenceSimilarityViewer} from '../analysis/sequence-similarity-viewer';
|
|
6
6
|
import {SequenceDiversityViewer} from '../analysis/sequence-diversity-viewer';
|
|
7
7
|
|
|
8
|
+
import {_package} from '../package-test';
|
|
9
|
+
|
|
8
10
|
category('similarity/diversity', async () => {
|
|
9
11
|
test('similaritySearchViewer', async () => {
|
|
10
12
|
await _testSimilaritySearchViewer();
|
|
@@ -16,7 +18,12 @@ category('similarity/diversity', async () => {
|
|
|
16
18
|
});
|
|
17
19
|
|
|
18
20
|
async function _testSimilaritySearchViewer() {
|
|
19
|
-
const
|
|
21
|
+
const csv = await _package.files.readAsText('tests/sample_MSA_data.csv');
|
|
22
|
+
const df = DG.DataFrame.fromCsv(csv);
|
|
23
|
+
await grok.data.detectSemanticTypes(df);
|
|
24
|
+
const moleculesView = grok.shell.addTableView(df);
|
|
25
|
+
const seqCol = moleculesView.dataFrame.getCol('MSA');
|
|
26
|
+
expect(seqCol.semType, DG.SEMTYPE.MACROMOLECULE);
|
|
20
27
|
|
|
21
28
|
const viewer: SequenceSimilarityViewer = (await moleculesView.dataFrame.plot
|
|
22
29
|
.fromType('Sequence Similarity Search')) as SequenceSimilarityViewer;
|
|
@@ -61,7 +68,12 @@ async function _testSimilaritySearchViewer() {
|
|
|
61
68
|
}
|
|
62
69
|
|
|
63
70
|
async function _testDiversitySearchViewer() {
|
|
64
|
-
const
|
|
71
|
+
const csv = await _package.files.readAsText('tests/sample_MSA_data.csv');
|
|
72
|
+
const df = DG.DataFrame.fromCsv(csv);
|
|
73
|
+
const moleculesView = grok.shell.addTableView(df);
|
|
74
|
+
await grok.data.detectSemanticTypes(df);
|
|
75
|
+
const seqCol = moleculesView.dataFrame.getCol('MSA');
|
|
76
|
+
expect(seqCol.semType, DG.SEMTYPE.MACROMOLECULE);
|
|
65
77
|
|
|
66
78
|
const viewer: SequenceDiversityViewer = (await moleculesView.dataFrame.plot
|
|
67
79
|
.fromType('Sequence Diversity Search')) as SequenceDiversityViewer;
|
|
@@ -21,9 +21,6 @@ import {
|
|
|
21
21
|
NOTATION
|
|
22
22
|
} from '@datagrok-libraries/bio/src/utils/macromolecule';
|
|
23
23
|
import {splitToMonomersUI} from '../utils/split-to-monomers';
|
|
24
|
-
import {SEMTYPE} from 'datagrok-api/dg';
|
|
25
|
-
import {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';
|
|
26
|
-
import {TAGS} from '../utils/constants';
|
|
27
24
|
|
|
28
25
|
|
|
29
26
|
category('splitters', async () => {
|
|
@@ -22,9 +22,9 @@ const appPath = 'System:AppData/Bio';
|
|
|
22
22
|
const fileSource = new DG.FileSource(appPath);
|
|
23
23
|
|
|
24
24
|
const testNames: { [k: string]: string } = {
|
|
25
|
-
PT: 'peptides
|
|
26
|
-
DNA: 'dna
|
|
27
|
-
MSA: 'msa
|
|
25
|
+
PT: 'peptides-fasta',
|
|
26
|
+
DNA: 'dna-fasta',
|
|
27
|
+
MSA: 'msa-separator',
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
const inputPath: { [k: string]: string } = {
|
|
@@ -27,7 +27,7 @@ import * as C from './constants';
|
|
|
27
27
|
import {_package, getBioLib} from '../package';
|
|
28
28
|
import {ISeqSplitted} from '@datagrok-libraries/bio/src/utils/macromolecule/types';
|
|
29
29
|
import {getSplitter} from '@datagrok-libraries/bio/src/utils/macromolecule/utils';
|
|
30
|
-
import {errInfo} from '
|
|
30
|
+
import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
type TempType = { [tagName: string]: any };
|
|
@@ -7,9 +7,9 @@ import {MolfileHandler} from '@datagrok-libraries/chem-meta/src/parsing-utils/mo
|
|
|
7
7
|
import {MolfileHandlerBase} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler-base';
|
|
8
8
|
import {RDMol, RDModule} from '@datagrok-libraries/chem-meta/src/rdkit-api';
|
|
9
9
|
import {HELM_POLYMER_TYPE, HELM_RGROUP_FIELDS} from '@datagrok-libraries/bio/src/utils/const';
|
|
10
|
+
import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
|
|
10
11
|
|
|
11
12
|
import {MonomerLibHelper} from './monomer-lib';
|
|
12
|
-
import {errInfo} from './err-info';
|
|
13
13
|
|
|
14
14
|
import {_package} from '../package';
|
|
15
15
|
|
package/src/utils/monomer-lib.ts
CHANGED
|
@@ -42,7 +42,7 @@ export async function manageFiles() {
|
|
|
42
42
|
export async function getLibraryPanelUI(): Promise<DG.Widget> {
|
|
43
43
|
//@ts-ignore
|
|
44
44
|
const filesButton: HTMLButtonElement = ui.button('Manage', manageFiles);
|
|
45
|
-
const inputsForm:
|
|
45
|
+
const inputsForm: HTMLElement = ui.inputs([]);
|
|
46
46
|
const libFileNameList: string[] = await getLibFileNameList();
|
|
47
47
|
|
|
48
48
|
const settings = await getUserLibSettings();
|
package/src/utils/pepsea.ts
CHANGED
|
@@ -1,9 +1,24 @@
|
|
|
1
1
|
/* Do not change these import lines to match external modules in webpack configuration */
|
|
2
2
|
import * as grok from 'datagrok-api/grok';
|
|
3
3
|
import * as DG from 'datagrok-api/dg';
|
|
4
|
+
|
|
5
|
+
import {Subject} from 'rxjs';
|
|
6
|
+
|
|
7
|
+
import {testEvent} from '@datagrok-libraries/utils/src/test';
|
|
4
8
|
import {NOTATION, TAGS as bioTAGS, ALIGNMENT, ALPHABET} from '@datagrok-libraries/bio/src/utils/macromolecule';
|
|
9
|
+
|
|
5
10
|
import * as C from './constants';
|
|
6
11
|
|
|
12
|
+
import {_package} from '../package';
|
|
13
|
+
|
|
14
|
+
export const Pepsea = new class {
|
|
15
|
+
public readonly dcName: string = 'bio';
|
|
16
|
+
|
|
17
|
+
public async getDockerContainer(): Promise<DG.DockerContainer> {
|
|
18
|
+
return await grok.dapi.docker.dockerContainers.filter(this.dcName).first();
|
|
19
|
+
}
|
|
20
|
+
}();
|
|
21
|
+
|
|
7
22
|
export const pepseaMethods = ['mafft --auto', 'mafft', 'linsi', 'ginsi', 'einsi', 'fftns', 'fftnsi', 'nwns', 'nwnsi'];
|
|
8
23
|
const alignmentObjectMetaKeys = ['AlignedSeq', 'AlignedSubpeptide', 'HELM', 'ID', 'PolymerID'];
|
|
9
24
|
type PepseaResponse = {
|
|
@@ -28,7 +43,7 @@ export async function runPepsea(srcCol: DG.Column<string>, unUsedName: string,
|
|
|
28
43
|
method: typeof pepseaMethods[number] = 'ginsi', gapOpen: number = 1.53, gapExtend: number = 0.0,
|
|
29
44
|
clustersCol: DG.Column<string | number> | null = null,
|
|
30
45
|
): Promise<DG.Column<string> | null> {
|
|
31
|
-
const pepseaContainer = await
|
|
46
|
+
const pepseaContainer = await Pepsea.getDockerContainer();
|
|
32
47
|
if (pepseaContainer.status !== 'started' && pepseaContainer.status !== 'checking') {
|
|
33
48
|
grok.log.warning('PepSeA container has not started yet');
|
|
34
49
|
return null;
|
|
@@ -2,17 +2,20 @@ import * as ui from 'datagrok-api/ui';
|
|
|
2
2
|
import * as grok from 'datagrok-api/grok';
|
|
3
3
|
import * as DG from 'datagrok-api/dg';
|
|
4
4
|
|
|
5
|
-
import {fromEvent, Unsubscribable} from 'rxjs';
|
|
5
|
+
import {fromEvent, Observable, Subject, Unsubscribable} from 'rxjs';
|
|
6
6
|
|
|
7
|
+
import {testEvent} from '@datagrok-libraries/utils/src/test';
|
|
7
8
|
import {
|
|
8
9
|
IVdRegionsViewer,
|
|
9
10
|
VdRegion, VdRegionType,
|
|
10
11
|
VdRegionsProps, VdRegionsPropsDefault,
|
|
11
12
|
} from '@datagrok-libraries/bio/src/viewers/vd-regions';
|
|
13
|
+
import {PromiseSyncer} from '@datagrok-libraries/bio/src/utils/syncer';
|
|
12
14
|
import {FilterSources, IWebLogoViewer, PositionHeight} from '@datagrok-libraries/bio/src/viewers/web-logo';
|
|
15
|
+
import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
|
|
16
|
+
|
|
13
17
|
|
|
14
18
|
import {WebLogoViewer, PROPS as wlPROPS} from '../viewers/web-logo-viewer';
|
|
15
|
-
import {errInfo} from '../utils/err-info';
|
|
16
19
|
|
|
17
20
|
import {_package} from '../package';
|
|
18
21
|
|
|
@@ -121,8 +124,15 @@ export class VdRegionsViewer extends DG.JsViewer implements IVdRegionsViewer {
|
|
|
121
124
|
// -- Behavior --
|
|
122
125
|
this.filterSource = this.string(PROPS.filterSource, defaults.filterSource,
|
|
123
126
|
{category: PROPS_CATS.BEHAVIOR, choices: Object.values(FilterSources)}) as FilterSources;
|
|
127
|
+
|
|
128
|
+
this.viewSyncer = new PromiseSyncer(_package.logger);
|
|
124
129
|
}
|
|
125
130
|
|
|
131
|
+
private static viewerCounter: number = -1;
|
|
132
|
+
private readonly viewerId: number = ++VdRegionsViewer.viewerCounter;
|
|
133
|
+
|
|
134
|
+
private viewerToLog(): string { return `VdRegionsViewer<${this.viewerId}>`; }
|
|
135
|
+
|
|
126
136
|
public async init() {
|
|
127
137
|
//#region regionsDF with filter
|
|
128
138
|
// this.regionsDf = DG.DataFrame.fromObjects(this.regions);
|
|
@@ -153,19 +163,16 @@ export class VdRegionsViewer extends DG.JsViewer implements IVdRegionsViewer {
|
|
|
153
163
|
}
|
|
154
164
|
|
|
155
165
|
override detach() {
|
|
166
|
+
const logPrefix = `${this.viewerToLog()}.detach()`;
|
|
156
167
|
const superDetach = super.detach.bind(this);
|
|
157
|
-
this.
|
|
168
|
+
this.viewSyncer.sync(`${logPrefix}`, async () => { // detach
|
|
158
169
|
if (this.setDataInProgress) return; // check setDataInProgress synced
|
|
159
170
|
if (this.viewed) {
|
|
160
171
|
await this.destroyView('detach');
|
|
161
172
|
this.viewed = false;
|
|
162
173
|
}
|
|
163
174
|
superDetach();
|
|
164
|
-
})
|
|
165
|
-
.catch((err: any) => {
|
|
166
|
-
const [errMsg, errStack] = errInfo(err);
|
|
167
|
-
_package.logger.error(errMsg, undefined, errStack);
|
|
168
|
-
});
|
|
175
|
+
});
|
|
169
176
|
}
|
|
170
177
|
|
|
171
178
|
override onTableAttached() {
|
|
@@ -228,13 +235,14 @@ export class VdRegionsViewer extends DG.JsViewer implements IVdRegionsViewer {
|
|
|
228
235
|
|
|
229
236
|
// TODO: .onTableAttached is not calling on dataFrame set, onPropertyChanged also not calling
|
|
230
237
|
public setData(regions: VdRegion[]) {
|
|
238
|
+
const logPrefix = `${this.viewerToLog()}.setData()`;
|
|
231
239
|
// const setDataInId = ++this.setDataInCount;
|
|
232
|
-
_package.logger.debug(
|
|
240
|
+
_package.logger.debug(`${logPrefix}, in, ` +
|
|
233
241
|
// `viewerId = ${this.viewerId}, setDataInId = ${setDataInId}, ` +
|
|
234
242
|
`regions.length = ${regions.length}`
|
|
235
243
|
);
|
|
236
244
|
|
|
237
|
-
this.
|
|
245
|
+
this.viewSyncer.sync(`${logPrefix}`, async () => { // setData
|
|
238
246
|
// _package.logger.debug('Bio: VdRegionsViewer.setData(), in sync, ' +
|
|
239
247
|
// `viewerId = ${this.viewerId}, setDataInId = ${setDataInId}, ` +
|
|
240
248
|
// `regions.length = ${regions.length}`);
|
|
@@ -261,10 +269,6 @@ export class VdRegionsViewer extends DG.JsViewer implements IVdRegionsViewer {
|
|
|
261
269
|
await this.buildView('setData');
|
|
262
270
|
this.viewed = true;
|
|
263
271
|
}
|
|
264
|
-
} catch (err: any) {
|
|
265
|
-
const [errMsg, errStack] = errInfo(err);
|
|
266
|
-
grok.shell.error(errMsg);
|
|
267
|
-
_package.logger.error(errMsg, undefined, errStack);
|
|
268
272
|
} finally {
|
|
269
273
|
// _package.logger.debug('Bio: VdRegionsViewer.setData(), finally, ' +
|
|
270
274
|
// `viewerId = ${this.viewerId}, setDataInId = ${setDataInId}, ` +
|
|
@@ -276,7 +280,7 @@ export class VdRegionsViewer extends DG.JsViewer implements IVdRegionsViewer {
|
|
|
276
280
|
|
|
277
281
|
// -- View --
|
|
278
282
|
|
|
279
|
-
private
|
|
283
|
+
private viewSyncer: PromiseSyncer;
|
|
280
284
|
private setDataInProgress: boolean = false;
|
|
281
285
|
|
|
282
286
|
private host: HTMLElement | null = null;
|
|
@@ -328,7 +332,7 @@ export class VdRegionsViewer extends DG.JsViewer implements IVdRegionsViewer {
|
|
|
328
332
|
positionWidth: this.positionWidth,
|
|
329
333
|
positionHeight: this.positionHeight,
|
|
330
334
|
filterSource: this.filterSource,
|
|
331
|
-
}) as WebLogoViewer;
|
|
335
|
+
}) as unknown as WebLogoViewer;
|
|
332
336
|
wl.onSizeChanged.subscribe(() => { this.calcSize(); });
|
|
333
337
|
return [orderI, chain, wl];
|
|
334
338
|
})());
|
|
@@ -479,9 +483,10 @@ export class VdRegionsViewer extends DG.JsViewer implements IVdRegionsViewer {
|
|
|
479
483
|
}
|
|
480
484
|
|
|
481
485
|
private filterSourceInputOnValueChanged(): void {
|
|
486
|
+
const logPrefix = `${this.viewerToLog()}.filterSourceInputOnValueChanged()`;
|
|
482
487
|
const filterSourceValue = this.filterSourceInput.value;
|
|
483
488
|
// Using promise to prevent 'Bad state: Cannot fire new event. Controller is already firing an event'
|
|
484
|
-
this.
|
|
489
|
+
this.viewSyncer.sync(`${logPrefix}`, async () => {
|
|
485
490
|
if (this.filterSource !== filterSourceValue) {
|
|
486
491
|
this.props.getProperty(PROPS.filterSource).set(this, filterSourceValue); // to update value in property panel
|
|
487
492
|
|
|
@@ -495,4 +500,25 @@ export class VdRegionsViewer extends DG.JsViewer implements IVdRegionsViewer {
|
|
|
495
500
|
}
|
|
496
501
|
});
|
|
497
502
|
}
|
|
503
|
+
|
|
504
|
+
// -- IRenderer --
|
|
505
|
+
|
|
506
|
+
private _onRendered: Subject<void> = new Subject<void>();
|
|
507
|
+
|
|
508
|
+
public get onRendered(): Observable<void> { return this._onRendered; }
|
|
509
|
+
|
|
510
|
+
public invalidate(): void {
|
|
511
|
+
const logPrefix = `${this.viewerToLog()}.invalidate()`;
|
|
512
|
+
// Put the event trigger in the tail of the synced calls queue.
|
|
513
|
+
this.viewSyncer.sync(`${logPrefix}`, async () => {
|
|
514
|
+
// update view / render
|
|
515
|
+
this._onRendered.next();
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
public async awaitRendered(timeout: number | undefined = 5000): Promise<void> {
|
|
520
|
+
await testEvent(this.onRendered, () => {}, () => {
|
|
521
|
+
this.invalidate();
|
|
522
|
+
}, timeout);
|
|
523
|
+
}
|
|
498
524
|
}
|
|
@@ -17,9 +17,11 @@ import {
|
|
|
17
17
|
import {errorToConsole} from '@datagrok-libraries/utils/src/to-console';
|
|
18
18
|
import {intToHtmlA} from '@datagrok-libraries/utils/src/color';
|
|
19
19
|
import {ISeqSplitted} from '@datagrok-libraries/bio/src/utils/macromolecule/types';
|
|
20
|
+
import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
|
|
21
|
+
import {testEvent} from '@datagrok-libraries/utils/src/test';
|
|
22
|
+
import {PromiseSyncer} from '@datagrok-libraries/bio/src/utils/syncer';
|
|
20
23
|
|
|
21
24
|
import {AggFunc, getAgg} from '../utils/agg';
|
|
22
|
-
import {errInfo} from '../utils/err-info';
|
|
23
25
|
import {buildCompositionTable} from '../widgets/composition-analysis-widget';
|
|
24
26
|
|
|
25
27
|
import {_package} from '../package';
|
|
@@ -295,11 +297,9 @@ const POSITION_LABELS_HEIGHT: number = 12;
|
|
|
295
297
|
|
|
296
298
|
export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
|
|
297
299
|
public static residuesSet = 'nucleotides';
|
|
298
|
-
private static viewerCount: number = 0;
|
|
299
300
|
|
|
300
301
|
private viewed: boolean = false;
|
|
301
302
|
|
|
302
|
-
private readonly viewerId: number = -1;
|
|
303
303
|
private unitsHandler: UnitsHandler | null;
|
|
304
304
|
private initialized: boolean = false;
|
|
305
305
|
|
|
@@ -381,9 +381,6 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
|
|
|
381
381
|
constructor() {
|
|
382
382
|
super();
|
|
383
383
|
|
|
384
|
-
this.viewerId = WebLogoViewer.viewerCount;
|
|
385
|
-
WebLogoViewer.viewerCount += 1;
|
|
386
|
-
|
|
387
384
|
this.textBaseline = 'top';
|
|
388
385
|
this.unitsHandler = null;
|
|
389
386
|
|
|
@@ -449,13 +446,20 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
|
|
|
449
446
|
this.canvas.style.width = '100%';
|
|
450
447
|
|
|
451
448
|
/* this.root.style.background = '#FFEEDD'; */
|
|
449
|
+
this.viewSyncer = new PromiseSyncer(_package.logger);
|
|
452
450
|
}
|
|
453
451
|
|
|
452
|
+
private static viewerCounter: number = -1;
|
|
453
|
+
private readonly viewerId: number = ++WebLogoViewer.viewerCounter;
|
|
454
|
+
|
|
455
|
+
private viewerToLog(): string { return `MolstarViewer<${this.viewerId}>`; }
|
|
456
|
+
|
|
454
457
|
// -- Data --
|
|
455
458
|
|
|
456
459
|
setData(): void {
|
|
457
|
-
|
|
458
|
-
|
|
460
|
+
const logPrefix = `${this.viewerToLog()}.setData()`;
|
|
461
|
+
_package.logger.debug(`${logPrefix}, in`);
|
|
462
|
+
this.viewSyncer.sync(`${logPrefix}`, async () => { // setData
|
|
459
463
|
if (!this.setDataInProgress) this.setDataInProgress = true; else return; // check setDataInProgress synced
|
|
460
464
|
try {
|
|
461
465
|
if (this.viewed) {
|
|
@@ -471,19 +475,16 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
|
|
|
471
475
|
await this.buildView(); //requests rendering
|
|
472
476
|
this.viewed = true;
|
|
473
477
|
}
|
|
474
|
-
} catch (err: any) {
|
|
475
|
-
const [errMsg, errStack] = errInfo(err);
|
|
476
|
-
grok.shell.error(errMsg);
|
|
477
|
-
_package.logger.error(errMsg, undefined, errStack);
|
|
478
478
|
} finally {
|
|
479
479
|
this.setDataInProgress = false;
|
|
480
480
|
}
|
|
481
481
|
});
|
|
482
|
+
_package.logger.debug(`${logPrefix}, out`);
|
|
482
483
|
}
|
|
483
484
|
|
|
484
485
|
// -- View --
|
|
485
486
|
|
|
486
|
-
private
|
|
487
|
+
private viewSyncer: PromiseSyncer;
|
|
487
488
|
private setDataInProgress: boolean = false;
|
|
488
489
|
private viewSubs: Unsubscribable[] = [];
|
|
489
490
|
|
|
@@ -892,21 +893,19 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
|
|
|
892
893
|
|
|
893
894
|
/** Remove all handlers when table is a detach */
|
|
894
895
|
public override async detach() {
|
|
895
|
-
|
|
896
|
+
const logPrefix = `${this.viewerToLog()}.detach()`;
|
|
897
|
+
_package.logger.debug(`${logPrefix}, in`);
|
|
896
898
|
|
|
897
899
|
const superDetach = super.detach.bind(this);
|
|
898
|
-
this.
|
|
900
|
+
this.viewSyncer.sync(`${logPrefix}`, async () => { // detach
|
|
899
901
|
if (this.setDataInProgress) return; // check setDataInProgress synced
|
|
900
902
|
if (this.viewed) {
|
|
901
903
|
await this.destroyView();
|
|
902
904
|
this.viewed = false;
|
|
903
905
|
}
|
|
904
906
|
superDetach();
|
|
905
|
-
})
|
|
906
|
-
|
|
907
|
-
const [errMsg, errStack] = errInfo(err);
|
|
908
|
-
_package.logger.error(errMsg, undefined, errStack);
|
|
909
|
-
});
|
|
907
|
+
});
|
|
908
|
+
_package.logger.debug(`${logPrefix}, out`);
|
|
910
909
|
}
|
|
911
910
|
|
|
912
911
|
private _onSizeChanged: Subject<void> = new Subject<void>();
|
|
@@ -1275,6 +1274,27 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
|
|
|
1275
1274
|
//throw err; // Do not throw to prevent disabling event handler
|
|
1276
1275
|
}
|
|
1277
1276
|
}
|
|
1277
|
+
|
|
1278
|
+
// -- IRenderer --
|
|
1279
|
+
|
|
1280
|
+
private _onRendered: Subject<void> = new Subject<void>();
|
|
1281
|
+
|
|
1282
|
+
public get onRendered(): Observable<void> { return this._onRendered; }
|
|
1283
|
+
|
|
1284
|
+
public invalidate(): void {
|
|
1285
|
+
const logPrefix = `${this.viewerToLog()}.invalidate()`;
|
|
1286
|
+
// Put the event trigger in the tail of the synced calls queue.
|
|
1287
|
+
this.viewSyncer.sync(`${logPrefix}`, async () => {
|
|
1288
|
+
this.invalidate();
|
|
1289
|
+
this._onRendered.next();
|
|
1290
|
+
});
|
|
1291
|
+
}
|
|
1292
|
+
|
|
1293
|
+
public async awaitRendered(timeout: number | undefined = 5000): Promise<void> {
|
|
1294
|
+
await testEvent(this.onRendered, () => {}, () => {
|
|
1295
|
+
this.invalidate();
|
|
1296
|
+
}, timeout);
|
|
1297
|
+
}
|
|
1278
1298
|
}
|
|
1279
1299
|
|
|
1280
1300
|
function renderPositionLabels(g: CanvasRenderingContext2D,
|
package/dist/1.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkbio=self.webpackChunkbio||[]).push([[1],{6814:(t,e,n)=>{n.d(e,{k:()=>r});const r=t=>null==t},779:(t,e,n)=>{function r(t={}){const e=function(){if(!t||!t.scoringMatrix||!t.alphabetIndexes)return(t,e)=>t===e?0:1;if(t.scoringMatrix.length!==Object.keys(t.alphabetIndexes).length)throw new Error("Scoring matrix and alphabet indexes should have the same length");const e=t.alphabetIndexes,n=t.scoringMatrix,r=Math.min(...Object.keys(e).map((t=>t.charCodeAt(0))))+1,l=new Float32Array((n.length+r)*(n.length+r));return Object.entries(e).forEach((([t,r])=>{const a=n[r];Object.entries(e).forEach((([e,r])=>{l[t.charCodeAt(0)*n.length+e.charCodeAt(0)]=a[r]}))})),(t,e)=>l[t.charCodeAt(0)*n.length+e.charCodeAt(0)]}(),n=t?.threshold??0;return(t,r)=>{let l=0;const a=t.length,h=r.length,o=Math.max(a,h)*(1-n);a!==h&&(l=Math.abs(a-h));let c=0;for(let n=0;n<Math.min(a,h);n++)if(t[n]!==r[n]&&(c+=e(t[n],r[n]),c>o))return 1;return c+=l,c/=Math.max(a,h),c}}n.d(e,{j:()=>r})},458:(t,e,n)=>{n.d(e,{r:()=>l});var r=n(1811);function l(){return(t,e)=>(0,r.T)(t,e)/Math.max(t.length,e.length)}},6683:(t,e,n)=>{n.d(e,{n:()=>l});const r={gapOpen:8,gapExtend:2,scoringMatrix:[[4,-1,-2,-2,0,-1,-1,0,-2,-1,-1,-1,-1,-2,-1,1,0,-3,-2,0,-2,-1,0,-4],[-1,5,0,-2,-3,1,0,-2,0,-3,-2,2,-1,-3,-2,-1,-1,-3,-2,-3,-1,0,-1,-4],[-2,0,6,1,-3,0,0,0,1,-3,-3,0,-2,-3,-2,1,0,-4,-2,-3,3,0,-1,-4],[-2,-2,1,6,-3,0,2,-1,-1,-3,-4,-1,-3,-3,-1,0,-1,-4,-3,-3,4,1,-1,-4],[0,-3,-3,-3,9,-3,-4,-3,-3,-1,-1,-3,-1,-2,-3,-1,-1,-2,-2,-1,-3,-3,-2,-4],[-1,1,0,0,-3,5,2,-2,0,-3,-2,1,0,-3,-1,0,-1,-2,-1,-2,0,3,-1,-4],[-1,0,0,2,-4,2,5,-2,0,-3,-3,1,-2,-3,-1,0,-1,-3,-2,-2,1,4,-1,-4],[0,-2,0,-1,-3,-2,-2,6,-2,-4,-4,-2,-3,-3,-2,0,-2,-2,-3,-3,-1,-2,-1,-4],[-2,0,1,-1,-3,0,0,-2,8,-3,-3,-1,-2,-1,-2,-1,-2,-2,2,-3,0,0,-1,-4],[-1,-3,-3,-3,-1,-3,-3,-4,-3,4,2,-3,1,0,-3,-2,-1,-3,-1,3,-3,-3,-1,-4],[-1,-2,-3,-4,-1,-2,-3,-4,-3,2,4,-2,2,0,-3,-2,-1,-2,-1,1,-4,-3,-1,-4],[-1,2,0,-1,-3,1,1,-2,-1,-3,-2,5,-1,-3,-1,0,-1,-3,-2,-2,0,1,-1,-4],[-1,-1,-2,-3,-1,0,-2,-3,-2,1,2,-1,5,0,-2,-1,-1,-1,-1,1,-3,-1,-1,-4],[-2,-3,-3,-3,-2,-3,-3,-3,-1,0,0,-3,0,6,-4,-2,-2,1,3,-1,-3,-3,-1,-4],[-1,-2,-2,-1,-3,-1,-1,-2,-2,-3,-3,-1,-2,-4,7,-1,-1,-4,-3,-2,-2,-1,-2,-4],[1,-1,1,0,-1,0,0,0,-1,-2,-2,0,-1,-2,-1,4,1,-3,-2,-2,0,0,0,-4],[0,-1,0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-2,-1,1,5,-2,-2,0,-1,-1,0,-4],[-3,-3,-4,-4,-2,-2,-3,-2,-2,-3,-2,-3,-1,1,-4,-3,-2,11,2,-3,-4,-3,-2,-4],[-2,-2,-2,-3,-2,-1,-2,-3,2,-1,-1,-2,-1,3,-3,-2,-2,2,7,-1,-3,-2,-1,-4],[0,-3,-3,-3,-1,-2,-2,-3,-3,3,1,-2,1,-1,-2,-2,0,-3,-1,4,-3,-2,-1,-4],[-2,-1,3,4,-3,0,1,-1,0,-3,-4,0,-3,-3,-2,0,-1,-4,-3,-3,4,1,-1,-4],[-1,0,0,1,-3,3,4,-2,0,-3,-3,1,-1,-3,-1,0,-1,-3,-2,-2,1,4,-1,-4],[0,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,0,0,-2,-1,-1,-1,-1,-1,-4],[-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,1]],alphabetIndexes:{A:0,R:1,N:2,D:3,C:4,Q:5,E:6,G:7,H:8,I:9,L:10,K:11,M:12,F:13,P:14,S:15,T:16,W:17,Y:18,V:19,B:20,Z:21,X:22,"*":23}};function l(t){return(e,n)=>{const{gapOpen:l,gapExtend:a,scoringMatrix:h,alphabetIndexes:o}={...r,...t},c=[new Array(e.length+1).fill(0),new Array(e.length+1).fill(0)],s=new Array(e.length+1).fill(!1),i=new Array(e.length+1).fill(!1);let g=0,d=1;for(let t=1;t<e.length+1;t++)c[0][t]=-l-(t-1)*a;for(let t=1;t<n.length+1;t++){c[d][0]=-l-(t-1)*a;for(let r=1;r<e.length+1;r++){const f=c[g][r-1]+h[o[e[r-1]]][o[n[t-1]]],u=c[g][r]-(s[r]?a:l),A=c[d][r-1]-(i[r-1]?a:l);c[d][r]=Math.max(f,A,u),c[d][r]===f?(s[r]=!1,i[r]=!1):c[d][r]===A?(s[r]=!1,i[r]=!0):(s[r]=!0,i[r]=!1)}g=d,d=(d+1)%2}const f=e.split("").map((t=>h[o[t]][o[t]])).reduce(((t,e)=>t+e),0),u=n.split("").map((t=>h[o[t]][o[t]])).reduce(((t,e)=>t+e),0),A=Math.max(f,u);return(A-c[g][e.length])/A}}},1811:(t,e,n)=>{n.d(e,{T:()=>l});const r=new Uint32Array(65536),l=(t,e)=>{if(t.length<e.length){const n=e;e=t,t=n}return 0===e.length?t.length:t.length<=32?((t,e)=>{const n=t.length,l=e.length,a=1<<n-1;let h=-1,o=0,c=n,s=n;for(;s--;)r[t.charCodeAt(s)]|=1<<s;for(s=0;s<l;s++){let t=r[e.charCodeAt(s)];const n=t|o;t|=(t&h)+h^h,o|=~(t|h),h&=t,o&a&&c++,h&a&&c--,o=o<<1|1,h=h<<1|~(n|o),o&=n}for(s=n;s--;)r[t.charCodeAt(s)]=0;return c})(t,e):((t,e)=>{const n=e.length,l=t.length,a=[],h=[],o=Math.ceil(n/32),c=Math.ceil(l/32);for(let t=0;t<o;t++)h[t]=-1,a[t]=0;let s=0;for(;s<c-1;s++){let o=0,c=-1;const i=32*s,g=Math.min(32,l)+i;for(let e=i;e<g;e++)r[t.charCodeAt(e)]|=1<<e;for(let t=0;t<n;t++){const n=r[e.charCodeAt(t)],l=h[t/32|0]>>>t&1,s=a[t/32|0]>>>t&1,i=n|o,g=((n|s)&c)+c^c|n|s;let d=o|~(g|c),f=c&g;d>>>31^l&&(h[t/32|0]^=1<<t),f>>>31^s&&(a[t/32|0]^=1<<t),d=d<<1|l,f=f<<1|s,c=f|~(i|d),o=d&i}for(let e=i;e<g;e++)r[t.charCodeAt(e)]=0}let i=0,g=-1;const d=32*s,f=Math.min(32,l-d)+d;for(let e=d;e<f;e++)r[t.charCodeAt(e)]|=1<<e;let u=l;for(let t=0;t<n;t++){const n=r[e.charCodeAt(t)],o=h[t/32|0]>>>t&1,c=a[t/32|0]>>>t&1,s=n|i,d=((n|c)&g)+g^g|n|c;let f=i|~(d|g),A=g&d;u+=f>>>l-1&1,u-=A>>>l-1&1,f>>>31^o&&(h[t/32|0]^=1<<t),A>>>31^c&&(a[t/32|0]^=1<<t),f=f<<1|o,A=A<<1|c,g=A|~(s|f),i=f&s}for(let e=d;e<f;e++)r[t.charCodeAt(e)]=0;return u})(t,e)}}}]);
|
|
2
|
-
//# sourceMappingURL=1.js.map
|
package/dist/1.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"1.js","mappings":"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","sources":["webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/utils.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/hamming.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/levenstein.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/needleman-wunsch.js","webpack://bio/./node_modules/fastest-levenshtein/esm/mod.js"],"sourcesContent":["export const isNil = (x) => x === null || x === undefined;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBpc05pbCA9ICh4OiBhbnkpID0+IHggPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkO1xuIl19","export function hamming(args = {}) {\n function getDistanceF() {\n if (!args || !args.scoringMatrix || !args.alphabetIndexes)\n return (a, b) => a === b ? 0 : 1;\n if (args.scoringMatrix.length !== Object.keys(args.alphabetIndexes).length)\n throw new Error('Scoring matrix and alphabet indexes should have the same length');\n const indexes = args.alphabetIndexes;\n const matrix = args.scoringMatrix;\n //const matrixMap = new Map<string, Map<string, number>>();\n //const map2: any = {};\n const minCharCode = Math.min(...Object.keys(indexes).map(k => k.charCodeAt(0))) + 1;\n const scorringArray = new Float32Array((matrix.length + minCharCode) * (matrix.length + minCharCode));\n Object.entries(indexes).forEach(([key, index]) => {\n //matrixMap.set(key, new Map<string, number>());\n //map2[key] = {};\n const matrixRow = matrix[index];\n Object.entries(indexes).forEach(([key2, index2]) => {\n //matrixMap.get(key)!.set(key2, matrixRow[index2]);\n scorringArray[key.charCodeAt(0) * matrix.length + key2.charCodeAt(0)] = matrixRow[index2];\n //map2[key][key2] = matrixRow[index2];\n });\n });\n return (a, b) => {\n return scorringArray[a.charCodeAt(0) * matrix.length + b.charCodeAt(0)];\n };\n }\n const distanceF = getDistanceF();\n const threshold = args?.threshold ?? 0;\n return (seq1, seq2) => {\n // hamming distance should only be used with same size strings,\n // but still, lets add a check and if they are not same length add the difference to the result\n let diff = 0;\n const s1l = seq1.length;\n const s2l = seq2.length;\n const thresholdLimit = Math.max(s1l, s2l) * (1 - threshold);\n if (s1l !== s2l)\n diff = Math.abs(s1l - s2l);\n let result = 0;\n for (let i = 0; i < Math.min(s1l, s2l); i++) {\n if (seq1[i] !== seq2[i]) {\n result += distanceF(seq1[i], seq2[i]);\n if (result > thresholdLimit)\n return 1;\n }\n }\n result += diff;\n result /= Math.max(s1l, s2l);\n return result;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtbWluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhhbW1pbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLE9BQU8sQ0FBQyxPQUF3QyxFQUFFO0lBRWhFLFNBQVMsWUFBWTtRQUNuQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQ3ZELE9BQU8sQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU07WUFDeEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNsQywyREFBMkQ7UUFDM0QsdUJBQXVCO1FBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVwRixNQUFNLGFBQWEsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDdEcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQy9DLGdEQUFnRDtZQUNoRCxpQkFBaUI7WUFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRTtnQkFDakQsbURBQW1EO2dCQUNuRCxhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzFGLHNDQUFzQztZQUN4QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRTtZQUM5QixPQUFPLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQTtJQUNILENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxZQUFZLEVBQUUsQ0FBQztJQUVqQyxNQUFNLFNBQVMsR0FBRyxJQUFJLEVBQUUsU0FBUyxJQUFJLENBQUMsQ0FBQztJQUV2QyxPQUFPLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxFQUFFO1FBQ3BDLCtEQUErRDtRQUMvRCwrRkFBK0Y7UUFDL0YsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN4QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3hCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQzVELElBQUksR0FBRyxLQUFLLEdBQUc7WUFDYixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFFN0IsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksTUFBTSxHQUFHLGNBQWM7b0JBQ3pCLE9BQU8sQ0FBQyxDQUFDO2FBQ1o7U0FDRjtRQUNELE1BQU0sSUFBSSxJQUFJLENBQUM7UUFDZixNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDN0IsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7bW1EaXN0YW5jZUZ1bmN0aW9uQXJncywgbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW1taW5nKGFyZ3M6IFBhcnRpYWw8bW1EaXN0YW5jZUZ1bmN0aW9uQXJncz4gPSB7fSk6IG1tRGlzdGFuY2VGdW5jdGlvblR5cGUge1xuXG4gIGZ1bmN0aW9uIGdldERpc3RhbmNlRigpOiAoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IG51bWJlciB7XG4gICAgaWYgKCFhcmdzIHx8ICFhcmdzLnNjb3JpbmdNYXRyaXggfHwgIWFyZ3MuYWxwaGFiZXRJbmRleGVzKVxuICAgICAgcmV0dXJuIChhOiBzdHJpbmcsIGI6IHN0cmluZykgPT4gYSA9PT0gYiA/IDAgOiAxO1xuICAgIGlmIChhcmdzLnNjb3JpbmdNYXRyaXgubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhhcmdzLmFscGhhYmV0SW5kZXhlcykubGVuZ3RoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTY29yaW5nIG1hdHJpeCBhbmQgYWxwaGFiZXQgaW5kZXhlcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcbiAgICBjb25zdCBpbmRleGVzID0gYXJncy5hbHBoYWJldEluZGV4ZXM7XG4gICAgY29uc3QgbWF0cml4ID0gYXJncy5zY29yaW5nTWF0cml4O1xuICAgIC8vY29uc3QgbWF0cml4TWFwID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlcj4+KCk7XG4gICAgLy9jb25zdCBtYXAyOiBhbnkgPSB7fTtcbiAgICBjb25zdCBtaW5DaGFyQ29kZSA9IE1hdGgubWluKC4uLk9iamVjdC5rZXlzKGluZGV4ZXMpLm1hcChrID0+IGsuY2hhckNvZGVBdCgwKSkpICsgMTtcblxuICAgIGNvbnN0IHNjb3JyaW5nQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KChtYXRyaXgubGVuZ3RoICsgbWluQ2hhckNvZGUpICogKG1hdHJpeC5sZW5ndGggKyBtaW5DaGFyQ29kZSkpO1xuICAgIE9iamVjdC5lbnRyaWVzKGluZGV4ZXMpLmZvckVhY2goKFtrZXksIGluZGV4XSkgPT4ge1xuICAgICAgLy9tYXRyaXhNYXAuc2V0KGtleSwgbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKSk7XG4gICAgICAvL21hcDJba2V5XSA9IHt9O1xuICAgICAgY29uc3QgbWF0cml4Um93ID0gbWF0cml4W2luZGV4XTtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGluZGV4ZXMpLmZvckVhY2goKFtrZXkyLCBpbmRleDJdKSA9PiB7XG4gICAgICAgIC8vbWF0cml4TWFwLmdldChrZXkpIS5zZXQoa2V5MiwgbWF0cml4Um93W2luZGV4Ml0pO1xuICAgICAgICBzY29ycmluZ0FycmF5W2tleS5jaGFyQ29kZUF0KDApICogbWF0cml4Lmxlbmd0aCArIGtleTIuY2hhckNvZGVBdCgwKV0gPSBtYXRyaXhSb3dbaW5kZXgyXTtcbiAgICAgICAgLy9tYXAyW2tleV1ba2V5Ml0gPSBtYXRyaXhSb3dbaW5kZXgyXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiAoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBzY29ycmluZ0FycmF5W2EuY2hhckNvZGVBdCgwKSAqIG1hdHJpeC5sZW5ndGggKyBiLmNoYXJDb2RlQXQoMCldO1xuICAgIH1cbiAgfVxuICBjb25zdCBkaXN0YW5jZUYgPSBnZXREaXN0YW5jZUYoKTtcblxuICBjb25zdCB0aHJlc2hvbGQgPSBhcmdzPy50aHJlc2hvbGQgPz8gMDtcblxuICByZXR1cm4gKHNlcTE6IHN0cmluZywgc2VxMjogc3RyaW5nKSA9PiB7XG4gICAgLy8gaGFtbWluZyBkaXN0YW5jZSBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggc2FtZSBzaXplIHN0cmluZ3MsXG4gICAgLy8gYnV0IHN0aWxsLCBsZXRzIGFkZCBhIGNoZWNrIGFuZCBpZiB0aGV5IGFyZSBub3Qgc2FtZSBsZW5ndGggYWRkIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSByZXN1bHRcbiAgICBsZXQgZGlmZiA9IDA7XG4gICAgY29uc3QgczFsID0gc2VxMS5sZW5ndGg7XG4gICAgY29uc3QgczJsID0gc2VxMi5sZW5ndGg7XG4gICAgY29uc3QgdGhyZXNob2xkTGltaXQgPSBNYXRoLm1heChzMWwsIHMybCkgKiAoMSAtIHRocmVzaG9sZCk7XG4gICAgaWYgKHMxbCAhPT0gczJsKVxuICAgICAgZGlmZiA9IE1hdGguYWJzKHMxbCAtIHMybCk7XG5cbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKHMxbCwgczJsKTsgaSsrKSB7XG4gICAgICBpZiAoc2VxMVtpXSAhPT0gc2VxMltpXSkge1xuICAgICAgICByZXN1bHQgKz0gZGlzdGFuY2VGKHNlcTFbaV0sIHNlcTJbaV0pO1xuICAgICAgICBpZiAocmVzdWx0ID4gdGhyZXNob2xkTGltaXQpXG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdCArPSBkaWZmO1xuICAgIHJlc3VsdCAvPSBNYXRoLm1heChzMWwsIHMybCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cbiJdfQ==","import { distance } from 'fastest-levenshtein';\nexport function levenstein() {\n return (seq1, seq2) => {\n return distance(seq1, seq2) / Math.max(seq1.length, seq2.length);\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV2ZW5zdGVpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxldmVuc3RlaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRzdDLE1BQU0sVUFBVSxVQUFVO0lBQ3hCLE9BQU8sQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQUU7UUFDcEMsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZGlzdGFuY2V9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGxldmVuc3RlaW4oKTogbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZSB7XG4gIHJldHVybiAoc2VxMTogc3RyaW5nLCBzZXEyOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gZGlzdGFuY2Uoc2VxMSwgc2VxMikgLyBNYXRoLm1heChzZXExLmxlbmd0aCwgc2VxMi5sZW5ndGgpO1xuICB9O1xufVxuIl19","// Blosum 62 matrix for protein sequences\nconst BLOSUM62 = [[4, -1, -2, -2, 0, -1, -1, 0, -2, -1, -1, -1, -1, -2, -1, 1, 0, -3, -2, 0, -2, -1, 0, -4],\n [-1, 5, 0, -2, -3, 1, 0, -2, 0, -3, -2, 2, -1, -3, -2, -1, -1, -3, -2, -3, -1, 0, -1, -4],\n [-2, 0, 6, 1, -3, 0, 0, 0, 1, -3, -3, 0, -2, -3, -2, 1, 0, -4, -2, -3, 3, 0, -1, -4],\n [-2, -2, 1, 6, -3, 0, 2, -1, -1, -3, -4, -1, -3, -3, -1, 0, -1, -4, -3, -3, 4, 1, -1, -4],\n [0, -3, -3, -3, 9, -3, -4, -3, -3, -1, -1, -3, -1, -2, -3, -1, -1, -2, -2, -1, -3, -3, -2, -4],\n [-1, 1, 0, 0, -3, 5, 2, -2, 0, -3, -2, 1, 0, -3, -1, 0, -1, -2, -1, -2, 0, 3, -1, -4],\n [-1, 0, 0, 2, -4, 2, 5, -2, 0, -3, -3, 1, -2, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4],\n [0, -2, 0, -1, -3, -2, -2, 6, -2, -4, -4, -2, -3, -3, -2, 0, -2, -2, -3, -3, -1, -2, -1, -4],\n [-2, 0, 1, -1, -3, 0, 0, -2, 8, -3, -3, -1, -2, -1, -2, -1, -2, -2, 2, -3, 0, 0, -1, -4],\n [-1, -3, -3, -3, -1, -3, -3, -4, -3, 4, 2, -3, 1, 0, -3, -2, -1, -3, -1, 3, -3, -3, -1, -4],\n [-1, -2, -3, -4, -1, -2, -3, -4, -3, 2, 4, -2, 2, 0, -3, -2, -1, -2, -1, 1, -4, -3, -1, -4],\n [-1, 2, 0, -1, -3, 1, 1, -2, -1, -3, -2, 5, -1, -3, -1, 0, -1, -3, -2, -2, 0, 1, -1, -4],\n [-1, -1, -2, -3, -1, 0, -2, -3, -2, 1, 2, -1, 5, 0, -2, -1, -1, -1, -1, 1, -3, -1, -1, -4],\n [-2, -3, -3, -3, -2, -3, -3, -3, -1, 0, 0, -3, 0, 6, -4, -2, -2, 1, 3, -1, -3, -3, -1, -4],\n [-1, -2, -2, -1, -3, -1, -1, -2, -2, -3, -3, -1, -2, -4, 7, -1, -1, -4, -3, -2, -2, -1, -2, -4],\n [1, -1, 1, 0, -1, 0, 0, 0, -1, -2, -2, 0, -1, -2, -1, 4, 1, -3, -2, -2, 0, 0, 0, -4],\n [0, -1, 0, -1, -1, -1, -1, -2, -2, -1, -1, -1, -1, -2, -1, 1, 5, -2, -2, 0, -1, -1, 0, -4],\n [-3, -3, -4, -4, -2, -2, -3, -2, -2, -3, -2, -3, -1, 1, -4, -3, -2, 11, 2, -3, -4, -3, -2, -4],\n [-2, -2, -2, -3, -2, -1, -2, -3, 2, -1, -1, -2, -1, 3, -3, -2, -2, 2, 7, -1, -3, -2, -1, -4],\n [0, -3, -3, -3, -1, -2, -2, -3, -3, 3, 1, -2, 1, -1, -2, -2, 0, -3, -1, 4, -3, -2, -1, -4],\n [-2, -1, 3, 4, -3, 0, 1, -1, 0, -3, -4, 0, -3, -3, -2, 0, -1, -4, -3, -3, 4, 1, -1, -4],\n [-1, 0, 0, 1, -3, 3, 4, -2, 0, -3, -3, 1, -1, -3, -1, 0, -1, -3, -2, -2, 1, 4, -1, -4],\n [0, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, 0, 0, -2, -1, -1, -1, -1, -1, -4],\n [-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 1]];\n// Protein indexes for BLOSUM matrix\nconst ProtIndexes = {\n 'A': 0, 'R': 1, 'N': 2, 'D': 3, 'C': 4, 'Q': 5, 'E': 6, 'G': 7, 'H': 8,\n 'I': 9, 'L': 10, 'K': 11, 'M': 12, 'F': 13, 'P': 14, 'S': 15, 'T': 16,\n 'W': 17, 'Y': 18, 'V': 19, 'B': 20, 'Z': 21, 'X': 22, '*': 23\n};\nconst defaultArgs = {\n gapOpen: 8,\n gapExtend: 2,\n scoringMatrix: BLOSUM62,\n alphabetIndexes: ProtIndexes\n};\n/** Returns a function that calculates the distance between two sequences based on gap penalty and matrix\n * @param {Partial<NeedlemanWunchArgs>}args - arguments for Needleman-Wunch algorithm like gap penalty, Scoring matrix..\n * @return {mmDistanceFunctionType} - function that calculates the distance between two sequences\n*/\nexport function needlemanWunch(args) {\n return (seq1, seq2) => {\n const { gapOpen, gapExtend, scoringMatrix, alphabetIndexes } = { ...defaultArgs, ...args };\n // As we don't need traceback, no need to store the whole matrix\n // Intead, we will store only the last two rows\n const matrix = [\n new Array(seq1.length + 1).fill(0),\n new Array(seq1.length + 1).fill(0)\n ];\n // similarly, we need to keep track of what operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n const verticalGaps = new Array(seq1.length + 1).fill(false);\n const horizontalGaps = new Array(seq1.length + 1).fill(false);\n //variables to keep track which row we are in\n // they will swap places on each iteration\n let prevRow = 0;\n let currRow = 1;\n // Initialize first row\n for (let i = 1; i < seq1.length + 1; i++)\n matrix[0][i] = -gapOpen - (i - 1) * gapExtend;\n // Calculate the rest of the matrix\n for (let i = 1; i < seq2.length + 1; i++) {\n matrix[currRow][0] = -gapOpen - (i - 1) * gapExtend;\n for (let j = 1; j < seq1.length + 1; j++) {\n const diagonal = matrix[prevRow][j - 1] + scoringMatrix[alphabetIndexes[seq1[j - 1]]][alphabetIndexes[seq2[i - 1]]];\n const top = matrix[prevRow][j] - (verticalGaps[j] ? gapExtend : gapOpen);\n const left = matrix[currRow][j - 1] - (horizontalGaps[j - 1] ? gapExtend : gapOpen);\n matrix[currRow][j] = Math.max(diagonal, left, top);\n // update gap arrays\n if (matrix[currRow][j] === diagonal) {\n verticalGaps[j] = false;\n horizontalGaps[j] = false;\n }\n else if (matrix[currRow][j] === left) {\n verticalGaps[j] = false;\n horizontalGaps[j] = true;\n }\n else {\n verticalGaps[j] = true;\n horizontalGaps[j] = false;\n }\n }\n // Swap rows\n prevRow = currRow;\n currRow = (currRow + 1) % 2;\n }\n // as the matrix is the similarity matrix, but we are interested in distance,\n // we need compare it to perfect match score to get reasonable distance\n const perfectMatchSeq1 = seq1.split('').map((c) => scoringMatrix[alphabetIndexes[c]][alphabetIndexes[c]])\n .reduce((a, b) => a + b, 0);\n const perfectMatchSeq2 = seq2.split('').map((c) => scoringMatrix[alphabetIndexes[c]][alphabetIndexes[c]])\n .reduce((a, b) => a + b, 0);\n const maxScore = Math.max(perfectMatchSeq1, perfectMatchSeq2);\n return (maxScore - matrix[prevRow][seq1.length]) / maxScore;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVlZGxlbWFuLXd1bnNjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5lZWRsZW1hbi13dW5zY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEseUNBQXlDO0FBQ3pDLE1BQU0sUUFBUSxHQUNkLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRW5HLG9DQUFvQztBQUNwQyxNQUFNLFdBQVcsR0FBeUI7SUFDeEMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3RFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUU7SUFDckUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUU7Q0FDOUQsQ0FBQztBQU9GLE1BQU0sV0FBVyxHQUF1QjtJQUN0QyxPQUFPLEVBQUUsQ0FBQztJQUNWLFNBQVMsRUFBRSxDQUFDO0lBQ1osYUFBYSxFQUFFLFFBQVE7SUFDdkIsZUFBZSxFQUFFLFdBQVc7Q0FDN0IsQ0FBQztBQUVGOzs7RUFHRTtBQUNGLE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBaUM7SUFDOUQsT0FBTyxDQUFDLElBQVksRUFBRSxJQUFZLEVBQVcsRUFBRTtRQUM3QyxNQUFNLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFDLEdBQUcsRUFBQyxHQUFHLFdBQVcsRUFBRSxHQUFHLElBQUksRUFBQyxDQUFDO1FBQ3ZGLGdFQUFnRTtRQUNoRSwrQ0FBK0M7UUFDL0MsTUFBTSxNQUFNLEdBQWU7WUFDekIsSUFBSSxLQUFLLENBQVMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzFDLElBQUksS0FBSyxDQUFTLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUMzQyxDQUFDO1FBQ0YsNkVBQTZFO1FBQzdFLDRGQUE0RjtRQUM1RixNQUFNLFlBQVksR0FBYyxJQUFJLEtBQUssQ0FBVSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRixNQUFNLGNBQWMsR0FBYyxJQUFJLEtBQUssQ0FBVSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsRiw2Q0FBNkM7UUFDN0MsMENBQTBDO1FBQzFDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsdUJBQXVCO1FBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDdEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUVoRCxtQ0FBbUM7UUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7WUFDcEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN4QyxNQUFNLFFBQVEsR0FDWixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFFLENBQUM7Z0JBQzFFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDM0IsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLENBQ3BCLENBQUM7Z0JBQ0Ysb0JBQW9CO2dCQUNwQixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUU7b0JBQ25DLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7b0JBQ3hCLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7aUJBQzNCO3FCQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtvQkFDdEMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDeEIsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztpQkFDMUI7cUJBQU07b0JBQ0wsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztvQkFDdkIsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztpQkFDM0I7YUFDRjtZQUNELFlBQVk7WUFDWixPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ2xCLE9BQU8sR0FBRyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDN0I7UUFDRCw2RUFBNkU7UUFDN0UsdUVBQXVFO1FBQ3ZFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0RyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0RyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUM7SUFDOUQsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7bW1EaXN0YW5jZUZ1bmN0aW9uQXJncywgbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIEJsb3N1bSA2MiBtYXRyaXggZm9yIHByb3RlaW4gc2VxdWVuY2VzXG5jb25zdCBCTE9TVU02MjpBcnJheTxBcnJheTxudW1iZXI+PiA9XG5bWzQsIC0xLCAtMiwgLTIsIDAsIC0xLCAtMSwgMCwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTEsIDEsIDAsIC0zLCAtMiwgMCwgLTIsIC0xLCAwLCAtNF0sXG4gIFstMSwgNSwgMCwgLTIsIC0zLCAxLCAwLCAtMiwgMCwgLTMsIC0yLCAyLCAtMSwgLTMsIC0yLCAtMSwgLTEsIC0zLCAtMiwgLTMsIC0xLCAwLCAtMSwgLTRdLFxuICBbLTIsIDAsIDYsIDEsIC0zLCAwLCAwLCAwLCAxLCAtMywgLTMsIDAsIC0yLCAtMywgLTIsIDEsIDAsIC00LCAtMiwgLTMsIDMsIDAsIC0xLCAtNF0sXG4gIFstMiwgLTIsIDEsIDYsIC0zLCAwLCAyLCAtMSwgLTEsIC0zLCAtNCwgLTEsIC0zLCAtMywgLTEsIDAsIC0xLCAtNCwgLTMsIC0zLCA0LCAxLCAtMSwgLTRdLFxuICBbMCwgLTMsIC0zLCAtMywgOSwgLTMsIC00LCAtMywgLTMsIC0xLCAtMSwgLTMsIC0xLCAtMiwgLTMsIC0xLCAtMSwgLTIsIC0yLCAtMSwgLTMsIC0zLCAtMiwgLTRdLFxuICBbLTEsIDEsIDAsIDAsIC0zLCA1LCAyLCAtMiwgMCwgLTMsIC0yLCAxLCAwLCAtMywgLTEsIDAsIC0xLCAtMiwgLTEsIC0yLCAwLCAzLCAtMSwgLTRdLFxuICBbLTEsIDAsIDAsIDIsIC00LCAyLCA1LCAtMiwgMCwgLTMsIC0zLCAxLCAtMiwgLTMsIC0xLCAwLCAtMSwgLTMsIC0yLCAtMiwgMSwgNCwgLTEsIC00XSxcbiAgWzAsIC0yLCAwLCAtMSwgLTMsIC0yLCAtMiwgNiwgLTIsIC00LCAtNCwgLTIsIC0zLCAtMywgLTIsIDAsIC0yLCAtMiwgLTMsIC0zLCAtMSwgLTIsIC0xLCAtNF0sXG4gIFstMiwgMCwgMSwgLTEsIC0zLCAwLCAwLCAtMiwgOCwgLTMsIC0zLCAtMSwgLTIsIC0xLCAtMiwgLTEsIC0yLCAtMiwgMiwgLTMsIDAsIDAsIC0xLCAtNF0sXG4gIFstMSwgLTMsIC0zLCAtMywgLTEsIC0zLCAtMywgLTQsIC0zLCA0LCAyLCAtMywgMSwgMCwgLTMsIC0yLCAtMSwgLTMsIC0xLCAzLCAtMywgLTMsIC0xLCAtNF0sXG4gIFstMSwgLTIsIC0zLCAtNCwgLTEsIC0yLCAtMywgLTQsIC0zLCAyLCA0LCAtMiwgMiwgMCwgLTMsIC0yLCAtMSwgLTIsIC0xLCAxLCAtNCwgLTMsIC0xLCAtNF0sXG4gIFstMSwgMiwgMCwgLTEsIC0zLCAxLCAxLCAtMiwgLTEsIC0zLCAtMiwgNSwgLTEsIC0zLCAtMSwgMCwgLTEsIC0zLCAtMiwgLTIsIDAsIDEsIC0xLCAtNF0sXG4gIFstMSwgLTEsIC0yLCAtMywgLTEsIDAsIC0yLCAtMywgLTIsIDEsIDIsIC0xLCA1LCAwLCAtMiwgLTEsIC0xLCAtMSwgLTEsIDEsIC0zLCAtMSwgLTEsIC00XSxcbiAgWy0yLCAtMywgLTMsIC0zLCAtMiwgLTMsIC0zLCAtMywgLTEsIDAsIDAsIC0zLCAwLCA2LCAtNCwgLTIsIC0yLCAxLCAzLCAtMSwgLTMsIC0zLCAtMSwgLTRdLFxuICBbLTEsIC0yLCAtMiwgLTEsIC0zLCAtMSwgLTEsIC0yLCAtMiwgLTMsIC0zLCAtMSwgLTIsIC00LCA3LCAtMSwgLTEsIC00LCAtMywgLTIsIC0yLCAtMSwgLTIsIC00XSxcbiAgWzEsIC0xLCAxLCAwLCAtMSwgMCwgMCwgMCwgLTEsIC0yLCAtMiwgMCwgLTEsIC0yLCAtMSwgNCwgMSwgLTMsIC0yLCAtMiwgMCwgMCwgMCwgLTRdLFxuICBbMCwgLTEsIDAsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTEsIDEsIDUsIC0yLCAtMiwgMCwgLTEsIC0xLCAwLCAtNF0sXG4gIFstMywgLTMsIC00LCAtNCwgLTIsIC0yLCAtMywgLTIsIC0yLCAtMywgLTIsIC0zLCAtMSwgMSwgLTQsIC0zLCAtMiwgMTEsIDIsIC0zLCAtNCwgLTMsIC0yLCAtNF0sXG4gIFstMiwgLTIsIC0yLCAtMywgLTIsIC0xLCAtMiwgLTMsIDIsIC0xLCAtMSwgLTIsIC0xLCAzLCAtMywgLTIsIC0yLCAyLCA3LCAtMSwgLTMsIC0yLCAtMSwgLTRdLFxuICBbMCwgLTMsIC0zLCAtMywgLTEsIC0yLCAtMiwgLTMsIC0zLCAzLCAxLCAtMiwgMSwgLTEsIC0yLCAtMiwgMCwgLTMsIC0xLCA0LCAtMywgLTIsIC0xLCAtNF0sXG4gIFstMiwgLTEsIDMsIDQsIC0zLCAwLCAxLCAtMSwgMCwgLTMsIC00LCAwLCAtMywgLTMsIC0yLCAwLCAtMSwgLTQsIC0zLCAtMywgNCwgMSwgLTEsIC00XSxcbiAgWy0xLCAwLCAwLCAxLCAtMywgMywgNCwgLTIsIDAsIC0zLCAtMywgMSwgLTEsIC0zLCAtMSwgMCwgLTEsIC0zLCAtMiwgLTIsIDEsIDQsIC0xLCAtNF0sXG4gIFswLCAtMSwgLTEsIC0xLCAtMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTIsIDAsIDAsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC00XSxcbiAgWy00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgMV1dO1xuXG4vLyBQcm90ZWluIGluZGV4ZXMgZm9yIEJMT1NVTSBtYXRyaXhcbmNvbnN0IFByb3RJbmRleGVzOiB7W2lkOnN0cmluZ106bnVtYmVyfSA9IHtcbiAgJ0EnOiAwLCAnUic6IDEsICdOJzogMiwgJ0QnOiAzLCAnQyc6IDQsICdRJzogNSwgJ0UnOiA2LCAnRyc6IDcsICdIJzogOCxcbiAgJ0knOiA5LCAnTCc6IDEwLCAnSyc6IDExLCAnTSc6IDEyLCAnRic6IDEzLCAnUCc6IDE0LCAnUyc6IDE1LCAnVCc6IDE2LFxuICAnVyc6IDE3LCAnWSc6IDE4LCAnVic6IDE5LCAnQic6IDIwLCAnWic6IDIxLCAnWCc6IDIyLCAnKic6IDIzXG59O1xuXG50eXBlIE5lZWRsZW1hbld1bmNoQXJncyA9IG1tRGlzdGFuY2VGdW5jdGlvbkFyZ3MgJiB7XG4gIGdhcE9wZW46IG51bWJlcjtcbiAgZ2FwRXh0ZW5kOiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRBcmdzOiBOZWVkbGVtYW5XdW5jaEFyZ3MgPSB7XG4gIGdhcE9wZW46IDgsXG4gIGdhcEV4dGVuZDogMixcbiAgc2NvcmluZ01hdHJpeDogQkxPU1VNNjIsXG4gIGFscGhhYmV0SW5kZXhlczogUHJvdEluZGV4ZXNcbn07XG5cbi8qKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYWxjdWxhdGVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzZXF1ZW5jZXMgYmFzZWQgb24gZ2FwIHBlbmFsdHkgYW5kIG1hdHJpeFxuICogQHBhcmFtIHtQYXJ0aWFsPE5lZWRsZW1hbld1bmNoQXJncz59YXJncyAtIGFyZ3VtZW50cyBmb3IgTmVlZGxlbWFuLVd1bmNoIGFsZ29yaXRobSBsaWtlIGdhcCBwZW5hbHR5LCBTY29yaW5nIG1hdHJpeC4uXG4gKiBAcmV0dXJuIHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSAtIGZ1bmN0aW9uIHRoYXQgY2FsY3VsYXRlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gc2VxdWVuY2VzXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIG5lZWRsZW1hbld1bmNoKGFyZ3M6IFBhcnRpYWw8TmVlZGxlbWFuV3VuY2hBcmdzPik6IG1tRGlzdGFuY2VGdW5jdGlvblR5cGUge1xuICByZXR1cm4gKHNlcTE6IHN0cmluZywgc2VxMjogc3RyaW5nKSA6IG51bWJlciA9PiB7XG4gICAgY29uc3Qge2dhcE9wZW4sIGdhcEV4dGVuZCwgc2NvcmluZ01hdHJpeCwgYWxwaGFiZXRJbmRleGVzfSA9IHsuLi5kZWZhdWx0QXJncywgLi4uYXJnc307XG4gICAgLy8gQXMgd2UgZG9uJ3QgbmVlZCB0cmFjZWJhY2ssIG5vIG5lZWQgdG8gc3RvcmUgdGhlIHdob2xlIG1hdHJpeFxuICAgIC8vIEludGVhZCwgd2Ugd2lsbCBzdG9yZSBvbmx5IHRoZSBsYXN0IHR3byByb3dzXG4gICAgY29uc3QgbWF0cml4OiBudW1iZXJbXVtdID0gW1xuICAgICAgbmV3IEFycmF5PG51bWJlcj4oc2VxMS5sZW5ndGggKyAxKS5maWxsKDApLFxuICAgICAgbmV3IEFycmF5PG51bWJlcj4oc2VxMS5sZW5ndGggKyAxKS5maWxsKDApXG4gICAgXTtcbiAgICAvLyBzaW1pbGFybHksIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGF0IG9wZXJhdGlvbiBsZWQgdG8gdGhlIGN1cnJlbnQgY2VsbFxuICAgIC8vIGkuZS4gd2hldGhlciB3ZSBjYW1lIGZyb20gdGhlIGxlZnQsIHRvcCBvciBkaWFnb25hbCB0byBhc3NpZ24gZ2FwIG9wZW4vZ2FwIGV4dGVuZCBwZW5hbHR5XG4gICAgY29uc3QgdmVydGljYWxHYXBzOiBib29sZWFuW10gPSBuZXcgQXJyYXk8Ym9vbGVhbj4oc2VxMS5sZW5ndGggKyAxKS5maWxsKGZhbHNlKTtcbiAgICBjb25zdCBob3Jpem9udGFsR2FwczogYm9vbGVhbltdID0gbmV3IEFycmF5PGJvb2xlYW4+KHNlcTEubGVuZ3RoICsgMSkuZmlsbChmYWxzZSk7XG5cbiAgICAvL3ZhcmlhYmxlcyB0byBrZWVwIHRyYWNrIHdoaWNoIHJvdyB3ZSBhcmUgaW5cbiAgICAvLyB0aGV5IHdpbGwgc3dhcCBwbGFjZXMgb24gZWFjaCBpdGVyYXRpb25cbiAgICBsZXQgcHJldlJvdyA9IDA7XG4gICAgbGV0IGN1cnJSb3cgPSAxO1xuICAgIC8vIEluaXRpYWxpemUgZmlyc3Qgcm93XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzZXExLmxlbmd0aCArIDE7IGkrKylcbiAgICAgIG1hdHJpeFswXVtpXSA9IC1nYXBPcGVuIC0gKGkgLSAxKSAqIGdhcEV4dGVuZDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgcmVzdCBvZiB0aGUgbWF0cml4XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzZXEyLmxlbmd0aCArIDE7IGkrKykge1xuICAgICAgbWF0cml4W2N1cnJSb3ddWzBdID0gLWdhcE9wZW4gLSAoaSAtIDEpICogZ2FwRXh0ZW5kO1xuICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCBzZXExLmxlbmd0aCArIDE7IGorKykge1xuICAgICAgICBjb25zdCBkaWFnb25hbCA9XG4gICAgICAgICAgbWF0cml4W3ByZXZSb3ddW2ogLSAxXSArIHNjb3JpbmdNYXRyaXhbYWxwaGFiZXRJbmRleGVzW3NlcTFbaiAtIDFdXV1bYWxwaGFiZXRJbmRleGVzW3NlcTJbaSAtIDFdXV07XG4gICAgICAgIGNvbnN0IHRvcCA9IG1hdHJpeFtwcmV2Um93XVtqXSAtICh2ZXJ0aWNhbEdhcHNbal0gPyBnYXBFeHRlbmQgOiBnYXBPcGVuICk7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBtYXRyaXhbY3VyclJvd11baiAtIDFdIC0gKGhvcml6b250YWxHYXBzW2ogLSAxXSA/IGdhcEV4dGVuZCA6IGdhcE9wZW4pO1xuICAgICAgICBtYXRyaXhbY3VyclJvd11bal0gPSBNYXRoLm1heChcbiAgICAgICAgICBkaWFnb25hbCwgbGVmdCwgdG9wXG4gICAgICAgICk7XG4gICAgICAgIC8vIHVwZGF0ZSBnYXAgYXJyYXlzXG4gICAgICAgIGlmIChtYXRyaXhbY3VyclJvd11bal0gPT09IGRpYWdvbmFsKSB7XG4gICAgICAgICAgdmVydGljYWxHYXBzW2pdID0gZmFsc2U7XG4gICAgICAgICAgaG9yaXpvbnRhbEdhcHNbal0gPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRyaXhbY3VyclJvd11bal0gPT09IGxlZnQpIHtcbiAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSBmYWxzZTtcbiAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmVydGljYWxHYXBzW2pdID0gdHJ1ZTtcbiAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTd2FwIHJvd3NcbiAgICAgIHByZXZSb3cgPSBjdXJyUm93O1xuICAgICAgY3VyclJvdyA9IChjdXJyUm93ICsgMSkgJSAyO1xuICAgIH1cbiAgICAvLyBhcyB0aGUgbWF0cml4IGlzIHRoZSBzaW1pbGFyaXR5IG1hdHJpeCwgYnV0IHdlIGFyZSBpbnRlcmVzdGVkIGluIGRpc3RhbmNlLFxuICAgIC8vIHdlIG5lZWQgY29tcGFyZSBpdCB0byBwZXJmZWN0IG1hdGNoIHNjb3JlIHRvIGdldCByZWFzb25hYmxlIGRpc3RhbmNlXG4gICAgY29uc3QgcGVyZmVjdE1hdGNoU2VxMSA9IHNlcTEuc3BsaXQoJycpLm1hcCgoYykgPT4gc2NvcmluZ01hdHJpeFthbHBoYWJldEluZGV4ZXNbY11dW2FscGhhYmV0SW5kZXhlc1tjXV0pXG4gICAgICAucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgY29uc3QgcGVyZmVjdE1hdGNoU2VxMiA9IHNlcTIuc3BsaXQoJycpLm1hcCgoYykgPT4gc2NvcmluZ01hdHJpeFthbHBoYWJldEluZGV4ZXNbY11dW2FscGhhYmV0SW5kZXhlc1tjXV0pXG4gICAgICAucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgY29uc3QgbWF4U2NvcmUgPSBNYXRoLm1heChwZXJmZWN0TWF0Y2hTZXExLCBwZXJmZWN0TWF0Y2hTZXEyKTtcbiAgICByZXR1cm4gKG1heFNjb3JlIC0gbWF0cml4W3ByZXZSb3ddW3NlcTEubGVuZ3RoXSkgLyBtYXhTY29yZTtcbiAgfTtcbn1cbiJdfQ==","const peq = new Uint32Array(0x10000);\nconst myers_32 = (a, b) => {\n const n = a.length;\n const m = b.length;\n const lst = 1 << (n - 1);\n let pv = -1;\n let mv = 0;\n let sc = n;\n let i = n;\n while (i--) {\n peq[a.charCodeAt(i)] |= 1 << i;\n }\n for (i = 0; i < m; i++) {\n let eq = peq[b.charCodeAt(i)];\n const xv = eq | mv;\n eq |= ((eq & pv) + pv) ^ pv;\n mv |= ~(eq | pv);\n pv &= eq;\n if (mv & lst) {\n sc++;\n }\n if (pv & lst) {\n sc--;\n }\n mv = (mv << 1) | 1;\n pv = (pv << 1) | ~(xv | mv);\n mv &= xv;\n }\n i = n;\n while (i--) {\n peq[a.charCodeAt(i)] = 0;\n }\n return sc;\n};\nconst myers_x = (b, a) => {\n const n = a.length;\n const m = b.length;\n const mhc = [];\n const phc = [];\n const hsize = Math.ceil(n / 32);\n const vsize = Math.ceil(m / 32);\n for (let i = 0; i < hsize; i++) {\n phc[i] = -1;\n mhc[i] = 0;\n }\n let j = 0;\n for (; j < vsize - 1; j++) {\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n }\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m - start) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] |= 1 << k;\n }\n let score = m;\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)];\n const pb = (phc[(i / 32) | 0] >>> i) & 1;\n const mb = (mhc[(i / 32) | 0] >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n score += (ph >>> (m - 1)) & 1;\n score -= (mh >>> (m - 1)) & 1;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0] ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0] ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n return score;\n};\nconst distance = (a, b) => {\n if (a.length < b.length) {\n const tmp = b;\n b = a;\n a = tmp;\n }\n if (b.length === 0) {\n return a.length;\n }\n if (a.length <= 32) {\n return myers_32(a, b);\n }\n return myers_x(a, b);\n};\nconst closest = (str, arr) => {\n let min_distance = Infinity;\n let min_index = 0;\n for (let i = 0; i < arr.length; i++) {\n const dist = distance(str, arr[i]);\n if (dist < min_distance) {\n min_distance = dist;\n min_index = i;\n }\n }\n return arr[min_index];\n};\nexport { closest, distance };\n"],"names":["isNil","x","hamming","args","distanceF","scoringMatrix","alphabetIndexes","a","b","length","Object","keys","Error","indexes","matrix","minCharCode","Math","min","map","k","charCodeAt","scorringArray","Float32Array","entries","forEach","key","index","matrixRow","key2","index2","getDistanceF","threshold","seq1","seq2","diff","s1l","s2l","thresholdLimit","max","abs","result","i","levenstein","defaultArgs","gapOpen","gapExtend","needlemanWunch","Array","fill","verticalGaps","horizontalGaps","prevRow","currRow","j","diagonal","top","left","perfectMatchSeq1","split","c","reduce","perfectMatchSeq2","maxScore","peq","Uint32Array","distance","tmp","n","m","lst","pv","mv","sc","eq","xv","myers_32","mhc","phc","hsize","ceil","vsize","start","vlen","pb","mb","xh","ph","mh","score","myers_x"],"sourceRoot":""}
|
package/dist/190.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var bio;(()=>{"use strict";var r,e,t={3190:(r,e,t)=>{var o,n=t(6814),a=t(779),i=t(458),c=t(6683);!function(r){r.HAMMING="Hamming",r.LEVENSHTEIN="Levenshtein",r.NEEDLEMANN_WUNSCH="Needlemann-Wunsch",r.MONOMER_CHEMICAL_DISTANCE="Monomer chemical distance"}(o||(o={}));const s={[o.HAMMING]:a.j,[o.LEVENSHTEIN]:i.r,[o.NEEDLEMANN_WUNSCH]:c.n,[o.MONOMER_CHEMICAL_DISTANCE]:a.j};onmessage=r=>{const{fnName:e,values:t,templateIdx:o,start:a,end:i}=r.data,c={};try{let r=0,p=Number.MIN_VALUE;const l=new Float32Array(i-a),u=s[e]();for(let e=a;e<i;e++){const i=(0,n.k)(t[e])||(0,n.k)(t[o])?1:u(t[e],t[o]);l[e-a]=i,i<r&&(r=i),i>p&&(p=i)}c.distanceArrayData=l,c.min=r,c.max=p}catch(r){c.error=r}postMessage(c)}}},o={};function n(r){var e=o[r];if(void 0!==e)return e.exports;var a=o[r]={exports:{}};return t[r](a,a.exports,n),a.exports}n.m=t,n.x=()=>{var r=n.O(void 0,[1],(()=>n(3190)));return n.O(r)},r=[],n.O=(e,t,o,a)=>{if(!t){var i=1/0;for(l=0;l<r.length;l++){for(var[t,o,a]=r[l],c=!0,s=0;s<t.length;s++)(!1&a||i>=a)&&Object.keys(n.O).every((r=>n.O[r](t[s])))?t.splice(s--,1):(c=!1,a<i&&(i=a));if(c){r.splice(l--,1);var p=o();void 0!==p&&(e=p)}}return e}a=a||0;for(var l=r.length;l>0&&r[l-1][2]>a;l--)r[l]=r[l-1];r[l]=[t,o,a]},n.d=(r,e)=>{for(var t in e)n.o(e,t)&&!n.o(r,t)&&Object.defineProperty(r,t,{enumerable:!0,get:e[t]})},n.f={},n.e=r=>Promise.all(Object.keys(n.f).reduce(((e,t)=>(n.f[t](r,e),e)),[])),n.u=r=>r+".js",n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(r){if("object"==typeof window)return window}}(),n.o=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),(()=>{var r;n.g.importScripts&&(r=n.g.location+"");var e=n.g.document;if(!r&&e&&(e.currentScript&&(r=e.currentScript.src),!r)){var t=e.getElementsByTagName("script");if(t.length)for(var o=t.length-1;o>-1&&!r;)r=t[o--].src}if(!r)throw new Error("Automatic publicPath is not supported in this browser");r=r.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=r})(),(()=>{var r={190:1};n.f.i=(e,t)=>{r[e]||importScripts(n.p+n.u(e))};var e=self.webpackChunkbio=self.webpackChunkbio||[],t=e.push.bind(e);e.push=e=>{var[o,a,i]=e;for(var c in a)n.o(a,c)&&(n.m[c]=a[c]);for(i&&i(n);o.length;)r[o.pop()]=1;t(e)}})(),e=n.x,n.x=()=>n.e(1).then(e);var a=n.x();bio=a})();
|
|
2
|
-
//# sourceMappingURL=190.js.map
|