@datagrok/helm 2.1.8 → 2.1.10

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.
@@ -1 +1 @@
1
- {"version":3,"file":"package.js","mappings":"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","sources":["webpack://helm/webpack/bootstrap","webpack://helm/webpack/runtime/compat get default export","webpack://helm/webpack/runtime/define property getters","webpack://helm/webpack/runtime/hasOwnProperty shorthand","webpack://helm/webpack/runtime/make namespace object","webpack://helm/external var \"grok\"","webpack://helm/external var \"ui\"","webpack://helm/external var \"DG\"","webpack://helm/./src/helm-web-editor.ts","webpack://helm/./src/utils.ts","webpack://helm/external var \"wu\"","webpack://helm/./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://helm/./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/seq-palettes.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/aminoacids.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/nucleotides.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/unknown.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/cell-renderer.js","webpack://helm/./node_modules/@datagrok-libraries/utils/src/to-console.js","webpack://helm/./src/cell-renderer.ts","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/notation-converter.js","webpack://helm/./src/package.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = grok;","const __WEBPACK_NAMESPACE_OBJECT__ = ui;","const __WEBPACK_NAMESPACE_OBJECT__ = DG;","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nexport class HelmWebEditor {\n host: any;\n editor: any;\n w = 200;\n h = 100;\n constructor() {\n this.host = ui.div([], {style: {width: `${this.w}px`, height: `${this.h}px`}});\n this.editor = new JSDraw2.Editor(this.host, {width: this.w, height: this.h, viewonly: true});\n }\n\n resizeEditor(w: number, h: number) {\n this.editor.setSize(w, h);\n }\n\n createWebEditor(value: string) {\n const editorView = ui.div();\n org.helm.webeditor.MolViewer.molscale = 0.8;\n const webEditor = new scil.helm.App(editorView, {\n showabout: false,\n mexfontsize: '90%',\n mexrnapinontab: true,\n topmargin: 20,\n mexmonomerstab: true,\n sequenceviewonly: false,\n mexfavoritefirst: true,\n mexfilter: true\n });\n const sizes = webEditor.calculateSizes();\n webEditor.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);\n let s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};\n //@ts-ignore\n scil.apply(webEditor.sequence.style, s);\n //@ts-ignore\n scil.apply(webEditor.notation.style, s);\n s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + webEditor.toolbarheight) + 'px'};\n //@ts-ignore\n scil.apply(webEditor.properties.parent.style, s);\n webEditor.structureview.resize(sizes.rightwidth, sizes.bottomheight + webEditor.toolbarheight);\n webEditor.mex.resize(sizes.topheight - 80);\n setTimeout(function() {\n webEditor.canvas.helm.setSequence(value, 'HELM');\n }, 200);\n return {editorDiv: editorView, webEditor: webEditor};\n }\n}\n\n","import * as DG from 'datagrok-api/dg';\nimport { RGROUP_CAP_GROUP_NAME, RGROUP_CAP_GROUP_SMILES, jsonSdfMonomerLibDict, MONOMER_SYMBOL, RGROUP_ALTER_ID, RGROUPS, RGROUP_LABEL, SDF_MONOMER_NAME } from \"./constants\";\n\nexport function getParts(subParts: string[], s: string): string[] {\n let j = 0;\n let allParts: string[] = [];\n for (let k = 0; k < subParts.length; ++k) {\n let indexOfMonomer = s.indexOf(subParts[k]);\n let helmBeforeMonomer = s.slice(j, indexOfMonomer);\n allParts.push(helmBeforeMonomer);\n allParts.push(subParts[k]);\n s = s.substring(indexOfMonomer + subParts[k].length);\n }\n allParts.push(s);\n return allParts;\n}\n\nexport function parseHelm(s: string) {\n var sections = split(s, '$');\n s = sections[0];\n var monomers = [];\n //@ts-ignore\n if (!scil.Utils.isNullOrEmpty(s)) {\n var seqs = split(s, '|');\n for (var i = 0; i < seqs.length; ++i) {\n var e = detachAnnotation(seqs[i]);\n s = e.str;\n\n var p = s.indexOf('{');\n\n s = s.substring(p + 1);\n p = s.indexOf('}');\n s = s.substring(0, p);\n\n var ss = split(s, '.');\n for (var monomer of ss) {\n if (monomer.includes('(') && monomer.includes(')')) {\n var elements = monomer.replace(/[()]/g, '').split('');\n for (var el of elements) {\n monomers.push(el);\n }\n } else if (monomer.includes('[') && monomer.includes(']')) {\n var element = monomer.match(/(?<=\\[).*?(?=\\])/g, '');\n monomers.push(element[0]);\n } else {\n monomers.push(monomer);\n }\n }\n }\n }\n return monomers;\n}\n\nexport function findMonomers(helmString: string) {\n //@ts-ignore\n const types = Object.keys(org.helm.webeditor.monomerTypeList());\n const monomers: any = [];\n const monomer_names: any = [];\n for (var i = 0; i < types.length; i++) {\n //@ts-ignore\n monomers.push(new scil.helm.Monomers.getMonomerSet(types[i]));\n Object.keys(monomers[i]).forEach(k => {\n monomer_names.push(monomers[i][k].id);\n });\n }\n const split_string = parseHelm(helmString);\n return new Set(split_string.filter(val => !monomer_names.includes(val)));\n}\n\nfunction split(s: string, sep: string) {\n var ret = [];\n var frag = '';\n var parentheses = 0;\n var bracket = 0;\n var braces = 0;\n var quote = 0;\n for (var i = 0; i < s.length; ++i) {\n var c = s.substring(i, i + 1);\n if (c == sep && bracket == 0 && parentheses == 0 && braces == 0 && quote == 0) {\n ret.push(frag);\n frag = '';\n } else {\n frag += c;\n if (quote > 0) {\n if (c == '\\\\' && i + 1 < s.length) {\n ++i;\n var c2 = s.substring(i, i + 1);\n frag += c2;\n c += c2;\n }\n }\n if (c == '\\\"') {\n if (!(i > 0 && s.substring(i - 1, i) == '\\\\'))\n quote = quote == 0 ? 1 : 0;\n } else if (c == '[')\n ++bracket;\n else if (c == ']')\n --bracket;\n else if (c == '(')\n ++parentheses;\n else if (c == ')')\n --parentheses;\n else if (c == '{')\n ++braces;\n else if (c == '}')\n --braces;\n }\n }\n ret.push(frag);\n return ret;\n}\n\nfunction detachAnnotation(s: string) {\n var ret = _detachAppendix(s, '\\\"');\n if (ret.tag != null)\n return ret;\n\n var r = _detachAppendix(s, '\\'');\n return {tag: ret.tag, repeat: r.tag, str: r.str};\n}\n\nfunction _detachAppendix(s: string, c: string) {\n var tag = null;\n //@ts-ignore\n if (scil.Utils.endswith(s, c)) {\n var p = s.length - 1;\n while (p > 0) {\n p = s.lastIndexOf(c, p - 1);\n if (p <= 0 || s.substring(p - 1, p) != '\\\\')\n break;\n }\n\n if (p > 0 && p < s.length - 1) {\n tag = s.substring(p + 1, s.length - 1);\n s = s.substring(0, p);\n }\n }\n if (tag != null)\n tag = tag.replace(new RegExp('\\\\' + c, 'g'), c);\n return {tag: unescape(tag), str: s};\n}\n\nfunction unescape(s: string) {\n //@ts-ignore\n if (scil.Utils.isNullOrEmpty(s))\n return s;\n\n return s.replace(/[\\\\]./g, function(m) {\n switch (m) {\n case '\\\\r':\n return '\\r';\n case '\\\\n':\n return '\\n';\n case '\\\\t':\n return '\\t';\n default:\n return m.substring(1);\n }\n });\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = wu;","/**\n * Denotes a vector of floating poit values.\n *\n * @export\n * @class Vector\n * @extends {Float32Array}\n */\nexport class Vector extends Float32Array {\n}\n/**\n * Denotes a two-dimensional matrix.\n *\n * @export\n * @class Matrix\n * @extends {Array<Vector>}\n */\nexport class Matrix extends Array {\n}\n/**\n * Denotes cartesian coordinates.\n *\n * @export\n * @class Coordinates\n * @extends {Matrix}\n */\nexport class Coordinates extends Matrix {\n}\n/**\n * Denotes an array of arbitrary-typed vectors.\n *\n * @export\n * @class Vectors\n * @extends {Array<any>}\n */\nexport class Vectors extends Array {\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiJdfQ==","import { Vector } from './type-declarations';\nimport { randomFloat, randomInt } from './random';\n/**\n * Asserts a condition by throwing an Error.\n *\n * @export\n * @param {boolean} [condition=false] Condition to assert.\n * @param {string} [message='Assertion error.'] Message to output.\n * @throws {Error}\n */\nexport function assert(condition = false, message = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\n/**\n * Creates new two-dimensional array and fills it with the value given.\n *\n * @param {number} dimension1 The first dimension of the coordinates (number of rows).\n * @param {number} dimension2 The second dimension of the coordinates (number of columns).\n * @param {number} [fill=0] A value to fill the coordinates with.\n * @return {Coordinates} A two-dimensional filled with the value given.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nfunction initCoordinates(dimension1, dimension2, fill = 0) {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\n/**\n * Transpose matrix.\n *\n * @export\n * @param {Matrix} matrix The matrix to be transposed.\n * @return {Matrix} Transposed matrix.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function transposeMatrix(matrix) {\n return new Array(matrix[0].length).fill(0)\n .map((_, i) => (new Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));\n}\n/**\n * Adds two vectors with the second one to be multiplied by the given ratio.\n *\n * @export\n * @param {Vector} p The first vector to add.\n * @param {Vector} q The second vector to add.\n * @param {number} [multiplier=1] A multiplier to be used before the second vector is added.\n * @return {Vector} New vector contained the result of operation p+multiplier*q.\n */\nexport function vectorAdd(p, q, multiplier = 1) {\n const nItems = p.length;\n assert(nItems == q.length, 'Vector lengths do not match.');\n const total = new Vector(nItems);\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n return total;\n}\n/**\n * Sums the vector's items.\n *\n * @param {Vector} v The vector to be summed.\n * @return {number} The vector's items sum.\n */\nfunction itemsSum(v) {\n let total = 0;\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n return total;\n}\n/**\n * Suqares the vector's items.\n *\n * @param {Vector} v The vector to square.\n * @return {Vector} A new vector containing the original's items squared.\n */\nfunction vectorSquare(v) {\n const nItems = v.length;\n const total = new Vector(nItems);\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n return total;\n}\nexport function vectorLength(v) {\n let sqrSum = 0;\n for (let i = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\nexport function vectorDotProduct(v1, v2) {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod = 0;\n for (let i = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\n/**\n * Creates a matrix filled with random floating point values.\n *\n * @export\n * @param {number} dimension1 The first dimension of the matrix.\n * @param {number} dimension2 The second dimension of the matrix.\n * @param {number} [scale=1.] Max value given by random generator.\n * @return {Matrix} A new matrix filled with random floating point values.\n */\nexport function fillRandomMatrix(dimension1, dimension2, scale = 1.) {\n const matrix = initCoordinates(dimension1, dimension2);\n for (let i = 0; i < dimension1; ++i) {\n for (let j = 0; j < dimension2; ++j)\n matrix[i][j] = randomFloat(scale);\n }\n return matrix;\n}\n/**\n * Calculates Euclidean distance between two vectors.\n *\n * @export\n * @param {Vector} p The first vector.\n * @param {Vector} q The second vector.\n * @return {number} Euclidean distance between the given vectors.\n */\nexport function calculateEuclideanDistance(p, q) {\n const diff = vectorAdd(p, q, -1);\n const sqdiff = vectorSquare(diff);\n const sqdiffSumm = itemsSum(sqdiff);\n return Math.sqrt(sqdiffSumm);\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n }\n }\n return matrix;\n}\n/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin, end, endExclusive = false) {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n return series;\n}\n/**\n * Returns order of values as if they are sorted.\n *\n * @export\n * @param {any[]} values Input array.\n * @param {boolean} [reverse=false] Whether to return reversed order.\n * @return {number[]} The order computed.\n */\nexport function argSort(values, reverse = false) {\n const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);\n const decor = (v, i) => [v, i]; // set index to value\n const undecor = (a) => a[1]; // leave only index\n const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\n/**\n * Returns the indexes of the most diverse objects according to the dist function\n * @param {number} length total number of objects\n * @param {number} n number of diverse elements to find\n * @param {(i1: number, i2: number) => number} dist a function which calculates distance between\n * two objects using their indexes\n * @returns {number[]} The indexes of the most diverse objects\n */\nexport function getDiverseSubset(length, n, dist) {\n function maxBy(values, orderBy) {\n let maxValue = null;\n let maxOrderBy = null;\n for (const element of values) {\n const elementOrderBy = orderBy(element);\n if (maxOrderBy == null || elementOrderBy > maxOrderBy) {\n maxValue = element;\n maxOrderBy = elementOrderBy;\n }\n }\n return maxValue;\n }\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n while (subset.length < n) {\n const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {\n return dist(i, val);\n })));\n if (idx) {\n subset.push(idx);\n complement.delete(idx);\n }\n }\n return subset;\n}\n/**\n * Returns normalized vector\n * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n let mean = 0;\n let std = 0;\n for (let i = 0; i < data.length; ++i)\n mean += data[i];\n mean /= data.length;\n for (let i = 0; i < data.length; ++i)\n std += (data[i] - mean) * (data[i] - mean);\n std = Math.sqrt(std / data.length);\n for (let i = 0; i < data.length; ++i)\n data[i] = (data[i] - mean) / std;\n return data;\n}\n/**\n * Finds set difference between two lists.\n * @param {any[]} a The first list.\n * @param {any[]} b The second list.\n * @return {any[]}\n */\nexport function setDifference(a, b) {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxPQUFlLENBQUM7SUFDL0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBYztJQUM1QyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1B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LENBQUM7UUFDbEMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBRTdDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7SUFFbkMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLENBQVEsRUFBRSxDQUFRO0lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWF0cml4LCBWZWN0b3IsIENvb3JkaW5hdGVzLCBWZWN0b3JzLCBEaXN0YW5jZU1ldHJpY30gZnJvbSAnLi90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge3JhbmRvbUZsb2F0LCByYW5kb21JbnR9IGZyb20gJy4vcmFuZG9tJztcblxuLyoqXG4gKiBBc3NlcnRzIGEgY29uZGl0aW9uIGJ5IHRocm93aW5nIGFuIEVycm9yLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmRpdGlvbj1mYWxzZV0gQ29uZGl0aW9uIHRvIGFzc2VydC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZT0nQXNzZXJ0aW9uIGVycm9yLiddIE1lc3NhZ2UgdG8gb3V0cHV0LlxuICogQHRocm93cyB7RXJyb3J9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uOiBib29sZWFuID0gZmFsc2UsIG1lc3NhZ2U6IHN0cmluZyA9ICdBc3NlcnRpb24gZXJyb3IuJykge1xuICBpZiAoIWNvbmRpdGlvbilcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBuZXcgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGFuZCBmaWxscyBpdCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBjb29yZGluYXRlcyAobnVtYmVyIG9mIHJvd3MpLlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjIgVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2YgY29sdW1ucykuXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGw9MF0gQSB2YWx1ZSB0byBmaWxsIHRoZSBjb29yZGluYXRlcyB3aXRoLlxuICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IEEgdHdvLWRpbWVuc2lvbmFsIGZpbGxlZCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqIEB0b2RvIE1pZ2h0IGJlIHNsb3cgc2luY2UgdXNlZCBBcnJheS5tYXAuIFByb2JhYmx5IG5lZWRzIHBlcmZvcm1hbmNlIHJldmlzaW9uLlxuICovXG5mdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBjb25zdCBkaWZmID0gdmVjdG9yQWRkKHAsIHEsIC0xKTtcbiAgY29uc3Qgc3FkaWZmID0gdmVjdG9yU3F1YXJlKGRpZmYpO1xuICBjb25zdCBzcWRpZmZTdW1tID0gaXRlbXNTdW0oc3FkaWZmKTtcbiAgcmV0dXJuIE1hdGguc3FydChzcWRpZmZTdW1tKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGlzdGFuY2UgbWF0cml4IHVzaW5nIGEgY3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yc30gZGF0YSBJbnB1dCB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZXMuXG4gKiBAcGFyYW0ge0Rpc3RhbmNlTWV0cmljfSBkaXN0YW5jZSBDdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtNYXRyaXh9IENhbGN1bGF0ZWQgY3VzdG9tIGRpc3RhbmNlIG1hdHJpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGNEaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opIHtcbiAgICAgIGNvbnN0IGQ6IG51bWJlciA9IChkYXRhW2ldID09IG51bGwpIHx8IChkYXRhW2pdID09IG51bGwpID8gMCA6IGRpc3RhbmNlKGRhdGFbaV0sIGRhdGFbal0pO1xuICAgICAgbWF0cml4W2ldW2pdID0gbWF0cml4W2pdW2ldID0gZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hdHJpeDtcbn1cblxuLyoqIEdlbmVyYXRlcyBhcnJheSBmcm9tIGEgcmFuZ2UgW2JlZ2luOyBlbmRdIG9yIFtiZWdpbjsgZW5kKSBpZiBlbmRFeGNsdXNpdmUuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlblJhbmdlKGJlZ2luOiBudW1iZXIsIGVuZDogbnVtYmVyLCBlbmRFeGNsdXNpdmUgPSBmYWxzZSk6IEludDMyQXJyYXkge1xuICBjb25zdCBuSXRlbXMgPSBlbmQgLSBiZWdpbiArIChlbmRFeGNsdXNpdmUgPyAwIDogMSk7XG4gIGNvbnN0IHNlcmllcyA9IG5ldyBJbnQzMkFycmF5KG5JdGVtcyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuSXRlbXM7ICsraSlcbiAgICBzZXJpZXNbaV0gPSBiZWdpbiArIGk7XG5cbiAgcmV0dXJuIHNlcmllcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG9yZGVyIG9mIHZhbHVlcyBhcyBpZiB0aGV5IGFyZSBzb3J0ZWQuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHthbnlbXX0gdmFsdWVzIElucHV0IGFycmF5LlxuICogQHBhcmFtIHtib29sZWFufSBbcmV2ZXJzZT1mYWxzZV0gV2hldGhlciB0byByZXR1cm4gcmV2ZXJzZWQgb3JkZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJbXX0gVGhlIG9yZGVyIGNvbXB1dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJnU29ydCh2YWx1ZXM6IGFueVtdLCByZXZlcnNlID0gZmFsc2UpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNvcnRmbiA9IHJldmVyc2UgPyAoYTogYW55W10sIGI6IGFueVtdKSA9PiAoYlswXSAtIGFbMF0pIDogKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGFbMF0gLSBiWzBdKTtcbiAgY29uc3QgZGVjb3IgPSAodjogYW55LCBpOiBudW1iZXIpID0+IFt2LCBpXTsgLy8gc2V0IGluZGV4IHRvIHZhbHVlXG4gIGNvbnN0IHVuZGVjb3IgPSAoYTogYW55W10pID0+IGFbMV07IC8vIGxlYXZlIG9ubHkgaW5kZXhcbiAgY29uc3QgX2FyZ3NvcnQgPSAoYXJyOiBhbnlbXSkgPT4gYXJyLm1hcChkZWNvcikuc29ydChzb3J0Zm4pLm1hcCh1bmRlY29yKTtcbiAgcmV0dXJuIF9hcmdzb3J0KHZhbHVlcyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBkaXN0IGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRvdGFsIG51bWJlciBvZiBvYmplY3RzXG4gKiBAcGFyYW0ge251bWJlcn0gbiBudW1iZXIgb2YgZGl2ZXJzZSBlbGVtZW50cyB0byBmaW5kXG4gKiBAcGFyYW0geyhpMTogbnVtYmVyLCBpMjogbnVtYmVyKSA9PiBudW1iZXJ9IGRpc3QgYSBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gb2JqZWN0cyB1c2luZyB0aGVpciBpbmRleGVzXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBpbmRleGVzIG9mIHRoZSBtb3N0IGRpdmVyc2Ugb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGl2ZXJzZVN1YnNldChsZW5ndGg6IG51bWJlciwgbjogbnVtYmVyLCBkaXN0OiAoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyW10ge1xuICBmdW5jdGlvbiBtYXhCeSh2YWx1ZXM6IEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPiwgb3JkZXJCeTogKGk6IG51bWJlcikgPT4gbnVtYmVyKSB7XG4gICAgbGV0IG1heFZhbHVlID0gbnVsbDtcbiAgICBsZXQgbWF4T3JkZXJCeSA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7XG4gICAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGVsZW1lbnRPcmRlckJ5ID4gbWF4T3JkZXJCeSkge1xuICAgICAgICBtYXhWYWx1ZSA9IGVsZW1lbnQ7XG4gICAgICAgIG1heE9yZGVyQnkgPSBlbGVtZW50T3JkZXJCeTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFZhbHVlO1xuICB9XG5cbiAgY29uc3Qgc3Vic2V0ID0gW3JhbmRvbUludChsZW5ndGggLSAxKV07XG4gIGNvbnN0IGNvbXBsZW1lbnQgPSBuZXcgU2V0KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICghc3Vic2V0LmluY2x1ZGVzKGkpKVxuICAgICAgY29tcGxlbWVudC5hZGQoaSk7XG4gIH1cblxuICB3aGlsZSAoc3Vic2V0Lmxlbmd0aCA8IG4pIHtcbiAgICBjb25zdCBpZHggPSBtYXhCeShcbiAgICAgIGNvbXBsZW1lbnQudmFsdWVzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxudW1iZXI+LFxuICAgICAgKGkpID0+IE1hdGgubWluLmFwcGx5KE1hdGgsIHN1YnNldC5tYXAoZnVuY3Rpb24odmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZGlzdChpLCB2YWwpO1xuICAgICAgfSkpKTtcbiAgICBpZiAoaWR4KSB7XG4gICAgICBzdWJzZXQucHVzaChpZHgpO1xuICAgICAgY29tcGxlbWVudC5kZWxldGUoaWR4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1YnNldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGl6ZWQgdmVjdG9yXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gZGF0YSBudW1lcmljYWwgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhOiBWZWN0b3IpOiBWZWN0b3Ige1xuICBsZXQgbWVhbiA9IDA7XG4gIGxldCBzdGQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICBtZWFuICs9IGRhdGFbaV07XG5cbiAgbWVhbiAvPSBkYXRhLmxlbmd0aDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgc3RkICs9IChkYXRhW2ldIC0gbWVhbikgKiAoZGF0YVtpXSAtIG1lYW4pO1xuXG4gIHN0ZCA9IE1hdGguc3FydChzdGQgLyBkYXRhLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pIC8gc3RkO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEZpbmRzIHNldCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxpc3RzLlxuICogQHBhcmFtIHthbnlbXX0gYSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7YW55W119IGIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREaWZmZXJlbmNlKGE6IGFueVtdLCBiOiBhbnlbXSk6IGFueVtdIHtcbiAgY29uc3QgYlNldCA9IG5ldyBTZXQoYik7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYS5maWx0ZXIoKHgpID0+ICFiU2V0Lmhhcyh4KSkpLnZhbHVlcygpKTtcbn1cbiJdfQ==","export class SeqPaletteBase {\n static makePalette(dt, simplified = false, PaletteType = SeqPaletteBase) {\n const palette = {};\n dt.forEach((cp) => {\n const objList = cp[0];\n const colour = cp[1];\n objList.forEach((obj, ind) => {\n palette[obj] = this.colourPalette[colour][simplified ? 0 : ind];\n });\n });\n return new PaletteType(palette);\n }\n constructor(palette) {\n this._palette = palette;\n }\n get(m) {\n return this._palette[m];\n }\n}\nSeqPaletteBase.undefinedColor = 'rgb(100,100,100)';\n/** Palette with shades of primary colors */\nSeqPaletteBase.colourPalette = {\n 'orange': ['rgb(255,187,120)', 'rgb(245,167,100)', 'rgb(235,137,70)', 'rgb(205, 111, 71)'],\n 'all_green': ['rgb(44,160,44)', 'rgb(74,160,74)', 'rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)',\n 'rgb(24,110,79)', 'rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'all_blue': ['rgb(31,119,180)', 'rgb(23,190,207)', 'rgb(122, 102, 189)', 'rgb(158,218,229)', 'rgb(141, 124, 217)',\n 'rgb(31, 120, 150)'],\n 'magenta': ['rgb(162,106,192)', 'rgb(197,165,224)', 'rgb(208,113,218)'],\n 'red': ['rgb(214,39,40)', 'rgb(255,152,150)'],\n 'st_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(31,119,180)'],\n 'dark_blue': ['rgb(31,119,180)', 'rgb(31, 120, 150)'],\n 'light_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(108, 218, 229)', 'rgb(23,190,227)'],\n 'lilac_blue': ['rgb(124,102,211)', 'rgb(149,134,217)', 'rgb(97, 81, 150)'],\n 'dark_green': ['rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)', 'rgb(24,110,79)'],\n 'green': ['rgb(44,160,44)', 'rgb(74,160,74)'],\n 'light_green': ['rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'st_green': ['rgb(44,160,44)', 'rgb(152,223,138)', 'rgb(39, 174, 96)', 'rgb(74,160,74)'],\n 'pink': ['rgb(247,182,210)'],\n 'brown': ['rgb(140,86,75)', 'rgb(102, 62, 54)'],\n 'gray': ['rgb(127,127,127)', 'rgb(199,199,199)', 'rgb(196,156,148)', 'rgb(222, 222, 180)'],\n 'yellow': ['rgb(188,189,34)'],\n 'white': ['rgb(230,230,230)'],\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxLXBhbGV0dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VxLXBhbGV0dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCQSxNQUFNLE9BQU8sY0FBYztJQTJCZixNQUFNLENBQUMsV0FBVyxDQUFDLEVBQXdCLEVBQ25ELFVBQVUsR0FBRyxLQUFLLEVBQUUsY0FBcUMsY0FBYztRQUV2RSxNQUFNLE9BQU8sR0FBOEIsRUFBRSxDQUFDO1FBQzlDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNoQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBSUQsWUFBWSxPQUFnQztRQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBRU0sR0FBRyxDQUFDLENBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7O0FBaERhLDZCQUFjLEdBQUcsa0JBQWtCLENBQUM7QUFFbEQsNENBQTRDO0FBQzlCLDRCQUFhLEdBQWdDO0lBQ3pELFFBQVEsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDO0lBQzFGLFdBQVcsRUFBRSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQjtRQUNwRyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQztJQUNuRixVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0I7UUFDL0csbUJBQW1CLENBQUM7SUFDdEIsU0FBUyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDdkUsS0FBSyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7SUFDN0MsU0FBUyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7SUFDckUsV0FBVyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUM7SUFDckQsWUFBWSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUM7SUFDOUYsWUFBWSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDMUUsWUFBWSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDdEYsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDN0MsYUFBYSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUM7SUFDL0UsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUM7SUFDeEYsTUFBTSxFQUFFLENBQUMsa0JBQWtCLENBQUM7SUFDNUIsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7SUFDL0MsTUFBTSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUM7SUFDMUYsUUFBUSxFQUFFLENBQUMsaUJBQWlCLENBQUM7SUFDN0IsT0FBTyxFQUFFLENBQUMsa0JBQWtCLENBQUM7Q0FDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VxUGFsZXR0ZSB7XG4gIC8vIFRoZXJlIGFyZSB0b28gbXVjaCBwcm9ibGVtIHdpdGggaW5kZXhlciBwcm9wZXJ0eSBpbiB0eXBlc2NyaXB0LlxuICAvLyAvKipcbiAgLy8gICogQHBhcmFtIHtzdHJpbmd9IG0gTW9ub21lciBjaGFyYWN0ZXJcbiAgLy8gICogQHJldHVybiB7c3RyaW5nfSBDb2xvclxuICAvLyAgKi9cbiAgLy8gW206IHN0cmluZ106IHN0cmluZztcbiAgLyoqIE1vbm9tZXIgY29sb3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IG0gTW9ub21lclxuICAgKi9cbiAgZ2V0KG06IHN0cmluZyk6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFNlcVBhbGV0dGVCYXNlIGltcGxlbWVudHMgU2VxUGFsZXR0ZSB7XG4gIHB1YmxpYyBzdGF0aWMgdW5kZWZpbmVkQ29sb3IgPSAncmdiKDEwMCwxMDAsMTAwKSc7XG5cbiAgLyoqIFBhbGV0dGUgd2l0aCBzaGFkZXMgb2YgcHJpbWFyeSBjb2xvcnMgKi9cbiAgcHVibGljIHN0YXRpYyBjb2xvdXJQYWxldHRlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7XG4gICAgJ29yYW5nZSc6IFsncmdiKDI1NSwxODcsMTIwKScsICdyZ2IoMjQ1LDE2NywxMDApJywgJ3JnYigyMzUsMTM3LDcwKScsICdyZ2IoMjA1LCAxMTEsIDcxKSddLFxuICAgICdhbGxfZ3JlZW4nOiBbJ3JnYig0NCwxNjAsNDQpJywgJ3JnYig3NCwxNjAsNzQpJywgJ3JnYigyMywxMDMsNTcpJywgJ3JnYigzMCwxMTAsOTYpJywgJ3JnYig2MCwxMzEsOTUpJyxcbiAgICAgICdyZ2IoMjQsMTEwLDc5KScsICdyZ2IoMTUyLDIyMywxMzgpJywgJ3JnYigxODIsIDIyMywgMTM4KScsICdyZ2IoMTUyLCAxOTMsIDEzOCknXSxcbiAgICAnYWxsX2JsdWUnOiBbJ3JnYigzMSwxMTksMTgwKScsICdyZ2IoMjMsMTkwLDIwNyknLCAncmdiKDEyMiwgMTAyLCAxODkpJywgJ3JnYigxNTgsMjE4LDIyOSknLCAncmdiKDE0MSwgMTI0LCAyMTcpJyxcbiAgICAgICdyZ2IoMzEsIDEyMCwgMTUwKSddLFxuICAgICdtYWdlbnRhJzogWydyZ2IoMTYyLDEwNiwxOTIpJywgJ3JnYigxOTcsMTY1LDIyNCknLCAncmdiKDIwOCwxMTMsMjE4KSddLFxuICAgICdyZWQnOiBbJ3JnYigyMTQsMzksNDApJywgJ3JnYigyNTUsMTUyLDE1MCknXSxcbiAgICAnc3RfYmx1ZSc6IFsncmdiKDIzLDE5MCwyMDcpJywgJ3JnYigxNTgsMjE4LDIyOSknLCAncmdiKDMxLDExOSwxODApJ10sXG4gICAgJ2RhcmtfYmx1ZSc6IFsncmdiKDMxLDExOSwxODApJywgJ3JnYigzMSwgMTIwLCAxNTApJ10sXG4gICAgJ2xpZ2h0X2JsdWUnOiBbJ3JnYigyMywxOTAsMjA3KScsICdyZ2IoMTU4LDIxOCwyMjkpJywgJ3JnYigxMDgsIDIxOCwgMjI5KScsICdyZ2IoMjMsMTkwLDIyNyknXSxcbiAgICAnbGlsYWNfYmx1ZSc6IFsncmdiKDEyNCwxMDIsMjExKScsICdyZ2IoMTQ5LDEzNCwyMTcpJywgJ3JnYig5NywgODEsIDE1MCknXSxcbiAgICAnZGFya19ncmVlbic6IFsncmdiKDIzLDEwMyw1NyknLCAncmdiKDMwLDExMCw5NiknLCAncmdiKDYwLDEzMSw5NSknLCAncmdiKDI0LDExMCw3OSknXSxcbiAgICAnZ3JlZW4nOiBbJ3JnYig0NCwxNjAsNDQpJywgJ3JnYig3NCwxNjAsNzQpJ10sXG4gICAgJ2xpZ2h0X2dyZWVuJzogWydyZ2IoMTUyLDIyMywxMzgpJywgJ3JnYigxODIsIDIyMywgMTM4KScsICdyZ2IoMTUyLCAxOTMsIDEzOCknXSxcbiAgICAnc3RfZ3JlZW4nOiBbJ3JnYig0NCwxNjAsNDQpJywgJ3JnYigxNTIsMjIzLDEzOCknLCAncmdiKDM5LCAxNzQsIDk2KScsICdyZ2IoNzQsMTYwLDc0KSddLFxuICAgICdwaW5rJzogWydyZ2IoMjQ3LDE4MiwyMTApJ10sXG4gICAgJ2Jyb3duJzogWydyZ2IoMTQwLDg2LDc1KScsICdyZ2IoMTAyLCA2MiwgNTQpJ10sXG4gICAgJ2dyYXknOiBbJ3JnYigxMjcsMTI3LDEyNyknLCAncmdiKDE5OSwxOTksMTk5KScsICdyZ2IoMTk2LDE1NiwxNDgpJywgJ3JnYigyMjIsIDIyMiwgMTgwKSddLFxuICAgICd5ZWxsb3cnOiBbJ3JnYigxODgsMTg5LDM0KSddLFxuICAgICd3aGl0ZSc6IFsncmdiKDIzMCwyMzAsMjMwKSddLFxuICB9O1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgbWFrZVBhbGV0dGUoZHQ6IFtzdHJpbmdbXSwgc3RyaW5nXVtdLFxuICAgIHNpbXBsaWZpZWQgPSBmYWxzZSwgUGFsZXR0ZVR5cGU6IHR5cGVvZiBTZXFQYWxldHRlQmFzZSA9IFNlcVBhbGV0dGVCYXNlXG4gICkge1xuICAgIGNvbnN0IHBhbGV0dGU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBkdC5mb3JFYWNoKChjcCkgPT4ge1xuICAgICAgY29uc3Qgb2JqTGlzdCA9IGNwWzBdO1xuICAgICAgY29uc3QgY29sb3VyID0gY3BbMV07XG4gICAgICBvYmpMaXN0LmZvckVhY2goKG9iaiwgaW5kKSA9PiB7XG4gICAgICAgIHBhbGV0dGVbb2JqXSA9IHRoaXMuY29sb3VyUGFsZXR0ZVtjb2xvdXJdW3NpbXBsaWZpZWQgPyAwIDogaW5kXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgUGFsZXR0ZVR5cGUocGFsZXR0ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9wYWxldHRlOiB7IFttOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICBjb25zdHJ1Y3RvcihwYWxldHRlOiB7IFttOiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIHRoaXMuX3BhbGV0dGUgPSBwYWxldHRlO1xuICB9XG5cbiAgcHVibGljIGdldChtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYWxldHRlW21dO1xuICB9XG59XG4iXX0=","import { SeqPaletteBase } from './seq-palettes';\nexport class AminoacidsPalettes extends SeqPaletteBase {\n static get Lesk() {\n if (this.lesk === void 0) {\n this.lesk = this.makePalette([\n [['G', 'A', 'S', 'T'], 'orange'],\n [['C', 'V', 'I', 'L', 'P', 'F', 'Y', 'M', 'W'], 'all_green'],\n [['N', 'Q', 'H'], 'magenta'],\n [['D', 'E'], 'red'],\n [['K', 'R'], 'all_blue'],\n ], false, AminoacidsPalettes);\n }\n return this.lesk;\n }\n static get GrokGroups() {\n if (this.grokGroups === void 0) {\n this.grokGroups = this.makePalette([\n [['C', 'U'], 'yellow'],\n [['G', 'P'], 'red'],\n [['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'], 'all_green'],\n [['R', 'H', 'K'], 'light_blue'],\n [['D', 'E'], 'dark_blue'],\n [['S', 'T', 'N', 'Q'], 'orange'],\n ], false, AminoacidsPalettes);\n }\n return this.grokGroups;\n }\n static get RasMol() {\n if (this.rasMol === void 0) {\n this.rasMol = new AminoacidsPalettes({\n // http://acces.ens-lyon.fr/biotic/rastop/help/colour.htm\n 'D': '#E60A0A',\n 'E': '#E60A0A',\n 'C': '#E6E600',\n 'M': '#E6E600',\n 'K': '#145AFF',\n 'R': '#145AFF',\n 'S': '#FA9600',\n 'T': '#FA9600',\n 'F': '#3232AA',\n 'Y': '#3232AA',\n 'N': '#00DCDC',\n 'Q': '#00DCDC',\n 'G': '#EBEBEB',\n 'L': '#0F820F',\n 'V': '#0F820F',\n 'I': '#0F820F',\n 'A': '#C8C8C8',\n 'W': '#B45AB4',\n 'H': '#8282D2',\n 'P': '#DC9682',\n 'others': '#BEA06E',\n });\n }\n return this.rasMol;\n }\n get(m) {\n const resM = m in AminoacidsPalettes.aaSynonyms ? AminoacidsPalettes.aaSynonyms[m] : m;\n const res = super.get(resM);\n return res;\n }\n}\n/** Only some of the synonyms. These were obtained from the clustered oligopeptide dataset. */\nAminoacidsPalettes.aaSynonyms = {\n 'MeNle': 'L',\n 'MeA': 'A',\n 'MeG': 'G',\n 'MeF': 'F',\n};\nexport class Aminoacids {\n static getPalette(scheme = 'grok') {\n switch (scheme) {\n case 'grok':\n return AminoacidsPalettes.GrokGroups;\n case 'lesk':\n return AminoacidsPalettes.Lesk;\n default:\n throw new Error(`ChemPalette: scheme \\`${scheme}\\` does not exist`);\n }\n }\n /**\n * Returns divided amino acid with its content in the bracket, if the content is number, then its omitted\n *\n * @param {string} c raw amino\n * @return {[string, string]} outer and inner content\n */\n static getInnerOuter(c) {\n let isInner = 0;\n let inner = '';\n let outer = '';\n for (const char of c) {\n if (char == '(')\n isInner++;\n else if (char == ')')\n isInner--;\n else if (isInner)\n inner += char;\n else\n outer += char;\n }\n return !isNaN(parseInt(inner)) ? [outer, ''] : [outer, inner];\n }\n static getColorAAPivot(monomer = '', scheme = 'grok') {\n var _a, _b, _c;\n //const chemPaletteInstance = AAPalettes.GrokGroups();\n const chemPaletteInstance = this.getPalette(scheme);\n let [outerMonomer, innerMonomer] = this.getInnerOuter(monomer);\n outerMonomer = (outerMonomer.length > 6 ? `${outerMonomer.slice(0, 3)}...` : outerMonomer);\n innerMonomer = (innerMonomer.length > 6 ? `${innerMonomer.slice(0, 3)}...` : innerMonomer);\n if (monomer.length == 1 || monomer[1] == '(') {\n const amino = (_a = monomer[0]) === null || _a === void 0 ? void 0 : _a.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 1] :\n [this.undefinedColor, outerMonomer, innerMonomer, 1];\n }\n if (monomer[0] == 'd' && monomer[1] in chemPaletteInstance) {\n if (monomer.length == 2 || monomer[2] == '(') {\n const amino = (_b = monomer[1]) === null || _b === void 0 ? void 0 : _b.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 2] :\n [this.undefinedColor, outerMonomer, innerMonomer, 2];\n }\n }\n if (monomer.substring(0, 3) in this.AAFullNames) {\n if (monomer.length == 3 || monomer[3] == '(') {\n const amino = this.AAFullNames[monomer.substring(0, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 3] :\n [this.undefinedColor, outerMonomer, innerMonomer, 3];\n }\n }\n if (((_c = monomer[0]) === null || _c === void 0 ? void 0 : _c.toLowerCase()) == monomer[0]) {\n if (monomer.substring(1, 3) in this.AAFullNames) {\n if (monomer.length == 4 || monomer[4] == '(') {\n const amino = this.AAFullNames[monomer.substring(1, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 4] :\n [this.undefinedColor, outerMonomer, innerMonomer, 4];\n }\n }\n }\n return [this.undefinedColor, outerMonomer, innerMonomer, 0];\n }\n}\nAminoacids.SemType = 'Aminoacids';\nAminoacids.SemTypeMultipleAlignment = 'AminoacidsMultipleAlignment';\nAminoacids.undefinedColor = 'rgb(100,100,100)';\nAminoacids.Names = {\n 'G': 'Glycine',\n 'L': 'Leucine',\n 'Y': 'Tyrosine',\n 'S': 'Serine',\n 'E': 'Glutamic acid',\n 'Q': 'Glutamine',\n 'D': 'Aspartic acid',\n 'N': 'Asparagine',\n 'F': 'Phenylalanine',\n 'A': 'Alanine',\n 'K': 'Lysine',\n 'R': 'Arginine',\n 'H': 'Histidine',\n 'C': 'Cysteine',\n 'V': 'Valine',\n 'P': 'Proline',\n 'W': 'Tryptophan',\n 'I': 'Isoleucine',\n 'M': 'Methionine',\n 'T': 'Threonine',\n};\nAminoacids.AASmiles = {\n 'G': 'NCC(=O)O',\n 'L': 'N[C@H](CC(C)C)C(=O)O',\n 'Y': 'NC(CC1=CC=C(O)C=C1)C(=O)O',\n 'S': 'NC(CO)C(=O)O',\n 'E': 'N[C@@H](CCC(O)=O)C(=O)O',\n 'Q': 'N[C@@H](CCC(N)=O)C(=O)O',\n 'D': 'N[C@@H](CC(O)=O)C(=O)O',\n 'N': 'N[C@@H](CC(N)=O)C(=O)O',\n 'F': 'NC(CC1=CC=CC=C1)C(=O)O',\n 'A': 'N[C@H](C)C(=O)O',\n 'K': 'NC(CCCCN)C(=O)O',\n 'R': 'N[C@H](CCCNC(=N)C)C(=O)O',\n 'H': 'NC(CC1=CN=C[N]1)C(=O)O',\n 'C': 'N[C@@H](CS)C(=O)O',\n 'V': 'NC(C(C)C)C(=O)O',\n 'P': 'N(CCC1)C1C(=O)O',\n 'W': 'N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O',\n 'I': 'N[C@H]([C@H](C)CC)C(=O)O',\n 'M': 'NC(CCSC)C(=O)O',\n 'T': 'NC(C(O)C)C(=O)O',\n};\nAminoacids.AASmilesTruncated = {\n 'G': '*C*',\n 'L': 'CC(C)C[C@H](*)*',\n 'Y': 'C1=CC(=CC=C1CC(*)*)O',\n 'S': 'OCC(*)C*',\n 'E': '*[C@@H](CCC(O)=O)*',\n 'Q': '*N[C@@H](CCC(N)=O)*',\n 'D': '*[C@@H](CC(O)=O)*',\n 'N': '*[C@@H](CC(N)=O)*',\n 'F': 'C1=CC=C(C=C1)CC(*)*',\n 'A': 'C[C@H](*)*',\n 'K': 'C(CCN)CC(*)*',\n 'R': '*[C@H](CCCNC(=N)C)*',\n 'H': 'C1=C(NC=N1)CC(*)*',\n 'C': 'C([C@@H](*)*)S',\n 'V': 'CC(C)C(*)*',\n 'P': 'C1CCN(*)C1*',\n 'W': '*[C@@H](Cc1c2ccccc2n([H])c1)*',\n 'I': 'CC[C@H](C)[C@H](*)*',\n 'M': 'CSCCC(*)*',\n 'T': 'CC(O)C(*)*',\n};\n/** TODO: Full?\n */\nAminoacids.AAFullNames = {\n 'Ala': 'A',\n 'Arg': 'R',\n 'Asn': 'N',\n 'Asp': 'D',\n 'Cys': 'C',\n 'Gln': 'Q',\n 'Glu': 'E',\n 'Gly': 'G',\n 'His': 'H',\n 'Ile': 'I',\n 'Leu': 'L',\n 'Lys': 'K',\n 'Met': 'M',\n 'Phe': 'F',\n 'Pro': 'P',\n 'Ser': 'S',\n 'Thr': 'T',\n 'Trp': 'W',\n 'Tyr': 'Y',\n 'Val': 'V',\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1pbm9hY2lkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFtaW5vYWNpZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFhLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTFELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxjQUFjO0lBRzdDLE1BQU0sS0FBSyxJQUFJO1FBQ3BCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQztnQkFDNUQsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDO2dCQUM1QixDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUM7YUFDekIsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztTQUMvQjtRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBSU0sTUFBTSxLQUFLLFVBQVU7UUFDMUIsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFDakMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUM7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QUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztDQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1N0cmluZ0RpY3Rpb25hcnl9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7U2VxUGFsZXR0ZSwgU2VxUGFsZXR0ZUJhc2V9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcblxuZXhwb3J0IGNsYXNzIEFtaW5vYWNpZHNQYWxldHRlcyBleHRlbmRzIFNlcVBhbGV0dGVCYXNlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgbGVzazogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBMZXNrKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmxlc2sgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5sZXNrID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgIFtbJ0cnLCAnQScsICdTJywgJ1QnXSwgJ29yYW5nZSddLFxuICAgICAgICBbWydDJywgJ1YnLCAnSScsICdMJywgJ1AnLCAnRicsICdZJywgJ00nLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgIFtbJ04nLCAnUScsICdIJ10sICdtYWdlbnRhJ10sXG4gICAgICAgIFtbJ0QnLCAnRSddLCAncmVkJ10sXG4gICAgICAgIFtbJ0snLCAnUiddLCAnYWxsX2JsdWUnXSxcbiAgICAgIF0sIGZhbHNlLCBBbWlub2FjaWRzUGFsZXR0ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sZXNrO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ3Jva0dyb3VwczogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBHcm9rR3JvdXBzKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmdyb2tHcm91cHMgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5ncm9rR3JvdXBzID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgIFtbJ0MnLCAnVSddLCAneWVsbG93J10sXG4gICAgICAgIFtbJ0cnLCAnUCddLCAncmVkJ10sXG4gICAgICAgIFtbJ0EnLCAnVicsICdJJywgJ0wnLCAnTScsICdGJywgJ1knLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgIFtbJ1InLCAnSCcsICdLJ10sICdsaWdodF9ibHVlJ10sXG4gICAgICAgIFtbJ0QnLCAnRSddLCAnZGFya19ibHVlJ10sXG4gICAgICAgIFtbJ1MnLCAnVCcsICdOJywgJ1EnXSwgJ29yYW5nZSddLFxuICAgICAgXSwgZmFsc2UsIEFtaW5vYWNpZHNQYWxldHRlcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdyb2tHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByYXNNb2w6IFNlcVBhbGV0dGU7XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgUmFzTW9sKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLnJhc01vbCA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLnJhc01vbCA9IG5ldyBBbWlub2FjaWRzUGFsZXR0ZXMoe1xuICAgICAgICAvLyBodHRwOi8vYWNjZXMuZW5zLWx5b24uZnIvYmlvdGljL3Jhc3RvcC9oZWxwL2NvbG91ci5odG1cbiAgICAgICAgJ0QnOiAnI0U2MEEwQScsIC8vIGFzcCwgYXNwYXJ0aWMgYWNpZCwgYXNwXG4gICAgICAgICdFJzogJyNFNjBBMEEnLCAvLyBnbHUsIGdsdXRhbWljIGFjaWRcbiAgICAgICAgJ0MnOiAnI0U2RTYwMCcsIC8vIGN5cywgY3lzdGVpbmVcbiAgICAgICAgJ00nOiAnI0U2RTYwMCcsIC8vIG1ldCwgbWV0aGlvbmluZVxuICAgICAgICAnSyc6ICcjMTQ1QUZGJywgLy8gbHlzLCBseXNpbmVcbiAgICAgICAgJ1InOiAnIzE0NUFGRicsIC8vIGFyZywgYXJnaW5pbmVcbiAgICAgICAgJ1MnOiAnI0ZBOTYwMCcsIC8vIHNlciwgc2VyaW5lXG4gICAgICAgICdUJzogJyNGQTk2MDAnLCAvLyB0aHIsIHRocmVvbmluZVxuICAgICAgICAnRic6ICcjMzIzMkFBJywgLy8gcGhlLCBwaGVueWxhbGFuaW5lXG4gICAgICAgICdZJzogJyMzMjMyQUEnLCAvLyB0eXIsIHR5cm9zaW5lXG4gICAgICAgICdOJzogJyMwMERDREMnLCAvLyBhc24sIGFzcGFyYWdpbmVcbiAgICAgICAgJ1EnOiAnIzAwRENEQycsIC8vIGdsbiwgZ2x1dGFtaW5lXG4gICAgICAgICdHJzogJyNFQkVCRUInLCAvLyBnbHksIGdseWNpbmVcbiAgICAgICAgJ0wnOiAnIzBGODIwRicsIC8vIGxldSwgbGV1Y2luZVxuICAgICAgICAnVic6ICcjMEY4MjBGJywgLy8gdmFsLCB2YWxpbmVcbiAgICAgICAgJ0knOiAnIzBGODIwRicsIC8vIGlsZSwgaXNvbGV1Y2luZVxuICAgICAgICAnQSc6ICcjQzhDOEM4JywgLy8gYWxhLCBhbGFuaW5lXG4gICAgICAgICdXJzogJyNCNDVBQjQnLCAvLyB0cnAsIHRyeXB0b3BoYW5cbiAgICAgICAgJ0gnOiAnIzgyODJEMicsIC8vIGhpcywgaGlzdGlkaW5lXG4gICAgICAgICdQJzogJyNEQzk2ODInLCAvLyBwcm8sIHByb2xpbmVcbiAgICAgICAgJ290aGVycyc6ICcjQkVBMDZFJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yYXNNb2w7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0KG06IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVzTSA9IG0gaW4gQW1pbm9hY2lkc1BhbGV0dGVzLmFhU3lub255bXMgPyBBbWlub2FjaWRzUGFsZXR0ZXMuYWFTeW5vbnltc1ttXSA6IG07XG4gICAgY29uc3QgcmVzID0gc3VwZXIuZ2V0KHJlc00pO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKiogT25seSBzb21lIG9mIHRoZSBzeW5vbnltcy4gVGhlc2Ugd2VyZSBvYnRhaW5lZCBmcm9tIHRoZSBjbHVzdGVyZWQgb2xpZ29wZXB0aWRlIGRhdGFzZXQuICovXG4gIHByaXZhdGUgc3RhdGljIGFhU3lub255bXM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICdNZU5sZSc6ICdMJywgLy8gTmxlIC0gbm9ybGV1Y2luZVxuICAgICdNZUEnOiAnQScsXG4gICAgJ01lRyc6ICdHJyxcbiAgICAnTWVGJzogJ0YnLFxuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgQW1pbm9hY2lkcyB7XG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlOiBzdHJpbmcgPSAnQW1pbm9hY2lkcyc7XG5cbiAgc3RhdGljIHJlYWRvbmx5IFNlbVR5cGVNdWx0aXBsZUFsaWdubWVudDogc3RyaW5nID0gJ0FtaW5vYWNpZHNNdWx0aXBsZUFsaWdubWVudCc7XG5cbiAgc3RhdGljIHVuZGVmaW5lZENvbG9yID0gJ3JnYigxMDAsMTAwLDEwMCknO1xuXG4gIHB1YmxpYyBzdGF0aWMgTmFtZXM6IFN0cmluZ0RpY3Rpb25hcnkgPSB7XG4gICAgJ0cnOiAnR2x5Y2luZScsXG4gICAgJ0wnOiAnTGV1Y2luZScsXG4gICAgJ1knOiAnVHlyb3NpbmUnLFxuICAgICdTJzogJ1NlcmluZScsXG4gICAgJ0UnOiAnR2x1dGFtaWMgYWNpZCcsXG4gICAgJ1EnOiAnR2x1dGFtaW5lJyxcbiAgICAnRCc6ICdBc3BhcnRpYyBhY2lkJyxcbiAgICAnTic6ICdBc3BhcmFnaW5lJyxcbiAgICAnRic6ICdQaGVueWxhbGFuaW5lJyxcbiAgICAnQSc6ICdBbGFuaW5lJyxcbiAgICAnSyc6ICdMeXNpbmUnLFxuICAgICdSJzogJ0FyZ2luaW5lJyxcbiAgICAnSCc6ICdIaXN0aWRpbmUnLFxuICAgICdDJzogJ0N5c3RlaW5lJyxcbiAgICAnVic6ICdWYWxpbmUnLFxuICAgICdQJzogJ1Byb2xpbmUnLFxuICAgICdXJzogJ1RyeXB0b3BoYW4nLFxuICAgICdJJzogJ0lzb2xldWNpbmUnLFxuICAgICdNJzogJ01ldGhpb25pbmUnLFxuICAgICdUJzogJ1RocmVvbmluZScsXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBBQVNtaWxlczogU3RyaW5nRGljdGlvbmFyeSA9IHtcbiAgICAnRyc6ICdOQ0MoPU8pTycsXG4gICAgJ0wnOiAnTltDQEhdKENDKEMpQylDKD1PKU8nLFxuICAgICdZJzogJ05DKENDMT1DQz1DKE8pQz1DMSlDKD1PKU8nLFxuICAgICdTJzogJ05DKENPKUMoPU8pTycsXG4gICAgJ0UnOiAnTltDQEBIXShDQ0MoTyk9TylDKD1PKU8nLFxuICAgICdRJzogJ05bQ0BASF0oQ0NDKE4pPU8pQyg9TylPJyxcbiAgICAnRCc6ICdOW0NAQEhdKENDKE8pPU8pQyg9TylPJyxcbiAgICAnTic6ICdOW0NAQEhdKENDKE4pPU8pQyg9TylPJyxcbiAgICAnRic6ICdOQyhDQzE9Q0M9Q0M9QzEpQyg9TylPJyxcbiAgICAnQSc6ICdOW0NASF0oQylDKD1PKU8nLFxuICAgICdLJzogJ05DKENDQ0NOKUMoPU8pTycsXG4gICAgJ1InOiAnTltDQEhdKENDQ05DKD1OKUMpQyg9TylPJyxcbiAgICAnSCc6ICdOQyhDQzE9Q049Q1tOXTEpQyg9TylPJyxcbiAgICAnQyc6ICdOW0NAQEhdKENTKUMoPU8pTycsXG4gICAgJ1YnOiAnTkMoQyhDKUMpQyg9TylPJyxcbiAgICAnUCc6ICdOKENDQzEpQzFDKD1PKU8nLFxuICAgICdXJzogJ05bQ0BASF0oQ2MxYzJjY2NjYzJuKFtIXSljMSlDKD1PKU8nLFxuICAgICdJJzogJ05bQ0BIXShbQ0BIXShDKUNDKUMoPU8pTycsXG4gICAgJ00nOiAnTkMoQ0NTQylDKD1PKU8nLFxuICAgICdUJzogJ05DKEMoTylDKUMoPU8pTycsXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBBQVNtaWxlc1RydW5jYXRlZDogU3RyaW5nRGljdGlvbmFyeSA9IHtcbiAgICAnRyc6ICcqQyonLFxuICAgICdMJzogJ0NDKEMpQ1tDQEhdKCopKicsXG4gICAgJ1knOiAnQzE9Q0MoPUNDPUMxQ0MoKikqKU8nLFxuICAgICdTJzogJ09DQygqKUMqJyxcbiAgICAnRSc6ICcqW0NAQEhdKENDQyhPKT1PKSonLFxuICAgICdRJzogJypOW0NAQEhdKENDQyhOKT1PKSonLFxuICAgICdEJzogJypbQ0BASF0oQ0MoTyk9TykqJyxcbiAgICAnTic6ICcqW0NAQEhdKENDKE4pPU8pKicsXG4gICAgJ0YnOiAnQzE9Q0M9QyhDPUMxKUNDKCopKicsXG4gICAgJ0EnOiAnQ1tDQEhdKCopKicsXG4gICAgJ0snOiAnQyhDQ04pQ0MoKikqJyxcbiAgICAnUic6ICcqW0NASF0oQ0NDTkMoPU4pQykqJyxcbiAgICAnSCc6ICdDMT1DKE5DPU4xKUNDKCopKicsXG4gICAgJ0MnOiAnQyhbQ0BASF0oKikqKVMnLFxuICAgICdWJzogJ0NDKEMpQygqKSonLFxuICAgICdQJzogJ0MxQ0NOKCopQzEqJyxcbiAgICAnVyc6ICcqW0NAQEhdKENjMWMyY2NjY2MybihbSF0pYzEpKicsXG4gICAgJ0knOiAnQ0NbQ0BIXShDKVtDQEhdKCopKicsXG4gICAgJ00nOiAnQ1NDQ0MoKikqJyxcbiAgICAnVCc6ICdDQyhPKUMoKikqJyxcbiAgfTtcblxuICAvKiogVE9ETzogRnVsbD9cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgQUFGdWxsTmFtZXM6IFN0cmluZ0RpY3Rpb25hcnkgPSB7XG4gICAgJ0FsYSc6ICdBJyxcbiAgICAnQXJnJzogJ1InLFxuICAgICdBc24nOiAnTicsXG4gICAgJ0FzcCc6ICdEJyxcbiAgICAnQ3lzJzogJ0MnLFxuICAgICdHbG4nOiAnUScsXG4gICAgJ0dsdSc6ICdFJyxcbiAgICAnR2x5JzogJ0cnLFxuICAgICdIaXMnOiAnSCcsXG4gICAgJ0lsZSc6ICdJJyxcbiAgICAnTGV1JzogJ0wnLFxuICAgICdMeXMnOiAnSycsXG4gICAgJ01ldCc6ICdNJyxcbiAgICAnUGhlJzogJ0YnLFxuICAgICdQcm8nOiAnUCcsXG4gICAgJ1Nlcic6ICdTJyxcbiAgICAnVGhyJzogJ1QnLFxuICAgICdUcnAnOiAnVycsXG4gICAgJ1R5cic6ICdZJyxcbiAgICAnVmFsJzogJ1YnLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0UGFsZXR0ZShzY2hlbWU6IHN0cmluZyA9ICdncm9rJyk6IFNlcVBhbGV0dGUge1xuICAgIHN3aXRjaCAoc2NoZW1lKSB7XG4gICAgY2FzZSAnZ3Jvayc6XG4gICAgICByZXR1cm4gQW1pbm9hY2lkc1BhbGV0dGVzLkdyb2tHcm91cHM7XG4gICAgY2FzZSAnbGVzayc6XG4gICAgICByZXR1cm4gQW1pbm9hY2lkc1BhbGV0dGVzLkxlc2s7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hlbVBhbGV0dGU6IHNjaGVtZSBcXGAke3NjaGVtZX1cXGAgZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBkaXZpZGVkIGFtaW5vIGFjaWQgd2l0aCBpdHMgY29udGVudCBpbiB0aGUgYnJhY2tldCwgaWYgdGhlIGNvbnRlbnQgaXMgbnVtYmVyLCB0aGVuIGl0cyBvbWl0dGVkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjIHJhdyBhbWlub1xuICAgKiBAcmV0dXJuIHtbc3RyaW5nLCBzdHJpbmddfSBvdXRlciBhbmQgaW5uZXIgY29udGVudFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRJbm5lck91dGVyKGM6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGxldCBpc0lubmVyID0gMDtcbiAgICBsZXQgaW5uZXIgPSAnJztcbiAgICBsZXQgb3V0ZXIgPSAnJztcblxuICAgIGZvciAoY29uc3QgY2hhciBvZiBjKSB7XG4gICAgICBpZiAoY2hhciA9PSAnKCcpXG4gICAgICAgIGlzSW5uZXIrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT0gJyknKVxuICAgICAgICBpc0lubmVyLS07XG4gICAgICBlbHNlIGlmIChpc0lubmVyKVxuICAgICAgICBpbm5lciArPSBjaGFyO1xuICAgICAgZWxzZVxuICAgICAgICBvdXRlciArPSBjaGFyO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOYU4ocGFyc2VJbnQoaW5uZXIpKSA/IFtvdXRlciwgJyddIDogW291dGVyLCBpbm5lcl07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldENvbG9yQUFQaXZvdChtb25vbWVyOiBzdHJpbmcgPSAnJywgc2NoZW1lOiAnZ3JvaycgPSAnZ3JvaycpOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgbnVtYmVyXSB7XG4gICAgLy9jb25zdCBjaGVtUGFsZXR0ZUluc3RhbmNlID0gQUFQYWxldHRlcy5Hcm9rR3JvdXBzKCk7XG4gICAgY29uc3QgY2hlbVBhbGV0dGVJbnN0YW5jZSA9IHRoaXMuZ2V0UGFsZXR0ZShzY2hlbWUpO1xuICAgIGxldCBbb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXJdID0gdGhpcy5nZXRJbm5lck91dGVyKG1vbm9tZXIpO1xuICAgIG91dGVyTW9ub21lciA9IChvdXRlck1vbm9tZXIubGVuZ3RoID4gNiA/IGAke291dGVyTW9ub21lci5zbGljZSgwLCAzKX0uLi5gIDogb3V0ZXJNb25vbWVyKTtcbiAgICBpbm5lck1vbm9tZXIgPSAoaW5uZXJNb25vbWVyLmxlbmd0aCA+IDYgPyBgJHtpbm5lck1vbm9tZXIuc2xpY2UoMCwgMyl9Li4uYCA6IGlubmVyTW9ub21lcik7XG5cbiAgICBpZiAobW9ub21lci5sZW5ndGggPT0gMSB8fCBtb25vbWVyWzFdID09ICcoJykge1xuICAgICAgY29uc3QgYW1pbm8gPSBtb25vbWVyWzBdPy50b1VwcGVyQ2FzZSgpITtcbiAgICAgIHJldHVybiBhbWlubyBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlID9cbiAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgMV0gOlxuICAgICAgICBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDFdO1xuICAgIH1cblxuICAgIGlmIChtb25vbWVyWzBdID09ICdkJyAmJiBtb25vbWVyWzFdISBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlKSB7XG4gICAgICBpZiAobW9ub21lci5sZW5ndGggPT0gMiB8fCBtb25vbWVyWzJdID09ICcoJykge1xuICAgICAgICBjb25zdCBhbWlubyA9IG1vbm9tZXJbMV0/LnRvVXBwZXJDYXNlKCkhO1xuICAgICAgICByZXR1cm4gYW1pbm8gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSA/XG4gICAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgMl0gOlxuICAgICAgICAgIFt0aGlzLnVuZGVmaW5lZENvbG9yLCBvdXRlck1vbm9tZXIsIGlubmVyTW9ub21lciwgMl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vbm9tZXIuc3Vic3RyaW5nKDAsIDMpIGluIHRoaXMuQUFGdWxsTmFtZXMpIHtcbiAgICAgIGlmIChtb25vbWVyLmxlbmd0aCA9PSAzIHx8IG1vbm9tZXJbM10gPT0gJygnKSB7XG4gICAgICAgIGNvbnN0IGFtaW5vID0gdGhpcy5BQUZ1bGxOYW1lc1ttb25vbWVyLnN1YnN0cmluZygwLCAzKV07XG4gICAgICAgIHJldHVybiBhbWlubyBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlID9cbiAgICAgICAgICBbY2hlbVBhbGV0dGVJbnN0YW5jZS5nZXQoYW1pbm8pLCBhbWlubywgaW5uZXJNb25vbWVyLCAzXSA6XG4gICAgICAgICAgW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCAzXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9ub21lclswXT8udG9Mb3dlckNhc2UoKSA9PSBtb25vbWVyWzBdKSB7XG4gICAgICBpZiAobW9ub21lci5zdWJzdHJpbmcoMSwgMykgaW4gdGhpcy5BQUZ1bGxOYW1lcykge1xuICAgICAgICBpZiAobW9ub21lci5sZW5ndGggPT0gNCB8fCBtb25vbWVyWzRdID09ICcoJykge1xuICAgICAgICAgIGNvbnN0IGFtaW5vID0gdGhpcy5BQUZ1bGxOYW1lc1ttb25vbWVyLnN1YnN0cmluZygxLCAzKV07XG4gICAgICAgICAgcmV0dXJuIGFtaW5vIGluIGNoZW1QYWxldHRlSW5zdGFuY2UgP1xuICAgICAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgNF0gOlxuICAgICAgICAgICAgW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCA0XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDBdO1xuICB9XG59XG4iXX0=","import { SeqPaletteBase } from './seq-palettes';\nexport class NucleotidesPalettes extends SeqPaletteBase {\n static get Chromatogram() {\n if (this.chromatogram === void 0) {\n this.chromatogram = new NucleotidesPalettes({\n 'A': 'green',\n 'C': 'blue',\n 'G': 'black',\n 'T': 'red',\n 'U': 'red',\n 'others': 'gray',\n });\n }\n return this.chromatogram;\n }\n}\nexport class Nucleotides {\n}\nNucleotides.SemType = 'Nucleotides';\nNucleotides.SemTypeMultipleAlignment = 'NucleotidesMultipleAlignment';\nNucleotides.Names = {\n 'A': 'Adenine',\n 'C': 'Cytosine',\n 'G': 'Guanine',\n 'T': 'Thymine',\n 'U': 'Uracil',\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGVvdGlkZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJudWNsZW90aWRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQWEsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGNBQWM7SUFHOUMsTUFBTSxLQUFLLFlBQVk7UUFDNUIsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQztnQkFDMUMsR0FBRyxFQUFFLE9BQU87Z0JBQ1osR0FBRyxFQUFFLE1BQU07Z0JBQ1gsR0FBRyxFQUFFLE9BQU87Z0JBQ1osR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsUUFBUSxFQUFFLE1BQU07YUFDakIsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFdBQVc7O0FBQ04sbUJBQU8sR0FBVyxhQUFhLENBQUM7QUFFaEMsb0NBQXdCLEdBQVcsOEJBQThCLENBQUM7QUFFcEUsaUJBQUssR0FBcUI7SUFDdEMsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsVUFBVTtJQUNmLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsUUFBUTtDQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1N0cmluZ0RpY3Rpb25hcnl9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7U2VxUGFsZXR0ZSwgU2VxUGFsZXR0ZUJhc2V9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcblxuZXhwb3J0IGNsYXNzIE51Y2xlb3RpZGVzUGFsZXR0ZXMgZXh0ZW5kcyBTZXFQYWxldHRlQmFzZSB7XG4gIHByaXZhdGUgc3RhdGljIGNocm9tYXRvZ3JhbTogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBDaHJvbWF0b2dyYW0oKTogU2VxUGFsZXR0ZSB7XG4gICAgaWYgKHRoaXMuY2hyb21hdG9ncmFtID09PSB2b2lkIDApIHtcbiAgICAgIHRoaXMuY2hyb21hdG9ncmFtID0gbmV3IE51Y2xlb3RpZGVzUGFsZXR0ZXMoe1xuICAgICAgICAnQSc6ICdncmVlbicsXG4gICAgICAgICdDJzogJ2JsdWUnLFxuICAgICAgICAnRyc6ICdibGFjaycsIC8vIG9yYW5nZSA/XG4gICAgICAgICdUJzogJ3JlZCcsXG4gICAgICAgICdVJzogJ3JlZCcsXG4gICAgICAgICdvdGhlcnMnOiAnZ3JheScsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hyb21hdG9ncmFtO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOdWNsZW90aWRlcyB7XG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlOiBzdHJpbmcgPSAnTnVjbGVvdGlkZXMnO1xuXG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlTXVsdGlwbGVBbGlnbm1lbnQ6IHN0cmluZyA9ICdOdWNsZW90aWRlc011bHRpcGxlQWxpZ25tZW50JztcblxuICBwdWJsaWMgc3RhdGljIE5hbWVzOiBTdHJpbmdEaWN0aW9uYXJ5ID0ge1xuICAgICdBJzogJ0FkZW5pbmUnLFxuICAgICdDJzogJ0N5dG9zaW5lJyxcbiAgICAnRyc6ICdHdWFuaW5lJyxcbiAgICAnVCc6ICdUaHltaW5lJyxcbiAgICAnVSc6ICdVcmFjaWwnLFxuICB9O1xufVxuIl19","import * as DG from 'datagrok-api/dg';\n/** makes the color less white, makes the transparency effect always perceptible\n * @param {string} color x coordinate.\n * */\nfunction correctColor(color) {\n if (color == null)\n return 'rgb(100,100,100)';\n const dgColor = DG.Color.fromHtml(color);\n const g = DG.Color.g(dgColor);\n const r = DG.Color.r(dgColor);\n const b = DG.Color.b(dgColor);\n // calculate euclidean distance to white\n const distToBlack = Math.sqrt(Math.pow(0 - r, 2) + Math.pow(0 - g, 2) + Math.pow(0 - b, 2));\n // normalize vector r g b\n const normR = r / distToBlack;\n const normG = g / distToBlack;\n const normB = b / distToBlack;\n if (distToBlack > 210) {\n return `rgb(${normR * 210},${normG * 210},${normB * 210})`;\n }\n return DG.Color.toRgb(dgColor);\n}\nexport class StringUtils {\n static hashCode(s) {\n let hash = 0;\n if (s.length === 0)\n return hash;\n for (let i = 0; i < s.length; i++) {\n const chr = s.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n }\n}\nimport { SeqPaletteBase } from './seq-palettes';\nexport class UnknownSeqPalette {\n}\nexport class GrayAllPalette extends UnknownSeqPalette {\n get(m) {\n return '#666666';\n }\n}\nexport class UnknownColorPalette extends UnknownSeqPalette {\n static buildPalette() {\n const res = [].concat(...Object.values(SeqPaletteBase.colourPalette));\n return res;\n }\n get(m) {\n const hash = StringUtils.hashCode(m);\n const pI = hash % UnknownColorPalette.palette.length;\n return correctColor(UnknownColorPalette.palette[pI]);\n }\n}\nUnknownColorPalette.palette = UnknownColorPalette.buildPalette();\nexport class UnknownSeqPalettes extends SeqPaletteBase {\n static get Gray() {\n if (this.gray === void 0)\n this.gray = new GrayAllPalette();\n return this.gray;\n }\n static get Color() {\n if (this.color === void 0)\n this.color = new UnknownColorPalette();\n return this.color;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5rbm93bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInVua25vd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0Qzs7S0FFSztBQUNMLFNBQVMsWUFBWSxDQUFDLEtBQW9CO0lBQ3hDLElBQUksS0FBSyxJQUFJLElBQUk7UUFDZixPQUFPLGtCQUFrQixDQUFDO0lBRTVCLE1BQU0sT0FBTyxHQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLHdDQUF3QztJQUN4QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUYseUJBQXlCO0lBQ3pCLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQztJQUM5QixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDO0lBQzlCLElBQUksV0FBVyxHQUFHLEdBQUcsRUFBRTtRQUNyQixPQUFPLE9BQU8sS0FBSyxHQUFHLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQztLQUM1RDtJQUNELE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVELE1BQU0sT0FBTyxXQUFXO0lBQ2YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFTO1FBQzlCLElBQUksSUFBSSxHQUFXLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQztRQUNkLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLE1BQU0sR0FBRyxHQUFXLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2xDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQywyQkFBMkI7U0FDdkM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQUVELE9BQU8sRUFBYSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxRCxNQUFNLE9BQWdCLGlCQUFpQjtDQUV0QztBQUVELE1BQU0sT0FBTyxjQUFlLFNBQVEsaUJBQWlCO0lBQzVDLEdBQUcsQ0FBQyxDQUFTO1FBQ2xCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQUdELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxpQkFBaUI7SUFHaEQsTUFBTSxDQUFDLFlBQVk7UUFDekIsTUFBTSxHQUFHLEdBQUksRUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDcEYsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sR0FBRyxDQUFDLENBQVM7UUFDbEIsTUFBTSxJQUFJLEdBQVcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxNQUFNLEVBQUUsR0FBRyxJQUFJLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNyRCxPQUFPLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDOztBQVhhLDJCQUFPLEdBQWEsbUJBQW1CLENBQUMsWUFBWSxFQUFFLENBQUM7QUFjdkUsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGNBQWM7SUFHN0MsTUFBTSxLQUFLLElBQUk7UUFDcEIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFJTSxNQUFNLEtBQUssS0FBSztRQUNyQixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG4vKiogbWFrZXMgdGhlIGNvbG9yIGxlc3Mgd2hpdGUsIG1ha2VzIHRoZSB0cmFuc3BhcmVuY3kgZWZmZWN0IGFsd2F5cyBwZXJjZXB0aWJsZVxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIHggY29vcmRpbmF0ZS5cbiAqICovXG5mdW5jdGlvbiBjb3JyZWN0Q29sb3IoY29sb3I6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICBpZiAoY29sb3IgPT0gbnVsbClcbiAgICByZXR1cm4gJ3JnYigxMDAsMTAwLDEwMCknO1xuXG4gIGNvbnN0IGRnQ29sb3I6IG51bWJlciA9IERHLkNvbG9yLmZyb21IdG1sKGNvbG9yKTtcbiAgY29uc3QgZyA9IERHLkNvbG9yLmcoZGdDb2xvcik7XG4gIGNvbnN0IHIgPSBERy5Db2xvci5yKGRnQ29sb3IpO1xuICBjb25zdCBiID0gREcuQ29sb3IuYihkZ0NvbG9yKTtcbiAgLy8gY2FsY3VsYXRlIGV1Y2xpZGVhbiBkaXN0YW5jZSB0byB3aGl0ZVxuICBjb25zdCBkaXN0VG9CbGFjayA9IE1hdGguc3FydChNYXRoLnBvdygwIC0gciwgMikgKyBNYXRoLnBvdygwIC0gZywgMikgKyBNYXRoLnBvdygwIC0gYiwgMikpO1xuICAvLyBub3JtYWxpemUgdmVjdG9yIHIgZyBiXG4gIGNvbnN0IG5vcm1SID0gciAvIGRpc3RUb0JsYWNrO1xuICBjb25zdCBub3JtRyA9IGcgLyBkaXN0VG9CbGFjaztcbiAgY29uc3Qgbm9ybUIgPSBiIC8gZGlzdFRvQmxhY2s7XG4gIGlmIChkaXN0VG9CbGFjayA+IDIxMCkge1xuICAgIHJldHVybiBgcmdiKCR7bm9ybVIgKiAyMTB9LCR7bm9ybUcgKiAyMTB9LCR7bm9ybUIgKiAyMTB9KWA7XG4gIH1cbiAgcmV0dXJuIERHLkNvbG9yLnRvUmdiKGRnQ29sb3IpO1xufVxuXG5leHBvcnQgY2xhc3MgU3RyaW5nVXRpbHMge1xuICBwdWJsaWMgc3RhdGljIGhhc2hDb2RlKHM6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IGhhc2g6IG51bWJlciA9IDA7XG4gICAgaWYgKHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIGhhc2g7XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNocjogbnVtYmVyID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgY2hyO1xuICAgICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgICB9XG4gICAgcmV0dXJuIGhhc2g7XG4gIH1cbn1cblxuaW1wb3J0IHtTZXFQYWxldHRlLCBTZXFQYWxldHRlQmFzZX0gZnJvbSAnLi9zZXEtcGFsZXR0ZXMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVW5rbm93blNlcVBhbGV0dGUgaW1wbGVtZW50cyBTZXFQYWxldHRlIHtcbiAgcHVibGljIGFic3RyYWN0IGdldChtOiBzdHJpbmcpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBHcmF5QWxsUGFsZXR0ZSBleHRlbmRzIFVua25vd25TZXFQYWxldHRlIHtcbiAgcHVibGljIGdldChtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAnIzY2NjY2Nic7XG4gIH1cbn1cblxuXG5leHBvcnQgY2xhc3MgVW5rbm93bkNvbG9yUGFsZXR0ZSBleHRlbmRzIFVua25vd25TZXFQYWxldHRlIHtcbiAgcHVibGljIHN0YXRpYyBwYWxldHRlOiBzdHJpbmdbXSA9IFVua25vd25Db2xvclBhbGV0dGUuYnVpbGRQYWxldHRlKCk7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRQYWxldHRlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXMgPSAoW10gYXMgc3RyaW5nW10pLmNvbmNhdCguLi5PYmplY3QudmFsdWVzKFNlcVBhbGV0dGVCYXNlLmNvbG91clBhbGV0dGUpKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHVibGljIGdldChtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhhc2g6IG51bWJlciA9IFN0cmluZ1V0aWxzLmhhc2hDb2RlKG0pO1xuICAgIGNvbnN0IHBJID0gaGFzaCAlIFVua25vd25Db2xvclBhbGV0dGUucGFsZXR0ZS5sZW5ndGg7XG4gICAgcmV0dXJuIGNvcnJlY3RDb2xvcihVbmtub3duQ29sb3JQYWxldHRlLnBhbGV0dGVbcEldKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5rbm93blNlcVBhbGV0dGVzIGV4dGVuZHMgU2VxUGFsZXR0ZUJhc2Uge1xuICBwcml2YXRlIHN0YXRpYyBncmF5OiBTZXFQYWxldHRlO1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEdyYXkoKTogU2VxUGFsZXR0ZSB7XG4gICAgaWYgKHRoaXMuZ3JheSA9PT0gdm9pZCAwKVxuICAgICAgdGhpcy5ncmF5ID0gbmV3IEdyYXlBbGxQYWxldHRlKCk7XG4gICAgcmV0dXJuIHRoaXMuZ3JheTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNvbG9yOiBTZXFQYWxldHRlO1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IENvbG9yKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmNvbG9yID09PSB2b2lkIDApXG4gICAgICB0aGlzLmNvbG9yID0gbmV3IFVua25vd25Db2xvclBhbGV0dGUoKTtcbiAgICByZXR1cm4gdGhpcy5jb2xvcjtcbiAgfVxufVxuIl19","import * as DG from 'datagrok-api/dg';\nimport { detectAlphabet, getSplitterForColumn, getStats, splitterAsFasta } from './macromolecule';\n/** Class for handling notation units in Macromolecule columns */\nexport class UnitsHandler {\n static setUnitsToFastaColumn(col) {\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error('Fasta column must be MACROMOLECULE');\n const stats = getStats(col, 5, splitterAsFasta);\n const aligned = stats.sameLength ? 'SEQ.MSA' : 'SEQ';\n const alphabet = detectAlphabet(stats);\n col.setTag(DG.TAGS.UNITS, \"fasta\" /* NOTATION.FASTA */);\n col.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n col.setTag(\"alphabet\" /* TAGS.alphabet */, alphabet);\n }\n get units() { return this._units; }\n get column() { return this._column; }\n get notation() { return this._notation; }\n get defaultGapSymbol() { return this._defaultGapSymbol; }\n get separator() {\n var _a;\n const separator = (_a = this.column.getTag(\"separator\" /* TAGS.separator */)) !== null && _a !== void 0 ? _a : undefined;\n if (this.notation === \"separator\" /* NOTATION.SEPARATOR */ && separator === undefined)\n throw new Error(`Separator is mandatory for column '${this.column.name}' of notation '${this.notation}'.`);\n return separator;\n }\n get aligned() {\n const aligned = this.column.getTag(\"aligned\" /* TAGS.aligned */);\n // TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n if (!aligned && (this.isFasta() || this.isSeparator()))\n throw new Error('Tag aligned not set');\n return aligned;\n }\n /** Alphabet name (upper case) */\n get alphabet() {\n const alphabet = this.column.getTag(\"alphabet\" /* TAGS.alphabet */);\n // TAGS.alphabet is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n if (!alphabet && (this.isFasta() || this.isSeparator()))\n throw new Error('Tag alphabet not set');\n return alphabet;\n }\n getAlphabetSize() {\n if (this.notation == \"helm\" /* NOTATION.HELM */ || this.alphabet == \"UN\" /* ALPHABET.UN */) {\n const alphabetSizeStr = this.column.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n let alphabetSize;\n if (alphabetSizeStr) {\n alphabetSize = parseInt(alphabetSizeStr);\n }\n else {\n // calculate alphabetSize on demand\n const splitter = getSplitterForColumn(this.column);\n const stats = getStats(this.column, 1, splitter);\n alphabetSize = Object.keys(stats.freq).length;\n }\n return alphabetSize;\n }\n else {\n switch (this.alphabet) {\n case \"PT\" /* ALPHABET.PT */:\n return 20;\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return 4;\n case 'NT':\n console.warn(`Unexpected alphabet 'NT'.`);\n return 4;\n default:\n throw new Error(`Unexpected alphabet '${this.alphabet}'.`);\n }\n }\n }\n getAlphabetIsMultichar() {\n if (this.notation == \"helm\" /* NOTATION.HELM */ || this.alphabet == \"UN\" /* ALPHABET.UN */)\n return this.column.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */) == 'true';\n else\n return false;\n }\n isFasta() { return this.notation === \"fasta\" /* NOTATION.FASTA */; }\n isSeparator() { return this.notation === \"separator\" /* NOTATION.SEPARATOR */; }\n isHelm() { return this.notation === \"helm\" /* NOTATION.HELM */; }\n isRna() { return this.alphabet === \"RNA\" /* ALPHABET.RNA */; }\n isDna() { return this.alphabet === \"DNA\" /* ALPHABET.DNA */; }\n isPeptide() { return this.alphabet === \"PT\" /* ALPHABET.PT */; }\n isMsa() { return this.aligned ? this.aligned.toUpperCase().includes('MSA') : false; }\n /** Associate notation types with the corresponding units */\n /**\n * @return {NOTATION} Notation associated with the units type\n */\n getNotation() {\n if (this.units.toLowerCase().startsWith(\"fasta\" /* NOTATION.FASTA */))\n return \"fasta\" /* NOTATION.FASTA */;\n else if (this.units.toLowerCase().startsWith(\"separator\" /* NOTATION.SEPARATOR */))\n return \"separator\" /* NOTATION.SEPARATOR */;\n else if (this.units.toLowerCase().startsWith(\"helm\" /* NOTATION.HELM */))\n return \"helm\" /* NOTATION.HELM */;\n else\n throw new Error(`Column '${this.column.name}' has unexpected notation '${this.units}'.`);\n }\n /**\n * Create a new empty column of the specified notation type and the same\n * length as column\n *\n * @param {NOTATION} targetNotation\n * @return {DG.Column}\n */\n getNewColumn(targetNotation) {\n const col = this.column;\n const len = col.length;\n const name = targetNotation.toLowerCase() + '(' + col.name + ')';\n const newColName = col.dataFrame.columns.getUnusedName(name);\n const newColumn = DG.Column.fromList('string', newColName, new Array(len).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, targetNotation);\n newColumn.setTag(DG.TAGS.CELL_RENDERER, 'Macromolecule');\n const srcAligned = col.getTag(\"aligned\" /* TAGS.aligned */);\n if (srcAligned)\n newColumn.setTag(\"aligned\" /* TAGS.aligned */, srcAligned);\n const srcAlphabet = col.getTag(\"alphabet\" /* TAGS.alphabet */);\n if (srcAlphabet)\n newColumn.setTag(\"alphabet\" /* TAGS.alphabet */, srcAlphabet);\n let srcAlphabetSize = col.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n if (srcAlphabetSize)\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n const srcAlphabetIsMultichar = col.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */);\n if (srcAlphabetIsMultichar !== undefined)\n newColumn.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, srcAlphabetIsMultichar);\n if (targetNotation == \"helm\" /* NOTATION.HELM */) {\n srcAlphabetSize = this.getAlphabetSize().toString();\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n }\n return newColumn;\n }\n /**\n * Create a new empty column using templateCol as a template\n *\n * @param {DG.Column} templateCol the properties and units of this column are used as a\n * template to build the new one\n * @return {DG.Column}\n */\n static getNewColumn(templateCol) {\n const col = new UnitsHandler(templateCol);\n const targetNotation = col.notation;\n return col.getNewColumn(targetNotation);\n }\n /**\n * A helper function checking the validity of the 'units' string\n *\n * @param {string} units the string to be validated\n * @return {boolean}\n */\n static unitsStringIsValid(units) {\n units = units.toLowerCase();\n const prefixes = [\"fasta\" /* NOTATION.FASTA */, \"separator\" /* NOTATION.SEPARATOR */, \"helm\" /* NOTATION.HELM */];\n const postfixes = ['rna', 'dna', 'pt'];\n const prefixCriterion = prefixes.some((p) => units.startsWith(p.toLowerCase()));\n return prefixCriterion;\n }\n /**\n * Construct a new column of semantic type MACROMOLECULE from the list of\n * specified parameters\n *\n * @param {number} len the length of the new column\n * @param {string} name the name of the new column\n * @param {string} units the units of the new column\n * @return {DG.Column}\n */\n static getNewColumnFromParams(len, name, units) {\n // WARNING: in this implementation is is impossible to verify the uniqueness\n // of the new column's name\n // TODO: verify the validity of units parameter\n if (!UnitsHandler.unitsStringIsValid(units))\n throw new Error('Invalid format of \\'units\\' parameter');\n const newColumn = DG.Column.fromList('string', name, new Array(len).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, units);\n return newColumn;\n }\n constructor(col) {\n this._column = col;\n const units = this._column.tags[DG.TAGS.UNITS];\n if (units !== null)\n this._units = units;\n else\n throw new Error('Units are not specified in column');\n this._notation = this.getNotation();\n this._defaultGapSymbol = (this.isFasta()) ? UnitsHandler._defaultGapSymbolsDict.FASTA :\n (this.isHelm()) ? UnitsHandler._defaultGapSymbolsDict.HELM :\n UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n if (!this.column.tags.has(\"aligned\" /* TAGS.aligned */)) {\n if (this.isFasta() || this.isSeparator())\n throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +\n `tag '${\"aligned\" /* TAGS.aligned */}' is mandatory.`);\n }\n // if (!this.column.tags.has(TAGS.alphabetSize)) {\n // if (this.isHelm())\n // throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +\n // `tag '${TAGS.alphabetSize}' is mandatory.`);\n // else if (['UN'].includes(this.alphabet))\n // throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +\n // `tag '${TAGS.alphabetSize}' is mandatory.`);\n // }\n if (!this.column.tags.has(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */)) {\n if (this.isHelm())\n throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +\n `tag '${\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */}' is mandatory.`);\n else if (['UN'].includes(this.alphabet))\n throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +\n `tag '${\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */}' is mandatory.`);\n }\n }\n}\nUnitsHandler._defaultGapSymbolsDict = {\n HELM: '*',\n SEPARATOR: '',\n FASTA: '-',\n};\nUnitsHandler.PeptideFastaAlphabet = new Set([\n 'G', 'L', 'Y', 'S', 'E', 'Q', 'D', 'N', 'F', 'A',\n 'K', 'R', 'H', 'C', 'V', 'P', 'W', 'I', 'M', 'T',\n]);\nUnitsHandler.DnaFastaAlphabet = new Set(['A', 'C', 'G', 'T']);\nUnitsHandler.RnaFastaAlphabet = new Set(['A', 'C', 'G', 'U']);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdHMtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInVuaXRzLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0QyxPQUFPLEVBRUwsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixRQUFRLEVBR1IsZUFBZSxFQUdoQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLGlFQUFpRTtBQUNqRSxNQUFNLE9BQU8sWUFBWTtJQWtCaEIsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQWM7UUFDaEQsSUFBSSxHQUFHLENBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYTtZQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFFeEQsTUFBTSxLQUFLLEdBQWdCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzdELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3JELE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV2QyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSywrQkFBaUIsQ0FBQztRQUMxQyxHQUFHLENBQUMsTUFBTSwrQkFBZSxPQUFPLENBQUMsQ0FBQztRQUNsQyxHQUFHLENBQUMsTUFBTSxpQ0FBZ0IsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQWMsS0FBSyxLQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFckQsSUFBYyxNQUFNLEtBQWdCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFMUQsSUFBVyxRQUFRLEtBQWUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUUxRCxJQUFXLGdCQUFnQixLQUFhLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUV4RSxJQUFXLFNBQVM7O1FBQ2xCLE1BQU0sU0FBUyxHQUF1QixNQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxrQ0FBZ0IsbUNBQUksU0FBUyxDQUFDO1FBQ3RGLElBQUksSUFBSSxDQUFDLFFBQVEseUNBQXVCLElBQUksU0FBUyxLQUFLLFNBQVM7WUFDakUsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQztRQUM5RyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSw4QkFBYyxDQUFDO1FBRWpELGlGQUFpRjtRQUNqRixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwRCxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFekMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxJQUFXLFFBQVE7UUFDakIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLGdDQUFlLENBQUM7UUFFbkQsa0ZBQWtGO1FBQ2xGLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JELE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUUxQyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRU0sZUFBZTtRQUNwQixJQUFJLElBQUksQ0FBQyxRQUFRLDhCQUFpQixJQUFJLElBQUksQ0FBQyxRQUFRLDBCQUFlLEVBQUU7WUFDbEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLHlDQUFtQixDQUFDO1lBQzlELElBQUksWUFBb0IsQ0FBQztZQUN6QixJQUFJLGVBQWUsRUFBRTtnQkFDbkIsWUFBWSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUMxQztpQkFBTTtnQkFDTCxtQ0FBbUM7Z0JBQ25DLE1BQU0sUUFBUSxHQUFpQixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2pFLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDakQsWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQzthQUMvQztZQUNELE9BQU8sWUFBWSxDQUFDO1NBQ3JCO2FBQU07WUFDTCxRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZCO29CQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNaLDhCQUFrQjtnQkFDbEI7b0JBQ0UsT0FBTyxDQUFDLENBQUM7Z0JBQ1gsS0FBSyxJQUFJO29CQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztvQkFDMUMsT0FBTyxDQUFDLENBQUM7Z0JBQ1g7b0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUM7YUFDNUQ7U0FDRjtJQUNILENBQUM7SUFFTSxzQkFBc0I7UUFDM0IsSUFBSSxJQUFJLENBQUMsUUFBUSw4QkFBaUIsSUFBSSxJQUFJLENBQUMsUUFBUSwwQkFBZTtZQUNoRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSx1REFBMEIsSUFBSSxNQUFNLENBQUM7O1lBRTlELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxPQUFPLEtBQWMsT0FBTyxJQUFJLENBQUMsUUFBUSxpQ0FBbUIsQ0FBQyxDQUFDLENBQUM7SUFFL0QsV0FBVyxLQUFjLE9BQU8sSUFBSSxDQUFDLFFBQVEseUNBQXVCLENBQUMsQ0FBQyxDQUFDO0lBRXZFLE1BQU0sS0FBYyxPQUFPLElBQUksQ0FBQyxRQUFRLCtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUU3RCxLQUFLLEtBQWMsT0FBTyxJQUFJLENBQUMsUUFBUSw2QkFBaUIsQ0FBQyxDQUFDLENBQUM7SUFFM0QsS0FBSyxLQUFjLE9BQU8sSUFBSSxDQUFDLFFBQVEsNkJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBRTNELFNBQVMsS0FBYyxPQUFPLElBQUksQ0FBQyxRQUFRLDJCQUFnQixDQUFDLENBQUMsQ0FBQztJQUU5RCxLQUFLLEtBQWMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUVyRyw0REFBNEQ7SUFDNUQ7O09BRUc7SUFDTyxXQUFXO1FBQ25CLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLDhCQUFnQjtZQUNyRCxvQ0FBc0I7YUFDbkIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsc0NBQW9CO1lBQzlELDRDQUEwQjthQUN2QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSw0QkFBZTtZQUN6RCxrQ0FBcUI7O1lBRXJCLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksOEJBQThCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTyxZQUFZLENBQUMsY0FBd0I7UUFDN0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN4QixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDakUsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdELE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEYsU0FBUyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUM3QyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2hELFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFekQsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLE1BQU0sOEJBQWMsQ0FBQztRQUM1QyxJQUFJLFVBQVU7WUFDWixTQUFTLENBQUMsTUFBTSwrQkFBZSxVQUFVLENBQUMsQ0FBQztRQUU3QyxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsTUFBTSxnQ0FBZSxDQUFDO1FBQzlDLElBQUksV0FBVztZQUNiLFNBQVMsQ0FBQyxNQUFNLGlDQUFnQixXQUFXLENBQUMsQ0FBQztRQUUvQyxJQUFJLGVBQWUsR0FBVyxHQUFHLENBQUMsTUFBTSx5Q0FBbUIsQ0FBQztRQUM1RCxJQUFJLGVBQWU7WUFDakIsU0FBUyxDQUFDLE1BQU0sMENBQW9CLGVBQWUsQ0FBQyxDQUFDO1FBRXZELE1BQU0sc0JBQXNCLEdBQVcsR0FBRyxDQUFDLE1BQU0sdURBQTBCLENBQUM7UUFDNUUsSUFBSSxzQkFBc0IsS0FBSyxTQUFTO1lBQ3RDLFNBQVMsQ0FBQyxNQUFNLHdEQUEyQixzQkFBc0IsQ0FBQyxDQUFDO1FBRXJFLElBQUksY0FBYyw4QkFBaUIsRUFBRTtZQUNuQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BELFNBQVMsQ0FBQyxNQUFNLDBDQUFvQixlQUFlLENBQUMsQ0FBQztTQUN0RDtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLFdBQXNCO1FBQy9DLE1BQU0sR0FBRyxHQUFpQixJQUFJLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RCxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3BDLE9BQU8sR0FBRyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBYTtRQUM1QyxLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sUUFBUSxHQUFHLGdHQUFtRCxDQUFDO1FBQ3JFLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV2QyxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEYsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksTUFBTSxDQUFDLHNCQUFzQixDQUNsQyxHQUFXLEVBQ1gsSUFBWSxFQUNaLEtBQWE7UUFFYiw0RUFBNEU7UUFDNUUsMkJBQTJCO1FBQzNCLCtDQUErQztRQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQztZQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDM0QsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RSxTQUFTLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQzdDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELFlBQW1CLEdBQWM7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDbkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDOztZQUVwQixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFELFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUM7UUFFbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsOEJBQWMsRUFBRTtZQUN2QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixJQUFJLENBQUMsUUFBUSxJQUFJO29CQUNoRixRQUFRLDRCQUFZLGlCQUFpQixDQUFDLENBQUM7U0FDNUM7UUFFRCxrREFBa0Q7UUFDbEQsdUJBQXVCO1FBQ3ZCLDJGQUEyRjtRQUMzRixxREFBcUQ7UUFDckQsNkNBQTZDO1FBQzdDLDJGQUEyRjtRQUMzRixxREFBcUQ7UUFDckQsSUFBSTtRQUVKLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLHVEQUEwQixFQUFFO1lBQ25ELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDZixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixJQUFJLENBQUMsUUFBUSxJQUFJO29CQUNoRixRQUFRLHFEQUF3QixpQkFBaUIsQ0FBQyxDQUFDO2lCQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksa0JBQWtCLElBQUksQ0FBQyxRQUFRLElBQUk7b0JBQ2hGLFFBQVEscURBQXdCLGlCQUFpQixDQUFDLENBQUM7U0FDeEQ7SUFDSCxDQUFDOztBQWhReUIsbUNBQXNCLEdBQUc7SUFDakQsSUFBSSxFQUFFLEdBQUc7SUFDVCxTQUFTLEVBQUUsRUFBRTtJQUNiLEtBQUssRUFBRSxHQUFHO0NBQ1gsQ0FBQztBQUVxQixpQ0FBb0IsR0FBRyxJQUFJLEdBQUcsQ0FBUztJQUM1RCxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQ2hELEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7Q0FDakQsQ0FBQyxDQUFDO0FBQ29CLDZCQUFnQixHQUFHLElBQUksR0FBRyxDQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6RCw2QkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1xuICBBTFBIQUJFVCxcbiAgZGV0ZWN0QWxwaGFiZXQsXG4gIGdldFNwbGl0dGVyRm9yQ29sdW1uLFxuICBnZXRTdGF0cyxcbiAgTk9UQVRJT04sXG4gIFNlcUNvbFN0YXRzLFxuICBzcGxpdHRlckFzRmFzdGEsXG4gIFNwbGl0dGVyRnVuYyxcbiAgVEFHU1xufSBmcm9tICcuL21hY3JvbW9sZWN1bGUnO1xuXG4vKiogQ2xhc3MgZm9yIGhhbmRsaW5nIG5vdGF0aW9uIHVuaXRzIGluIE1hY3JvbW9sZWN1bGUgY29sdW1ucyAqL1xuZXhwb3J0IGNsYXNzIFVuaXRzSGFuZGxlciB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfY29sdW1uOiBERy5Db2x1bW47IC8vIHRoZSBjb2x1bW4gdG8gYmUgY29udmVydGVkXG4gIHByb3RlY3RlZCBfdW5pdHM6IHN0cmluZzsgLy8gdW5pdHMsIG9mIHRoZSBmb3JtIGZhc3RhLCBzZXBhcmF0b3JcbiAgcHJvdGVjdGVkIF9ub3RhdGlvbjogTk9UQVRJT047IC8vIGN1cnJlbnQgbm90YXRpb24gKHdpdGhvdXQgOlNFUTpOVCwgZXRjLilcbiAgcHJvdGVjdGVkIF9kZWZhdWx0R2FwU3ltYm9sOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgX2RlZmF1bHRHYXBTeW1ib2xzRGljdCA9IHtcbiAgICBIRUxNOiAnKicsXG4gICAgU0VQQVJBVE9SOiAnJyxcbiAgICBGQVNUQTogJy0nLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUGVwdGlkZUZhc3RhQWxwaGFiZXQgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICdHJywgJ0wnLCAnWScsICdTJywgJ0UnLCAnUScsICdEJywgJ04nLCAnRicsICdBJyxcbiAgICAnSycsICdSJywgJ0gnLCAnQycsICdWJywgJ1AnLCAnVycsICdJJywgJ00nLCAnVCcsXG4gIF0pO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERuYUZhc3RhQWxwaGFiZXQgPSBuZXcgU2V0PHN0cmluZz4oWydBJywgJ0MnLCAnRycsICdUJ10pO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJuYUZhc3RhQWxwaGFiZXQgPSBuZXcgU2V0PHN0cmluZz4oWydBJywgJ0MnLCAnRycsICdVJ10pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2V0VW5pdHNUb0Zhc3RhQ29sdW1uKGNvbDogREcuQ29sdW1uKSB7XG4gICAgaWYgKGNvbC5zZW1UeXBlICE9PSBERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Zhc3RhIGNvbHVtbiBtdXN0IGJlIE1BQ1JPTU9MRUNVTEUnKTtcblxuICAgIGNvbnN0IHN0YXRzOiBTZXFDb2xTdGF0cyA9IGdldFN0YXRzKGNvbCwgNSwgc3BsaXR0ZXJBc0Zhc3RhKTtcbiAgICBjb25zdCBhbGlnbmVkID0gc3RhdHMuc2FtZUxlbmd0aCA/ICdTRVEuTVNBJyA6ICdTRVEnO1xuICAgIGNvbnN0IGFscGhhYmV0ID0gZGV0ZWN0QWxwaGFiZXQoc3RhdHMpO1xuXG4gICAgY29sLnNldFRhZyhERy5UQUdTLlVOSVRTLCBOT1RBVElPTi5GQVNUQSk7XG4gICAgY29sLnNldFRhZyhUQUdTLmFsaWduZWQsIGFsaWduZWQpO1xuICAgIGNvbC5zZXRUYWcoVEFHUy5hbHBoYWJldCwgYWxwaGFiZXQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB1bml0cygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fdW5pdHM7IH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNvbHVtbigpOiBERy5Db2x1bW4geyByZXR1cm4gdGhpcy5fY29sdW1uOyB9XG5cbiAgcHVibGljIGdldCBub3RhdGlvbigpOiBOT1RBVElPTiB7IHJldHVybiB0aGlzLl9ub3RhdGlvbjsgfVxuXG4gIHB1YmxpYyBnZXQgZGVmYXVsdEdhcFN5bWJvbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fZGVmYXVsdEdhcFN5bWJvbDsgfVxuXG4gIHB1YmxpYyBnZXQgc2VwYXJhdG9yKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2VwYXJhdG9yOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5zZXBhcmF0b3IpID8/IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5ub3RhdGlvbiA9PT0gTk9UQVRJT04uU0VQQVJBVE9SICYmIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXBhcmF0b3IgaXMgbWFuZGF0b3J5ICBmb3IgY29sdW1uICcke3RoaXMuY29sdW1uLm5hbWV9JyBvZiBub3RhdGlvbiAnJHt0aGlzLm5vdGF0aW9ufScuYCk7XG4gICAgcmV0dXJuIHNlcGFyYXRvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxpZ25lZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFsaWduZWQgPSB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5hbGlnbmVkKTtcblxuICAgIC8vIFRBR1MuYWxpZ25lZCBpcyBtYW5kYXRvcnkgZm9yIGNvbHVtbnMgb2YgTk9UQVRJT04uRkFTVEEgYW5kIE5PVEFUSU9OLlNFUEFSQVRPUlxuICAgIGlmICghYWxpZ25lZCAmJiAodGhpcy5pc0Zhc3RhKCkgfHwgdGhpcy5pc1NlcGFyYXRvcigpKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGFnIGFsaWduZWQgbm90IHNldCcpO1xuXG4gICAgcmV0dXJuIGFsaWduZWQ7XG4gIH1cblxuICAvKiogQWxwaGFiZXQgbmFtZSAodXBwZXIgY2FzZSkgKi9cbiAgcHVibGljIGdldCBhbHBoYWJldCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFscGhhYmV0ID0gdGhpcy5jb2x1bW4uZ2V0VGFnKFRBR1MuYWxwaGFiZXQpO1xuXG4gICAgLy8gVEFHUy5hbHBoYWJldCBpcyBtYW5kYXRvcnkgZm9yIGNvbHVtbnMgb2YgTk9UQVRJT04uRkFTVEEgYW5kIE5PVEFUSU9OLlNFUEFSQVRPUlxuICAgIGlmICghYWxwaGFiZXQgJiYgKHRoaXMuaXNGYXN0YSgpIHx8IHRoaXMuaXNTZXBhcmF0b3IoKSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhZyBhbHBoYWJldCBub3Qgc2V0Jyk7XG5cbiAgICByZXR1cm4gYWxwaGFiZXQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxwaGFiZXRTaXplKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMubm90YXRpb24gPT0gTk9UQVRJT04uSEVMTSB8fCB0aGlzLmFscGhhYmV0ID09IEFMUEhBQkVULlVOKSB7XG4gICAgICBjb25zdCBhbHBoYWJldFNpemVTdHIgPSB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5hbHBoYWJldFNpemUpO1xuICAgICAgbGV0IGFscGhhYmV0U2l6ZTogbnVtYmVyO1xuICAgICAgaWYgKGFscGhhYmV0U2l6ZVN0cikge1xuICAgICAgICBhbHBoYWJldFNpemUgPSBwYXJzZUludChhbHBoYWJldFNpemVTdHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY2FsY3VsYXRlIGFscGhhYmV0U2l6ZSBvbiBkZW1hbmRcbiAgICAgICAgY29uc3Qgc3BsaXR0ZXI6IFNwbGl0dGVyRnVuYyA9IGdldFNwbGl0dGVyRm9yQ29sdW1uKHRoaXMuY29sdW1uKTtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBnZXRTdGF0cyh0aGlzLmNvbHVtbiwgMSwgc3BsaXR0ZXIpO1xuICAgICAgICBhbHBoYWJldFNpemUgPSBPYmplY3Qua2V5cyhzdGF0cy5mcmVxKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWxwaGFiZXRTaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuYWxwaGFiZXQpIHtcbiAgICAgIGNhc2UgQUxQSEFCRVQuUFQ6XG4gICAgICAgIHJldHVybiAyMDtcbiAgICAgIGNhc2UgQUxQSEFCRVQuRE5BOlxuICAgICAgY2FzZSBBTFBIQUJFVC5STkE6XG4gICAgICAgIHJldHVybiA0O1xuICAgICAgY2FzZSAnTlQnOlxuICAgICAgICBjb25zb2xlLndhcm4oYFVuZXhwZWN0ZWQgYWxwaGFiZXQgJ05UJy5gKTtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYWxwaGFiZXQgJyR7dGhpcy5hbHBoYWJldH0nLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRBbHBoYWJldElzTXVsdGljaGFyKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm5vdGF0aW9uID09IE5PVEFUSU9OLkhFTE0gfHwgdGhpcy5hbHBoYWJldCA9PSBBTFBIQUJFVC5VTilcbiAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5hbHBoYWJldElzTXVsdGljaGFyKSA9PSAndHJ1ZSc7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGlzRmFzdGEoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm5vdGF0aW9uID09PSBOT1RBVElPTi5GQVNUQTsgfVxuXG4gIHB1YmxpYyBpc1NlcGFyYXRvcigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMubm90YXRpb24gPT09IE5PVEFUSU9OLlNFUEFSQVRPUjsgfVxuXG4gIHB1YmxpYyBpc0hlbG0oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm5vdGF0aW9uID09PSBOT1RBVElPTi5IRUxNOyB9XG5cbiAgcHVibGljIGlzUm5hKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5hbHBoYWJldCA9PT0gQUxQSEFCRVQuUk5BOyB9XG5cbiAgcHVibGljIGlzRG5hKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5hbHBoYWJldCA9PT0gQUxQSEFCRVQuRE5BOyB9XG5cbiAgcHVibGljIGlzUGVwdGlkZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuYWxwaGFiZXQgPT09IEFMUEhBQkVULlBUOyB9XG5cbiAgcHVibGljIGlzTXNhKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5hbGlnbmVkID8gdGhpcy5hbGlnbmVkLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoJ01TQScpIDogZmFsc2U7IH1cblxuICAvKiogQXNzb2NpYXRlIG5vdGF0aW9uIHR5cGVzIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdW5pdHMgKi9cbiAgLyoqXG4gICAqIEByZXR1cm4ge05PVEFUSU9OfSAgICAgTm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB1bml0cyB0eXBlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Tm90YXRpb24oKTogTk9UQVRJT04ge1xuICAgIGlmICh0aGlzLnVuaXRzLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChOT1RBVElPTi5GQVNUQSkpXG4gICAgICByZXR1cm4gTk9UQVRJT04uRkFTVEE7XG4gICAgZWxzZSBpZiAodGhpcy51bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uU0VQQVJBVE9SKSlcbiAgICAgIHJldHVybiBOT1RBVElPTi5TRVBBUkFUT1I7XG4gICAgZWxzZSBpZiAodGhpcy51bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uSEVMTSkpXG4gICAgICByZXR1cm4gTk9UQVRJT04uSEVMTTtcbiAgICBlbHNlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgaGFzIHVuZXhwZWN0ZWQgbm90YXRpb24gJyR7dGhpcy51bml0c30nLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbXB0eSBjb2x1bW4gb2YgdGhlIHNwZWNpZmllZCBub3RhdGlvbiB0eXBlIGFuZCB0aGUgc2FtZVxuICAgKiBsZW5ndGggYXMgY29sdW1uXG4gICAqXG4gICAqIEBwYXJhbSB7Tk9UQVRJT059IHRhcmdldE5vdGF0aW9uXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICovXG4gIHByb3RlY3RlZCBnZXROZXdDb2x1bW4odGFyZ2V0Tm90YXRpb246IE5PVEFUSU9OKTogREcuQ29sdW1uIHtcbiAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHVtbjtcbiAgICBjb25zdCBsZW4gPSBjb2wubGVuZ3RoO1xuICAgIGNvbnN0IG5hbWUgPSB0YXJnZXROb3RhdGlvbi50b0xvd2VyQ2FzZSgpICsgJygnICsgY29sLm5hbWUgKyAnKSc7XG4gICAgY29uc3QgbmV3Q29sTmFtZSA9IGNvbC5kYXRhRnJhbWUuY29sdW1ucy5nZXRVbnVzZWROYW1lKG5hbWUpO1xuICAgIGNvbnN0IG5ld0NvbHVtbiA9IERHLkNvbHVtbi5mcm9tTGlzdCgnc3RyaW5nJywgbmV3Q29sTmFtZSwgbmV3IEFycmF5KGxlbikuZmlsbCgnJykpO1xuICAgIG5ld0NvbHVtbi5zZW1UeXBlID0gREcuU0VNVFlQRS5NQUNST01PTEVDVUxFO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgdGFyZ2V0Tm90YXRpb24pO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5DRUxMX1JFTkRFUkVSLCAnTWFjcm9tb2xlY3VsZScpO1xuXG4gICAgY29uc3Qgc3JjQWxpZ25lZCA9IGNvbC5nZXRUYWcoVEFHUy5hbGlnbmVkKTtcbiAgICBpZiAoc3JjQWxpZ25lZClcbiAgICAgIG5ld0NvbHVtbi5zZXRUYWcoVEFHUy5hbGlnbmVkLCBzcmNBbGlnbmVkKTtcblxuICAgIGNvbnN0IHNyY0FscGhhYmV0ID0gY29sLmdldFRhZyhUQUdTLmFscGhhYmV0KTtcbiAgICBpZiAoc3JjQWxwaGFiZXQpXG4gICAgICBuZXdDb2x1bW4uc2V0VGFnKFRBR1MuYWxwaGFiZXQsIHNyY0FscGhhYmV0KTtcblxuICAgIGxldCBzcmNBbHBoYWJldFNpemU6IHN0cmluZyA9IGNvbC5nZXRUYWcoVEFHUy5hbHBoYWJldFNpemUpO1xuICAgIGlmIChzcmNBbHBoYWJldFNpemUpXG4gICAgICBuZXdDb2x1bW4uc2V0VGFnKFRBR1MuYWxwaGFiZXRTaXplLCBzcmNBbHBoYWJldFNpemUpO1xuXG4gICAgY29uc3Qgc3JjQWxwaGFiZXRJc011bHRpY2hhcjogc3RyaW5nID0gY29sLmdldFRhZyhUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXIpO1xuICAgIGlmIChzcmNBbHBoYWJldElzTXVsdGljaGFyICE9PSB1bmRlZmluZWQpXG4gICAgICBuZXdDb2x1bW4uc2V0VGFnKFRBR1MuYWxwaGFiZXRJc011bHRpY2hhciwgc3JjQWxwaGFiZXRJc011bHRpY2hhcik7XG5cbiAgICBpZiAodGFyZ2V0Tm90YXRpb24gPT0gTk9UQVRJT04uSEVMTSkge1xuICAgICAgc3JjQWxwaGFiZXRTaXplID0gdGhpcy5nZXRBbHBoYWJldFNpemUoKS50b1N0cmluZygpO1xuICAgICAgbmV3Q29sdW1uLnNldFRhZyhUQUdTLmFscGhhYmV0U2l6ZSwgc3JjQWxwaGFiZXRTaXplKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3Q29sdW1uO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbXB0eSBjb2x1bW4gdXNpbmcgdGVtcGxhdGVDb2wgYXMgYSB0ZW1wbGF0ZVxuICAgKlxuICAgKiBAcGFyYW0ge0RHLkNvbHVtbn0gdGVtcGxhdGVDb2wgIHRoZSBwcm9wZXJ0aWVzIGFuZCB1bml0cyBvZiB0aGlzIGNvbHVtbiBhcmUgdXNlZCBhcyBhXG4gICAqIHRlbXBsYXRlIHRvIGJ1aWxkIHRoZSBuZXcgb25lXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TmV3Q29sdW1uKHRlbXBsYXRlQ29sOiBERy5Db2x1bW4pOiBERy5Db2x1bW4ge1xuICAgIGNvbnN0IGNvbDogVW5pdHNIYW5kbGVyID0gbmV3IFVuaXRzSGFuZGxlcih0ZW1wbGF0ZUNvbCk7XG4gICAgY29uc3QgdGFyZ2V0Tm90YXRpb24gPSBjb2wubm90YXRpb247XG4gICAgcmV0dXJuIGNvbC5nZXROZXdDb2x1bW4odGFyZ2V0Tm90YXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgaGVscGVyIGZ1bmN0aW9uIGNoZWNraW5nIHRoZSB2YWxpZGl0eSBvZiB0aGUgJ3VuaXRzJyBzdHJpbmdcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXRzICB0aGUgc3RyaW5nIHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1bml0c1N0cmluZ0lzVmFsaWQodW5pdHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHVuaXRzID0gdW5pdHMudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBwcmVmaXhlcyA9IFtOT1RBVElPTi5GQVNUQSwgTk9UQVRJT04uU0VQQVJBVE9SLCBOT1RBVElPTi5IRUxNXTtcbiAgICBjb25zdCBwb3N0Zml4ZXMgPSBbJ3JuYScsICdkbmEnLCAncHQnXTtcblxuICAgIGNvbnN0IHByZWZpeENyaXRlcmlvbiA9IHByZWZpeGVzLnNvbWUoKHApID0+IHVuaXRzLnN0YXJ0c1dpdGgocC50b0xvd2VyQ2FzZSgpKSk7XG4gICAgcmV0dXJuIHByZWZpeENyaXRlcmlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBuZXcgY29sdW1uIG9mIHNlbWFudGljIHR5cGUgTUFDUk9NT0xFQ1VMRSBmcm9tIHRoZSBsaXN0IG9mXG4gICAqIHNwZWNpZmllZCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSAgICBsZW4gIHRoZSBsZW5ndGggb2YgdGhlIG5ldyBjb2x1bW5cbiAgICogQHBhcmFtIHtzdHJpbmd9ICAgIG5hbWUgIHRoZSBuYW1lIG9mIHRoZSBuZXcgY29sdW1uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSAgICB1bml0cyAgdGhlIHVuaXRzIG9mIHRoZSBuZXcgY29sdW1uXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TmV3Q29sdW1uRnJvbVBhcmFtcyhcbiAgICBsZW46IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdW5pdHM6IHN0cmluZ1xuICApOiBERy5Db2x1bW4ge1xuICAgIC8vIFdBUk5JTkc6IGluIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgaXMgaW1wb3NzaWJsZSB0byB2ZXJpZnkgdGhlIHVuaXF1ZW5lc3NcbiAgICAvLyBvZiB0aGUgbmV3IGNvbHVtbidzIG5hbWVcbiAgICAvLyBUT0RPOiB2ZXJpZnkgdGhlIHZhbGlkaXR5IG9mIHVuaXRzIHBhcmFtZXRlclxuICAgIGlmICghVW5pdHNIYW5kbGVyLnVuaXRzU3RyaW5nSXNWYWxpZCh1bml0cykpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZm9ybWF0IG9mIFxcJ3VuaXRzXFwnIHBhcmFtZXRlcicpO1xuICAgIGNvbnN0IG5ld0NvbHVtbiA9IERHLkNvbHVtbi5mcm9tTGlzdCgnc3RyaW5nJywgbmFtZSwgbmV3IEFycmF5KGxlbikuZmlsbCgnJykpO1xuICAgIG5ld0NvbHVtbi5zZW1UeXBlID0gREcuU0VNVFlQRS5NQUNST01PTEVDVUxFO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgdW5pdHMpO1xuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29sOiBERy5Db2x1bW4pIHtcbiAgICB0aGlzLl9jb2x1bW4gPSBjb2w7XG4gICAgY29uc3QgdW5pdHMgPSB0aGlzLl9jb2x1bW4udGFnc1tERy5UQUdTLlVOSVRTXTtcbiAgICBpZiAodW5pdHMgIT09IG51bGwpXG4gICAgICB0aGlzLl91bml0cyA9IHVuaXRzO1xuICAgIGVsc2VcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5pdHMgYXJlIG5vdCBzcGVjaWZpZWQgaW4gY29sdW1uJyk7XG4gICAgdGhpcy5fbm90YXRpb24gPSB0aGlzLmdldE5vdGF0aW9uKCk7XG4gICAgdGhpcy5fZGVmYXVsdEdhcFN5bWJvbCA9ICh0aGlzLmlzRmFzdGEoKSkgPyBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5GQVNUQSA6XG4gICAgICAodGhpcy5pc0hlbG0oKSkgPyBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5IRUxNIDpcbiAgICAgICAgVW5pdHNIYW5kbGVyLl9kZWZhdWx0R2FwU3ltYm9sc0RpY3QuU0VQQVJBVE9SO1xuXG4gICAgaWYgKCF0aGlzLmNvbHVtbi50YWdzLmhhcyhUQUdTLmFsaWduZWQpKSB7XG4gICAgICBpZiAodGhpcy5pc0Zhc3RhKCkgfHwgdGhpcy5pc1NlcGFyYXRvcigpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvciBjb2x1bW4gJyR7dGhpcy5jb2x1bW4ubmFtZX0nIG9mIG5vdGF0aW9uICcke3RoaXMubm90YXRpb259JyBgICtcbiAgICAgICAgICBgdGFnICcke1RBR1MuYWxpZ25lZH0nIGlzIG1hbmRhdG9yeS5gKTtcbiAgICB9XG5cbiAgICAvLyBpZiAoIXRoaXMuY29sdW1uLnRhZ3MuaGFzKFRBR1MuYWxwaGFiZXRTaXplKSkge1xuICAgIC8vICAgaWYgKHRoaXMuaXNIZWxtKCkpXG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2Ygbm90YXRpb24gJyR7dGhpcy5ub3RhdGlvbn0nIGAgK1xuICAgIC8vICAgICAgIGB0YWcgJyR7VEFHUy5hbHBoYWJldFNpemV9JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgLy8gICBlbHNlIGlmIChbJ1VOJ10uaW5jbHVkZXModGhpcy5hbHBoYWJldCkpXG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2YgYWxwaGFiZXQgJyR7dGhpcy5hbHBoYWJldH0nIGAgK1xuICAgIC8vICAgICAgIGB0YWcgJyR7VEFHUy5hbHBoYWJldFNpemV9JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgLy8gfVxuXG4gICAgaWYgKCF0aGlzLmNvbHVtbi50YWdzLmhhcyhUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXIpKSB7XG4gICAgICBpZiAodGhpcy5pc0hlbG0oKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3IgY29sdW1uICcke3RoaXMuY29sdW1uLm5hbWV9JyBvZiBub3RhdGlvbiAnJHt0aGlzLm5vdGF0aW9ufScgYCArXG4gICAgICAgICAgYHRhZyAnJHtUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXJ9JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgICBlbHNlIGlmIChbJ1VOJ10uaW5jbHVkZXModGhpcy5hbHBoYWJldCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2YgYWxwaGFiZXQgJyR7dGhpcy5hbHBoYWJldH0nIGAgK1xuICAgICAgICAgIGB0YWcgJyR7VEFHUy5hbHBoYWJldElzTXVsdGljaGFyfScgaXMgbWFuZGF0b3J5LmApO1xuICAgIH1cbiAgfVxufVxuIl19","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { vectorLength, vectorDotProduct } from '@datagrok-libraries/utils/src/vector-operations';\nimport { AminoacidsPalettes } from '../aminoacids';\nimport { NucleotidesPalettes } from '../nucleotides';\nimport { UnknownSeqPalettes } from '../unknown';\nimport { UnitsHandler } from '../utils/units-handler';\n;\n/** Stats of sequences with specified splitter func, returns { freq, sameLength }.\n * @param {DG.Column} seqCol\n * @param {number} minLength\n * @param {SplitterFunc} splitter\n * @return { SeqColStats }, sameLength: boolean } stats of column sequences\n */\nexport function getStats(seqCol, minLength, splitter) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n for (const seq of seqCol.categories) {\n const mSeq = splitter(seq);\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n if (mSeq.length >= minLength) {\n for (const m of mSeq) {\n if (!(m in freq))\n freq[m] = 0;\n freq[m] += 1;\n }\n }\n }\n return { freq: freq, sameLength: sameLength };\n}\nexport const monomerRe = /\\[(\\w+)\\]|(\\w)|(-)/g;\n/** Split sequence for single character monomers, square brackets multichar monomer names or gap symbol.\n * @param {any} seq object with sequence\n * @return {string[]} array of monomers\n */\nexport function splitterAsFasta(seq) {\n return wu(seq.toString().matchAll(monomerRe))\n .map((ma) => {\n let mRes;\n const m = ma[0];\n if (m.length > 1) {\n mRes = ma[1];\n }\n else {\n mRes = m;\n }\n return mRes;\n }).toArray();\n}\n/** Gets method to split sequence by separator\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitterWithSeparator(separator, limit = undefined) {\n return (seq) => {\n return seq.split(separator, limit);\n };\n}\nconst helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nconst helmPp1Re = /\\[([^\\[\\]]+)]/g;\n/** Splits Helm string to monomers, but does not replace monomer names to other notation (e.g. for RNA).\n * Only for linear polymers, does not split RNA for ribose and phosphate monomers.\n * @param {string} seq Source string of HELM notation\n * @return {string[]}\n */\nexport function splitterAsHelm(seq) {\n helmRe.lastIndex = 0;\n const ea = helmRe.exec(seq.toString());\n const inSeq = ea ? ea[2] : null;\n const mmPostProcess = (mm) => {\n helmPp1Re.lastIndex = 0;\n const pp1M = helmPp1Re.exec(mm);\n if (pp1M && pp1M.length >= 2)\n return pp1M[1];\n else\n return mm;\n };\n const mmList = inSeq ? inSeq.split('.') : [];\n return mmList.map(mmPostProcess);\n}\n/** Get splitter method to split sequences to monomers\n * @param {string} units\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitter(units, separator, limit = undefined) {\n if (units.toLowerCase().startsWith(\"fasta\" /* NOTATION.FASTA */))\n return splitterAsFasta;\n else if (units.toLowerCase().startsWith(\"separator\" /* NOTATION.SEPARATOR */))\n return getSplitterWithSeparator(separator, limit);\n else if (units.toLowerCase().startsWith(\"helm\" /* NOTATION.HELM */))\n return splitterAsHelm;\n else\n throw new Error(`Unexpected units ${units} .`);\n // TODO: Splitter for HELM\n}\n/** Generate splitter function for sequence column\n * @param {DG.Column} col\n * @return {SplitterFunc} Splitter function\n */\nexport function getSplitterForColumn(col) {\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error(`Get splitter for semType \"${DG.SEMTYPE.MACROMOLECULE}\" only.`);\n const units = col.getTag(DG.TAGS.UNITS);\n const separator = col.getTag(\"separator\" /* TAGS.separator */);\n return getSplitter(units, separator);\n}\nconst longMonomerPartRe = /(\\w+)/g;\n/** Convert long monomer names to short ones */\nexport function monomerToShort(amino, maxLengthOfMonomer) {\n var _a, _b;\n const shortAminoMatch = amino.match(longMonomerPartRe);\n const needAddDots = amino.length > maxLengthOfMonomer || ((_a = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch.length) !== null && _a !== void 0 ? _a : 0) > 1;\n const shortAmino = (_b = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch[0]) !== null && _b !== void 0 ? _b : ' ';\n return !needAddDots ? shortAmino : shortAmino.substring(0, maxLengthOfMonomer) + '…';\n}\n/** */\nexport function getAlphabet(alphabet) {\n switch (alphabet) {\n case \"DNA\" /* ALPHABET.DNA */:\n return UnitsHandler.DnaFastaAlphabet;\n case \"RNA\" /* ALPHABET.RNA */:\n return UnitsHandler.RnaFastaAlphabet;\n case \"PT\" /* ALPHABET.PT */:\n return UnitsHandler.PeptideFastaAlphabet;\n default:\n throw new Error(`Unsupported alphabet '${alphabet}'.`);\n }\n}\n/** Calculate similarity in current sequence and alphabet.\n * @param {MonomerFreqs} freq\n * @param {Set<string>} alphabet\n * @param {string} gapSymbol\n * @return {number} Cosine similarity\n */\nexport function getAlphabetSimilarity(freq, alphabet, gapSymbol = '-') {\n const keys = new Set([...new Set(Object.keys(freq)), ...alphabet]);\n keys.delete(gapSymbol);\n const freqA = [];\n const alphabetA = [];\n for (const m of keys) {\n freqA.push(m in freq ? freq[m] : 0);\n alphabetA.push(alphabet.has(m) ? 1 : 0);\n }\n /* There were a few ideas: chi-squared, pearson correlation (variance?), scalar product */\n const freqV = new Vector(freqA);\n const alphabetV = new Vector(alphabetA);\n return vectorDotProduct(freqV, alphabetV) / (vectorLength(freqV) * vectorLength(alphabetV));\n}\nexport function detectAlphabet(stats) {\n const alphabetCandidates = [\n [\"PT\" /* ALPHABET.PT */, UnitsHandler.PeptideFastaAlphabet],\n [\"DNA\" /* ALPHABET.DNA */, UnitsHandler.DnaFastaAlphabet],\n [\"RNA\" /* ALPHABET.RNA */, UnitsHandler.RnaFastaAlphabet],\n ];\n // Calculate likelihoods for alphabet_candidates\n const alphabetCandidatesSim = alphabetCandidates.map((c) => getAlphabetSimilarity(stats.freq, c[1]));\n const maxCos = Math.max(...alphabetCandidatesSim);\n const alphabet = maxCos > 0.65 ? alphabetCandidates[alphabetCandidatesSim.indexOf(maxCos)][0] : 'UN';\n return alphabet;\n}\n/** Selects a suitable palette based on column data\n * @param {DG.Column} seqCol Column to look for a palette\n * @param {number} minLength minimum length of sequence to detect palette (empty strings are allowed)\n * @return {SeqPalette} Palette corresponding to the alphabet of the sequences in the column\n */\nexport function pickUpPalette(seqCol, minLength = 5) {\n let alphabet;\n if (seqCol.semType == DG.SEMTYPE.MACROMOLECULE) {\n const uh = new UnitsHandler(seqCol);\n alphabet = uh.alphabet;\n }\n else {\n const stats = getStats(seqCol, minLength, splitterAsFasta);\n alphabet = detectAlphabet(stats);\n }\n const res = getPaletteByType(alphabet);\n return res;\n}\nexport function getPaletteByType(paletteType) {\n switch (paletteType) {\n case 'PT':\n return AminoacidsPalettes.GrokGroups;\n case 'NT':\n case 'DNA':\n case 'RNA':\n return NucleotidesPalettes.Chromatogram;\n // other\n default:\n return UnknownSeqPalettes.Color;\n }\n}\nexport function pickUpSeqCol(df) {\n var _a;\n const semTypeColList = df.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);\n let resCol = (_a = semTypeColList.find((col) => {\n const units = col.getTag(DG.TAGS.UNITS);\n return units ? units.indexOf('MSA') !== -1 : false;\n })) !== null && _a !== void 0 ? _a : null;\n if (!resCol && semTypeColList.length > 0)\n resCol = semTypeColList[0];\n return resCol;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1hY3JvbW9sZWN1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFcEIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUUvRixPQUFPLEVBQWEsa0JBQWtCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFjLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQTRCbkQsQ0FBQztBQU1GOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxNQUFpQixFQUFFLFNBQWlCLEVBQUUsUUFBc0I7SUFDbkYsTUFBTSxJQUFJLEdBQTRCLEVBQUUsQ0FBQztJQUN6QyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDdEIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBRXZCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUNuQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0IsSUFBSSxXQUFXLElBQUksSUFBSTtZQUNyQixXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUN2QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssV0FBVztZQUNsQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBRXJCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUU7WUFDNUIsS0FBSyxNQUFNLENBQUMs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QUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxtQ0FBSSxJQUFJLENBQUM7SUFDWCxJQUFJLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUN0QyxNQUFNLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHd1IGZyb20gJ3d1JztcblxuaW1wb3J0IHtWZWN0b3J9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7dmVjdG9yTGVuZ3RoLCB2ZWN0b3JEb3RQcm9kdWN0fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQge1NlcVBhbGV0dGV9IGZyb20gJy4uL3NlcS1wYWxldHRlcyc7XG5pbXBvcnQge0FtaW5vYWNpZHMsIEFtaW5vYWNpZHNQYWxldHRlc30gZnJvbSAnLi4vYW1pbm9hY2lkcyc7XG5pbXBvcnQge051Y2xlb3RpZGVzLCBOdWNsZW90aWRlc1BhbGV0dGVzfSBmcm9tICcuLi9udWNsZW90aWRlcyc7XG5pbXBvcnQge1Vua25vd25TZXFQYWxldHRlc30gZnJvbSAnLi4vdW5rbm93bic7XG5pbXBvcnQge1VuaXRzSGFuZGxlcn0gZnJvbSAnLi4vdXRpbHMvdW5pdHMtaGFuZGxlcic7XG5cblxuLyoqIGVudW0gdHlwZSB0byBzaW1wbGlmeSBzZXR0aW5nIFwidXNlci1mcmllbmRseVwiIG5vdGF0aW9uIGlmIG5lY2Vzc2FyeSAqL1xuZXhwb3J0IGNvbnN0IGVudW0gTk9UQVRJT04ge1xuICBGQVNUQSA9ICdmYXN0YScsXG4gIFNFUEFSQVRPUiA9ICdzZXBhcmF0b3InLFxuICBIRUxNID0gJ2hlbG0nLFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBBTElHTk1FTlQge1xuICBTRVFfTVNBID0gJ1NFUS5NU0EnLFxuICBTRVEgPSAnU0VRJyxcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gQUxQSEFCRVQge1xuICBETkEgPSAnRE5BJyxcbiAgUk5BID0gJ1JOQScsXG4gIFBUID0gJ1BUJyxcbiAgVU4gPSAnVU4nLFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBUQUdTIHtcbiAgYWxpZ25lZCA9ICdhbGlnbmVkJyxcbiAgYWxwaGFiZXQgPSAnYWxwaGFiZXQnLFxuICBhbHBoYWJldFNpemUgPSAnLmFscGhhYmV0U2l6ZScsXG4gIGFscGhhYmV0SXNNdWx0aWNoYXIgPSAnLmFscGhhYmV0SXNNdWx0aWNoYXInLFxuICBzZXBhcmF0b3IgPSAnc2VwYXJhdG9yJyxcbn07XG5cbmV4cG9ydCB0eXBlIFNlcUNvbFN0YXRzID0geyBmcmVxOiBNb25vbWVyRnJlcXMsIHNhbWVMZW5ndGg6IGJvb2xlYW4gfVxuZXhwb3J0IHR5cGUgU3BsaXR0ZXJGdW5jID0gKHNlcTogc3RyaW5nKSA9PiBzdHJpbmdbXTtcbmV4cG9ydCB0eXBlIE1vbm9tZXJGcmVxcyA9IHsgW206IHN0cmluZ106IG51bWJlciB9O1xuXG4vKiogU3RhdHMgb2Ygc2VxdWVuY2VzIHdpdGggc3BlY2lmaWVkIHNwbGl0dGVyIGZ1bmMsIHJldHVybnMgeyBmcmVxLCBzYW1lTGVuZ3RoIH0uXG4gKiBAcGFyYW0ge0RHLkNvbHVtbn0gc2VxQ29sXG4gKiBAcGFyYW0ge251bWJlcn0gbWluTGVuZ3RoXG4gKiBAcGFyYW0ge1NwbGl0dGVyRnVuY30gc3BsaXR0ZXJcbiAqIEByZXR1cm4geyBTZXFDb2xTdGF0cyB9LCBzYW1lTGVuZ3RoOiBib29sZWFuIH0gc3RhdHMgb2YgY29sdW1uIHNlcXVlbmNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhdHMoc2VxQ29sOiBERy5Db2x1bW4sIG1pbkxlbmd0aDogbnVtYmVyLCBzcGxpdHRlcjogU3BsaXR0ZXJGdW5jKTogU2VxQ29sU3RhdHMge1xuICBjb25zdCBmcmVxOiB7IFttOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICBsZXQgc2FtZUxlbmd0aCA9IHRydWU7XG4gIGxldCBmaXJzdExlbmd0aCA9IG51bGw7XG5cbiAgZm9yIChjb25zdCBzZXEgb2Ygc2VxQ29sLmNhdGVnb3JpZXMpIHtcbiAgICBjb25zdCBtU2VxID0gc3BsaXR0ZXIoc2VxKTtcblxuICAgIGlmIChmaXJzdExlbmd0aCA9PSBudWxsKVxuICAgICAgZmlyc3RMZW5ndGggPSBtU2VxLmxlbmd0aDtcbiAgICBlbHNlIGlmIChtU2VxLmxlbmd0aCAhPT0gZmlyc3RMZW5ndGgpXG4gICAgICBzYW1lTGVuZ3RoID0gZmFsc2U7XG5cbiAgICBpZiAobVNlcS5sZW5ndGggPj0gbWluTGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IG0gb2YgbVNlcSkge1xuICAgICAgICBpZiAoIShtIGluIGZyZXEpKVxuICAgICAgICAgIGZyZXFbbV0gPSAwO1xuICAgICAgICBmcmVxW21dICs9IDE7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7ZnJlcTogZnJlcSwgc2FtZUxlbmd0aDogc2FtZUxlbmd0aH07XG59XG5cbmV4cG9ydCBjb25zdCBtb25vbWVyUmU6IFJlZ0V4cCA9IC9cXFsoXFx3KylcXF18KFxcdyl8KC0pL2c7XG5cbi8qKiBTcGxpdCBzZXF1ZW5jZSBmb3Igc2luZ2xlIGNoYXJhY3RlciBtb25vbWVycywgc3F1YXJlIGJyYWNrZXRzIG11bHRpY2hhciBtb25vbWVyIG5hbWVzIG9yIGdhcCBzeW1ib2wuXG4gKiBAcGFyYW0ge2FueX0gc2VxIG9iamVjdCB3aXRoIHNlcXVlbmNlXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX0gYXJyYXkgb2YgbW9ub21lcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0dGVyQXNGYXN0YShzZXE6IGFueSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHd1PFJlZ0V4cE1hdGNoQXJyYXk+KHNlcS50b1N0cmluZygpLm1hdGNoQWxsKG1vbm9tZXJSZSkpXG4gICAgLm1hcCgobWE6IFJlZ0V4cE1hdGNoQXJyYXkpID0+IHtcbiAgICAgIGxldCBtUmVzOiBzdHJpbmc7XG4gICAgICBjb25zdCBtOiBzdHJpbmcgPSBtYVswXTtcbiAgICAgIGlmIChtLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbVJlcyA9IG1hWzFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbVJlcyA9IG07XG4gICAgICB9XG4gICAgICByZXR1cm4gbVJlcztcbiAgICB9KS50b0FycmF5KCk7XG59XG5cbi8qKiBHZXRzIG1ldGhvZCB0byBzcGxpdCBzZXF1ZW5jZSBieSBzZXBhcmF0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXBhcmF0b3JcbiAqIEBwYXJhbSBsaW1pdFxuICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXR0ZXJXaXRoU2VwYXJhdG9yKHNlcGFyYXRvcjogc3RyaW5nLCBsaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKTogU3BsaXR0ZXJGdW5jIHtcbiAgcmV0dXJuIChzZXE6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBzZXEuc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCk7XG4gIH07XG59XG5cbmNvbnN0IGhlbG1SZTogUmVnRXhwID0gLyhQRVBUSURFMXxETkExfFJOQTEpXFx7KFtefV0rKX0vZztcbmNvbnN0IGhlbG1QcDFSZTogUmVnRXhwID0gL1xcWyhbXlxcW1xcXV0rKV0vZztcblxuLyoqIFNwbGl0cyBIZWxtIHN0cmluZyB0byBtb25vbWVycywgYnV0IGRvZXMgbm90IHJlcGxhY2UgbW9ub21lciBuYW1lcyB0byBvdGhlciBub3RhdGlvbiAoZS5nLiBmb3IgUk5BKS5cbiAqIE9ubHkgZm9yIGxpbmVhciBwb2x5bWVycywgZG9lcyBub3Qgc3BsaXQgUk5BIGZvciByaWJvc2UgYW5kIHBob3NwaGF0ZSBtb25vbWVycy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXEgU291cmNlIHN0cmluZyBvZiBIRUxNIG5vdGF0aW9uXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0dGVyQXNIZWxtKHNlcTogYW55KTogc3RyaW5nW10ge1xuICBoZWxtUmUubGFzdEluZGV4ID0gMDtcbiAgY29uc3QgZWE6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGwgPSBoZWxtUmUuZXhlYyhzZXEudG9TdHJpbmcoKSk7XG4gIGNvbnN0IGluU2VxOiBzdHJpbmcgfCBudWxsID0gZWEgPyBlYVsyXSA6IG51bGw7XG5cbiAgY29uc3QgbW1Qb3N0UHJvY2VzcyA9IChtbTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBoZWxtUHAxUmUubGFzdEluZGV4ID0gMDtcbiAgICBjb25zdCBwcDFNID0gaGVsbVBwMVJlLmV4ZWMobW0pO1xuICAgIGlmIChwcDFNICYmIHBwMU0ubGVuZ3RoID49IDIpXG4gICAgICByZXR1cm4gcHAxTVsxXTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gbW07XG4gIH07XG5cbiAgY29uc3QgbW1MaXN0OiBzdHJpbmdbXSA9IGluU2VxID8gaW5TZXEuc3BsaXQoJy4nKSA6IFtdO1xuICByZXR1cm4gbW1MaXN0Lm1hcChtbVBvc3RQcm9jZXNzKTtcbn1cblxuLyoqIEdldCBzcGxpdHRlciBtZXRob2QgdG8gc3BsaXQgc2VxdWVuY2VzIHRvIG1vbm9tZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gdW5pdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXBhcmF0b3JcbiAqIEBwYXJhbSBsaW1pdFxuICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXR0ZXIodW5pdHM6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpOiBTcGxpdHRlckZ1bmMge1xuICBpZiAodW5pdHMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKE5PVEFUSU9OLkZBU1RBKSlcbiAgICByZXR1cm4gc3BsaXR0ZXJBc0Zhc3RhO1xuICBlbHNlIGlmICh1bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uU0VQQVJBVE9SKSlcbiAgICByZXR1cm4gZ2V0U3BsaXR0ZXJXaXRoU2VwYXJhdG9yKHNlcGFyYXRvciwgbGltaXQpO1xuICBlbHNlIGlmICh1bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uSEVMTSkpXG4gICAgcmV0dXJuIHNwbGl0dGVyQXNIZWxtO1xuICBlbHNlXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHVuaXRzICR7dW5pdHN9IC5gKTtcblxuICAvLyBUT0RPOiBTcGxpdHRlciBmb3IgSEVMTVxufVxuXG4vKiogR2VuZXJhdGUgc3BsaXR0ZXIgZnVuY3Rpb24gZm9yIHNlcXVlbmNlIGNvbHVtblxuICogQHBhcmFtIHtERy5Db2x1bW59IGNvbFxuICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfSBTcGxpdHRlciBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXR0ZXJGb3JDb2x1bW4oY29sOiBERy5Db2x1bW4pOiBTcGxpdHRlckZ1bmMge1xuICBpZiAoY29sLnNlbVR5cGUgIT09IERHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEdldCBzcGxpdHRlciBmb3Igc2VtVHlwZSBcIiR7REcuU0VNVFlQRS5NQUNST01PTEVDVUxFfVwiIG9ubHkuYCk7XG5cbiAgY29uc3QgdW5pdHMgPSBjb2wuZ2V0VGFnKERHLlRBR1MuVU5JVFMpO1xuICBjb25zdCBzZXBhcmF0b3IgPSBjb2wuZ2V0VGFnKFRBR1Muc2VwYXJhdG9yKTtcbiAgcmV0dXJuIGdldFNwbGl0dGVyKHVuaXRzLCBzZXBhcmF0b3IpO1xufVxuXG5jb25zdCBsb25nTW9ub21lclBhcnRSZTogUmVnRXhwID0gLyhcXHcrKS9nO1xuXG4vKiogQ29udmVydCBsb25nIG1vbm9tZXIgbmFtZXMgdG8gc2hvcnQgb25lcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vbm9tZXJUb1Nob3J0KGFtaW5vOiBzdHJpbmcsIG1heExlbmd0aE9mTW9ub21lcjogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qgc2hvcnRBbWlub01hdGNoOiBSZWdFeHBNYXRjaEFycmF5IHwgbnVsbCA9IGFtaW5vLm1hdGNoKGxvbmdNb25vbWVyUGFydFJlKTtcbiAgY29uc3QgbmVlZEFkZERvdHM6IGJvb2xlYW4gPSBhbWluby5sZW5ndGggPiBtYXhMZW5ndGhPZk1vbm9tZXIgfHwgKHNob3J0QW1pbm9NYXRjaD8ubGVuZ3RoID8/IDApID4gMTtcbiAgY29uc3Qgc2hvcnRBbWlubyA9IHNob3J0QW1pbm9NYXRjaD8uWzBdID8/ICcgJztcbiAgcmV0dXJuICFuZWVkQWRkRG90cyA/IHNob3J0QW1pbm8gOiBzaG9ydEFtaW5vLnN1YnN0cmluZygwLCBtYXhMZW5ndGhPZk1vbm9tZXIpICsgJ+KApic7XG59XG5cbi8qKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFscGhhYmV0KGFscGhhYmV0OiBBTFBIQUJFVCk6IFNldDxzdHJpbmc+IHtcbiAgc3dpdGNoIChhbHBoYWJldCkge1xuICBjYXNlIEFMUEhBQkVULkROQTpcbiAgICByZXR1cm4gVW5pdHNIYW5kbGVyLkRuYUZhc3RhQWxwaGFiZXQ7XG4gIGNhc2UgQUxQSEFCRVQuUk5BOlxuICAgIHJldHVybiBVbml0c0hhbmRsZXIuUm5hRmFzdGFBbHBoYWJldDtcbiAgY2FzZSBBTFBIQUJFVC5QVDpcbiAgICByZXR1cm4gVW5pdHNIYW5kbGVyLlBlcHRpZGVGYXN0YUFscGhhYmV0O1xuICBkZWZhdWx0OlxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgYWxwaGFiZXQgJyR7YWxwaGFiZXR9Jy5gKTtcbiAgfVxufVxuXG4vKiogQ2FsY3VsYXRlIHNpbWlsYXJpdHkgaW4gY3VycmVudCBzZXF1ZW5jZSBhbmQgYWxwaGFiZXQuXG4gKiBAcGFyYW0ge01vbm9tZXJGcmVxc30gZnJlcVxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gYWxwaGFiZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBnYXBTeW1ib2xcbiAqIEByZXR1cm4ge251bWJlcn0gQ29zaW5lIHNpbWlsYXJpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFscGhhYmV0U2ltaWxhcml0eShmcmVxOiBNb25vbWVyRnJlcXMsIGFscGhhYmV0OiBTZXQ8c3RyaW5nPiwgZ2FwU3ltYm9sOiBzdHJpbmcgPSAnLScpOiBudW1iZXIge1xuICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KFsuLi5uZXcgU2V0KE9iamVjdC5rZXlzKGZyZXEpKSwgLi4uYWxwaGFiZXRdKTtcbiAga2V5cy5kZWxldGUoZ2FwU3ltYm9sKTtcblxuICBjb25zdCBmcmVxQTogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgYWxwaGFiZXRBOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG0gb2Yga2V5cykge1xuICAgIGZyZXFBLnB1c2gobSBpbiBmcmVxID8gZnJlcVttXSA6IDApO1xuICAgIGFscGhhYmV0QS5wdXNoKGFscGhhYmV0LmhhcyhtKSA/IDEgOiAwKTtcbiAgfVxuICAvKiBUaGVyZSB3ZXJlIGEgZmV3IGlkZWFzOiBjaGktc3F1YXJlZCwgcGVhcnNvbiBjb3JyZWxhdGlvbiAodmFyaWFuY2U/KSwgc2NhbGFyIHByb2R1Y3QgKi9cbiAgY29uc3QgZnJlcVY6IFZlY3RvciA9IG5ldyBWZWN0b3IoZnJlcUEpO1xuICBjb25zdCBhbHBoYWJldFY6IFZlY3RvciA9IG5ldyBWZWN0b3IoYWxwaGFiZXRBKTtcbiAgcmV0dXJuIHZlY3RvckRvdFByb2R1Y3QoZnJlcVYsIGFscGhhYmV0VikgLyAodmVjdG9yTGVuZ3RoKGZyZXFWKSAqIHZlY3Rvckxlbmd0aChhbHBoYWJldFYpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdEFscGhhYmV0KHN0YXRzOiBTZXFDb2xTdGF0cyk6IHN0cmluZyB7XG4gIGNvbnN0IGFscGhhYmV0Q2FuZGlkYXRlczogW3N0cmluZywgU2V0PHN0cmluZz5dW10gPSBbXG4gICAgW0FMUEhBQkVULlBULCBVbml0c0hhbmRsZXIuUGVwdGlkZUZhc3RhQWxwaGFiZXRdLFxuICAgIFtBTFBIQUJFVC5ETkEsIFVuaXRzSGFuZGxlci5EbmFGYXN0YUFscGhhYmV0XSxcbiAgICBbQUxQSEFCRVQuUk5BLCBVbml0c0hhbmRsZXIuUm5hRmFzdGFBbHBoYWJldF0sXG4gIF07XG5cbiAgLy8gQ2FsY3VsYXRlIGxpa2VsaWhvb2RzIGZvciBhbHBoYWJldF9jYW5kaWRhdGVzXG4gIGNvbnN0IGFscGhhYmV0Q2FuZGlkYXRlc1NpbTogbnVtYmVyW10gPSBhbHBoYWJldENhbmRpZGF0ZXMubWFwKFxuICAgIChjKSA9PiBnZXRBbHBoYWJldFNpbWlsYXJpdHkoc3RhdHMuZnJlcSwgY1sxXSkpO1xuICBjb25zdCBtYXhDb3MgPSBNYXRoLm1heCguLi5hbHBoYWJldENhbmRpZGF0ZXNTaW0pO1xuICBjb25zdCBhbHBoYWJldCA9IG1heENvcyA+IDAuNjUgPyBhbHBoYWJldENhbmRpZGF0ZXNbYWxwaGFiZXRDYW5kaWRhdGVzU2ltLmluZGV4T2YobWF4Q29zKV1bMF0gOiAnVU4nO1xuICByZXR1cm4gYWxwaGFiZXQ7XG59XG5cbi8qKiBTZWxlY3RzIGEgc3VpdGFibGUgcGFsZXR0ZSBiYXNlZCBvbiBjb2x1bW4gZGF0YVxuICogQHBhcmFtIHtERy5Db2x1bW59IHNlcUNvbCBDb2x1bW4gdG8gbG9vayBmb3IgYSBwYWxldHRlXG4gKiBAcGFyYW0ge251bWJlcn0gIG1pbkxlbmd0aCBtaW5pbXVtIGxlbmd0aCBvZiBzZXF1ZW5jZSB0byBkZXRlY3QgcGFsZXR0ZSAoZW1wdHkgc3RyaW5ncyBhcmUgYWxsb3dlZClcbiAqIEByZXR1cm4ge1NlcVBhbGV0dGV9IFBhbGV0dGUgY29ycmVzcG9uZGluZyB0byB0aGUgYWxwaGFiZXQgb2YgdGhlIHNlcXVlbmNlcyBpbiB0aGUgY29sdW1uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaWNrVXBQYWxldHRlKHNlcUNvbDogREcuQ29sdW1uLCBtaW5MZW5ndGg6IG51bWJlciA9IDUpOiBTZXFQYWxldHRlIHtcbiAgbGV0IGFscGhhYmV0OiBzdHJpbmc7XG4gIGlmIChzZXFDb2wuc2VtVHlwZSA9PSBERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEUpIHtcbiAgICBjb25zdCB1aDogVW5pdHNIYW5kbGVyID0gbmV3IFVuaXRzSGFuZGxlcihzZXFDb2wpO1xuICAgIGFscGhhYmV0ID0gdWguYWxwaGFiZXQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc3RhdHM6IFNlcUNvbFN0YXRzID0gZ2V0U3RhdHMoc2VxQ29sLCBtaW5MZW5ndGgsIHNwbGl0dGVyQXNGYXN0YSk7XG4gICAgYWxwaGFiZXQgPSBkZXRlY3RBbHBoYWJldChzdGF0cyk7XG4gIH1cblxuICBjb25zdCByZXMgPSBnZXRQYWxldHRlQnlUeXBlKGFscGhhYmV0KTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhbGV0dGVCeVR5cGUocGFsZXR0ZVR5cGU6IHN0cmluZyk6IFNlcVBhbGV0dGUge1xuICBzd2l0Y2ggKHBhbGV0dGVUeXBlKSB7XG4gIGNhc2UgJ1BUJzpcbiAgICByZXR1cm4gQW1pbm9hY2lkc1BhbGV0dGVzLkdyb2tHcm91cHM7XG4gIGNhc2UgJ05UJzpcbiAgY2FzZSAnRE5BJzpcbiAgY2FzZSAnUk5BJzpcbiAgICByZXR1cm4gTnVjbGVvdGlkZXNQYWxldHRlcy5DaHJvbWF0b2dyYW07XG4gICAgLy8gb3RoZXJcbiAgZGVmYXVsdDpcbiAgICByZXR1cm4gVW5rbm93blNlcVBhbGV0dGVzLkNvbG9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwaWNrVXBTZXFDb2woZGY6IERHLkRhdGFGcmFtZSk6IERHLkNvbHVtbiB8IG51bGwge1xuICBjb25zdCBzZW1UeXBlQ29sTGlzdCA9IGRmLmNvbHVtbnMuYnlTZW1UeXBlQWxsKERHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRSk7XG4gIGxldCByZXNDb2w6IERHLkNvbHVtbiB8IG51bGwgPSBzZW1UeXBlQ29sTGlzdC5maW5kKChjb2wpID0+IHtcbiAgICBjb25zdCB1bml0cyA9IGNvbC5nZXRUYWcoREcuVEFHUy5VTklUUyk7XG4gICAgcmV0dXJuIHVuaXRzID8gdW5pdHMuaW5kZXhPZignTVNBJykgIT09IC0xIDogZmFsc2U7XG4gIH0pID8/IG51bGw7XG4gIGlmICghcmVzQ29sICYmIHNlbVR5cGVDb2xMaXN0Lmxlbmd0aCA+IDApXG4gICAgcmVzQ29sID0gc2VtVHlwZUNvbExpc3RbMF07XG4gIHJldHVybiByZXNDb2w7XG59XG4iXX0=","import { monomerToShort } from './macromolecule';\nconst undefinedColor = 'rgb(100,100,100)';\nconst grayColor = '#808080';\nconst blackColor = 'rgb(0,0,0)';\nconst monomerToShortFunction = monomerToShort;\nexport var DrawStyle;\n(function (DrawStyle) {\n DrawStyle[\"MSA\"] = \"MSA\";\n DrawStyle[\"classic\"] = \"classic\";\n})(DrawStyle || (DrawStyle = {}));\n/**\n * A function that prints a string aligned to left or centered.\n *\n * @param {number} x x coordinate.\n * @param {number} y y coordinate.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {CanvasRenderingContext2D} g Canvas rendering context.\n * @param {string} s String to print.\n * @param {string} [color=undefinedColor] String color.\n * @param {number} [pivot=0] Pirvot.\n * @param {boolean} [left=false] Is left aligned.\n * @param {number} [transparencyRate=0.0] Transparency rate where 1.0 is fully transparent\n * @param {string} [separator=''] Is separator for sequence.\n * @param {boolean} [last=false] Is checker if element last or not.\n * @param drawStyle Is draw style. MSA - for multicharSeq, classic - for other seq.\n * @param maxWord Is array of max words for each line.\n * @param wordIdx Is index of word we currently draw.\n * @param gridCell Is grid cell.\n * @param referenceSequence Is reference sequence for diff mode.\n * @param maxLengthOfMonomer Is max length of monomer.\n * @return {number} x coordinate to start printing at.\n */\nexport const printLeftOrCentered = (x, y, w, h, g, s, color = undefinedColor, pivot = 0, left = false, transparencyRate = 1.0, separator = '', last = false, drawStyle = DrawStyle.classic, maxWord = {}, wordIdx = 0, gridCell = null, referenceSequence = [], maxLengthOfMonomer = null) => {\n var _a, _b, _c;\n g.textAlign = 'start';\n let colorPart = s.substring(0);\n let grayPart = last ? '' : separator;\n if (drawStyle === DrawStyle.MSA) {\n grayPart = '';\n }\n let colorCode = true;\n let compareWithCurrent = true;\n let highlightDifference = 'difference';\n if ((gridCell != null) && (gridCell.cell.column != null)) {\n colorCode = (_a = gridCell.cell.column.temp['color-code']) !== null && _a !== void 0 ? _a : true;\n compareWithCurrent = (_b = gridCell.cell.column.temp['compare-with-current']) !== null && _b !== void 0 ? _b : true;\n highlightDifference = (_c = gridCell.cell.column.temp['highlight-difference']) !== null && _c !== void 0 ? _c : 'difference';\n }\n const currentMonomer = referenceSequence[wordIdx];\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'difference')) {\n transparencyRate = (colorPart == currentMonomer) ? 0.3 : transparencyRate;\n }\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'equal')) {\n transparencyRate = (colorPart != currentMonomer) ? 0.3 : transparencyRate;\n }\n if (maxLengthOfMonomer != null) {\n colorPart = monomerToShortFunction(colorPart, maxLengthOfMonomer);\n }\n let textSize = g.measureText(colorPart + grayPart);\n const indent = 5;\n let maxColorTextSize = g.measureText(colorPart).width;\n let colorTextSize = g.measureText(colorPart).width;\n const dy = h / 2 - (textSize.fontBoundingBoxAscent + textSize.fontBoundingBoxDescent) / 2 + 1;\n textSize = textSize.width;\n if (drawStyle === DrawStyle.MSA) {\n maxColorTextSize = maxWord[wordIdx];\n textSize = maxWord[wordIdx];\n }\n function draw(dx1, dx2) {\n const drawColor = colorCode ? color : blackColor;\n g.fillStyle = drawColor;\n g.globalAlpha = transparencyRate;\n if (drawStyle === DrawStyle.classic) {\n g.fillText(colorPart, x + dx1, y + dy);\n g.fillStyle = grayColor;\n g.fillText(grayPart, x + dx2, y + dy);\n }\n if (drawStyle === DrawStyle.MSA) {\n g.fillStyle = drawColor;\n g.fillText(colorPart, x + dx1 + ((maxWord[wordIdx] - colorTextSize) / 2), y + dy);\n }\n }\n if (left || textSize > w) {\n draw(indent, indent + maxColorTextSize);\n return x + maxColorTextSize + g.measureText(grayPart).width;\n }\n else {\n const dx = (w - textSize) / 2;\n draw(dx, dx + maxColorTextSize);\n return x + dx + maxColorTextSize;\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1yZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNlbGwtcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDO0FBQzFDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUM1QixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUM7QUFDaEMsTUFBTSxzQkFBc0IsR0FBMEQsY0FBYyxDQUFDO0FBRXJHLE1BQU0sQ0FBTixJQUFZLFNBR1g7QUFIRCxXQUFZLFNBQVM7SUFDbkIsd0JBQVcsQ0FBQTtJQUNYLGdDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFIVyxTQUFTLEtBQVQsU0FBUyxRQUdwQjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FDakMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUMxQyxDQUEyQixFQUFFLENBQVMsRUFBRSxRQUFnQixjQUFjLEVBQ3RFLFFBQWdCLENBQUMsRUFBRSxJQUFJLEdBQUcsS0FBSyxFQUFFLG1CQUEyQixHQUFHLEVBQy9ELFlBQW9CLEVBQUUsRUFBRSxPQUFnQixLQUFLLEVBQUUsWUFBdUIsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUF1QyxFQUFFLEVBQUUsVUFBa0IsQ0FBQyxFQUFFLFdBQStCLElBQUksRUFBRSxvQkFBOEIsRUFBRSxFQUFFLHFCQUFvQyxJQUFJLEVBQVUsRUFBRTs7SUFDcFIsQ0FBQyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7SUFDdEIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3JDLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDL0IsUUFBUSxHQUFHLEVBQUUsQ0FBQztLQUNmO0lBQ0QsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBQzlCLElBQUksbUJBQW1CLEdBQUcsWUFBWSxDQUFDO0lBQ3ZDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsRUFBRTtRQUN4RCxTQUFTLEdBQUcsTUFBQSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLG1DQUFJLElBQUksQ0FBQztRQUM1RCxrQkFBa0IsR0FBRyxNQUFBLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxtQ0FBSSxJQUFJLENBQUM7UUFDL0UsbUJBQW1CLEdBQUcsTUFBQSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsbUNBQUksWUFBWSxDQUFDO0tBRXpGO0lBQ0QsTUFBTSxjQUFjLEdBQVcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUQsSUFBSSxrQkFBa0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixLQUFLLFlBQVksQ0FBQyxFQUFFO1FBQ2xHLGdCQUFnQixHQUFHLENBQUMsU0FBUyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO0tBQzNFO0lBQ0QsSUFBSSxrQkFBa0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixLQUFLLE9BQU8sQ0FBQyxFQUFFO1FBQzdGLGdCQUFnQixHQUFHLENBQUMsU0FBUyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO0tBQzNFO0lBQ0QsSUFBSSxrQkFBa0IsSUFBSSxJQUFJLEVBQUU7UUFDOUIsU0FBUyxHQUFHLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0tBQ25FO0lBR0QsSUFBSSxRQUFRLEdBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDeEQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRWpCLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdEQsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDbkQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlGLFFBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQzFCLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDL0IsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDN0I7SUFFRCxTQUFTLElBQUksQ0FBQyxHQUFXLEVBQUUsR0FBVztRQUNwQyxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQ2pELENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUM7UUFDakMsSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDLE9BQU8sRUFBRTtZQUNuQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUN4QixDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUN2QztRQUNELElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDeEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUNuRjtJQUNILENBQUM7SUFFRCxJQUFJLElBQUksSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLGdCQUFnQixDQUFDLENBQUM7UUFDeEMsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUM7S0FFN0Q7U0FBTTtRQUNMLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQztLQUNsQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmltcG9ydCB7bW9ub21lclRvU2hvcnR9IGZyb20gJy4vbWFjcm9tb2xlY3VsZSc7XG5cbmNvbnN0IHVuZGVmaW5lZENvbG9yID0gJ3JnYigxMDAsMTAwLDEwMCknO1xuY29uc3QgZ3JheUNvbG9yID0gJyM4MDgwODAnO1xuY29uc3QgYmxhY2tDb2xvciA9ICdyZ2IoMCwwLDApJztcbmNvbnN0IG1vbm9tZXJUb1Nob3J0RnVuY3Rpb246IChhbWlubzogc3RyaW5nLCBtYXhMZW5ndGhPZk1vbm9tZXI6IG51bWJlcikgPT4gc3RyaW5nID0gbW9ub21lclRvU2hvcnQ7XG5cbmV4cG9ydCBlbnVtIERyYXdTdHlsZSB7XG4gIE1TQSA9ICdNU0EnLFxuICBjbGFzc2ljID0gJ2NsYXNzaWMnLFxufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBwcmludHMgYSBzdHJpbmcgYWxpZ25lZCB0byBsZWZ0IG9yIGNlbnRlcmVkLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IHggY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB5IHkgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3IFdpZHRoLlxuICogQHBhcmFtIHtudW1iZXJ9IGggSGVpZ2h0LlxuICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGcgQ2FudmFzIHJlbmRlcmluZyBjb250ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IHMgU3RyaW5nIHRvIHByaW50LlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvcj11bmRlZmluZWRDb2xvcl0gU3RyaW5nIGNvbG9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtwaXZvdD0wXSBQaXJ2b3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtsZWZ0PWZhbHNlXSBJcyBsZWZ0IGFsaWduZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zcGFyZW5jeVJhdGU9MC4wXSBUcmFuc3BhcmVuY3kgcmF0ZSB3aGVyZSAxLjAgaXMgZnVsbHkgdHJhbnNwYXJlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPScnXSBJcyBzZXBhcmF0b3IgZm9yIHNlcXVlbmNlLlxuICogQHBhcmFtIHtib29sZWFufSBbbGFzdD1mYWxzZV0gSXMgY2hlY2tlciBpZiBlbGVtZW50IGxhc3Qgb3Igbm90LlxuICogQHBhcmFtIGRyYXdTdHlsZSBJcyBkcmF3IHN0eWxlLiBNU0EgLSBmb3IgbXVsdGljaGFyU2VxLCBjbGFzc2ljIC0gZm9yIG90aGVyIHNlcS5cbiAqIEBwYXJhbSBtYXhXb3JkIElzIGFycmF5IG9mIG1heCB3b3JkcyBmb3IgZWFjaCBsaW5lLlxuICogQHBhcmFtIHdvcmRJZHggSXMgaW5kZXggb2Ygd29yZCB3ZSBjdXJyZW50bHkgZHJhdy5cbiAqIEBwYXJhbSBncmlkQ2VsbCBJcyBncmlkIGNlbGwuXG4gKiBAcGFyYW0gcmVmZXJlbmNlU2VxdWVuY2UgSXMgcmVmZXJlbmNlIHNlcXVlbmNlIGZvciBkaWZmIG1vZGUuXG4gKiBAcGFyYW0gbWF4TGVuZ3RoT2ZNb25vbWVyIElzIG1heCBsZW5ndGggb2YgbW9ub21lci5cbiAqIEByZXR1cm4ge251bWJlcn0geCBjb29yZGluYXRlIHRvIHN0YXJ0IHByaW50aW5nIGF0LlxuICovXG5leHBvcnQgY29uc3QgcHJpbnRMZWZ0T3JDZW50ZXJlZCA9IChcbiAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICBnOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHM6IHN0cmluZywgY29sb3I6IHN0cmluZyA9IHVuZGVmaW5lZENvbG9yLFxuICBwaXZvdDogbnVtYmVyID0gMCwgbGVmdCA9IGZhbHNlLCB0cmFuc3BhcmVuY3lSYXRlOiBudW1iZXIgPSAxLjAsXG4gIHNlcGFyYXRvcjogc3RyaW5nID0gJycsIGxhc3Q6IGJvb2xlYW4gPSBmYWxzZSwgZHJhd1N0eWxlOiBEcmF3U3R5bGUgPSBEcmF3U3R5bGUuY2xhc3NpYywgbWF4V29yZDogeyBbaW5kZXg6IHN0cmluZ106IG51bWJlciB9ID0ge30sIHdvcmRJZHg6IG51bWJlciA9IDAsIGdyaWRDZWxsOiBERy5HcmlkQ2VsbCB8IG51bGwgPSBudWxsLCByZWZlcmVuY2VTZXF1ZW5jZTogc3RyaW5nW10gPSBbXSwgbWF4TGVuZ3RoT2ZNb25vbWVyOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IG51bWJlciA9PiB7XG4gIGcudGV4dEFsaWduID0gJ3N0YXJ0JztcbiAgbGV0IGNvbG9yUGFydCA9IHMuc3Vic3RyaW5nKDApO1xuICBsZXQgZ3JheVBhcnQgPSBsYXN0ID8gJycgOiBzZXBhcmF0b3I7XG4gIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICBncmF5UGFydCA9ICcnO1xuICB9XG4gIGxldCBjb2xvckNvZGUgPSB0cnVlO1xuICBsZXQgY29tcGFyZVdpdGhDdXJyZW50ID0gdHJ1ZTtcbiAgbGV0IGhpZ2hsaWdodERpZmZlcmVuY2UgPSAnZGlmZmVyZW5jZSc7XG4gIGlmICgoZ3JpZENlbGwgIT0gbnVsbCkgJiYgKGdyaWRDZWxsLmNlbGwuY29sdW1uICE9IG51bGwpKSB7XG4gICAgY29sb3JDb2RlID0gZ3JpZENlbGwuY2VsbC5jb2x1bW4udGVtcFsnY29sb3ItY29kZSddID8/IHRydWU7XG4gICAgY29tcGFyZVdpdGhDdXJyZW50ID0gZ3JpZENlbGwuY2VsbC5jb2x1bW4udGVtcFsnY29tcGFyZS13aXRoLWN1cnJlbnQnXSA/PyB0cnVlO1xuICAgIGhpZ2hsaWdodERpZmZlcmVuY2UgPSBncmlkQ2VsbC5jZWxsLmNvbHVtbi50ZW1wWydoaWdobGlnaHQtZGlmZmVyZW5jZSddID8/ICdkaWZmZXJlbmNlJztcblxuICB9XG4gIGNvbnN0IGN1cnJlbnRNb25vbWVyOiBzdHJpbmcgPSByZWZlcmVuY2VTZXF1ZW5jZVt3b3JkSWR4XTtcbiAgaWYgKGNvbXBhcmVXaXRoQ3VycmVudCAmJiAocmVmZXJlbmNlU2VxdWVuY2UubGVuZ3RoID4gMCkgJiYgKGhpZ2hsaWdodERpZmZlcmVuY2UgPT09ICdkaWZmZXJlbmNlJykpIHtcbiAgICB0cmFuc3BhcmVuY3lSYXRlID0gKGNvbG9yUGFydCA9PSBjdXJyZW50TW9ub21lcikgPyAwLjMgOiB0cmFuc3BhcmVuY3lSYXRlO1xuICB9XG4gIGlmIChjb21wYXJlV2l0aEN1cnJlbnQgJiYgKHJlZmVyZW5jZVNlcXVlbmNlLmxlbmd0aCA+IDApICYmIChoaWdobGlnaHREaWZmZXJlbmNlID09PSAnZXF1YWwnKSkge1xuICAgIHRyYW5zcGFyZW5jeVJhdGUgPSAoY29sb3JQYXJ0ICE9IGN1cnJlbnRNb25vbWVyKSA/IDAuMyA6IHRyYW5zcGFyZW5jeVJhdGU7XG4gIH1cbiAgaWYgKG1heExlbmd0aE9mTW9ub21lciAhPSBudWxsKSB7XG4gICAgY29sb3JQYXJ0ID0gbW9ub21lclRvU2hvcnRGdW5jdGlvbihjb2xvclBhcnQsIG1heExlbmd0aE9mTW9ub21lcik7XG4gIH1cblxuXG4gIGxldCB0ZXh0U2l6ZTogYW55ID0gZy5tZWFzdXJlVGV4dChjb2xvclBhcnQgKyBncmF5UGFydCk7XG4gIGNvbnN0IGluZGVudCA9IDU7XG5cbiAgbGV0IG1heENvbG9yVGV4dFNpemUgPSBnLm1lYXN1cmVUZXh0KGNvbG9yUGFydCkud2lkdGg7XG4gIGxldCBjb2xvclRleHRTaXplID0gZy5tZWFzdXJlVGV4dChjb2xvclBhcnQpLndpZHRoO1xuICBjb25zdCBkeSA9IGggLyAyIC0gKHRleHRTaXplLmZvbnRCb3VuZGluZ0JveEFzY2VudCArIHRleHRTaXplLmZvbnRCb3VuZGluZ0JveERlc2NlbnQpIC8gMiArIDE7XG4gIHRleHRTaXplID0gdGV4dFNpemUud2lkdGg7XG4gIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICBtYXhDb2xvclRleHRTaXplID0gbWF4V29yZFt3b3JkSWR4XTtcbiAgICB0ZXh0U2l6ZSA9IG1heFdvcmRbd29yZElkeF07XG4gIH1cblxuICBmdW5jdGlvbiBkcmF3KGR4MTogbnVtYmVyLCBkeDI6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGRyYXdDb2xvciA9IGNvbG9yQ29kZSA/IGNvbG9yIDogYmxhY2tDb2xvcjtcbiAgICBnLmZpbGxTdHlsZSA9IGRyYXdDb2xvcjtcbiAgICBnLmdsb2JhbEFscGhhID0gdHJhbnNwYXJlbmN5UmF0ZTtcbiAgICBpZiAoZHJhd1N0eWxlID09PSBEcmF3U3R5bGUuY2xhc3NpYykge1xuICAgICAgZy5maWxsVGV4dChjb2xvclBhcnQsIHggKyBkeDEsIHkgKyBkeSk7XG4gICAgICBnLmZpbGxTdHlsZSA9IGdyYXlDb2xvcjtcbiAgICAgIGcuZmlsbFRleHQoZ3JheVBhcnQsIHggKyBkeDIsIHkgKyBkeSk7XG4gICAgfVxuICAgIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICAgIGcuZmlsbFN0eWxlID0gZHJhd0NvbG9yO1xuICAgICAgZy5maWxsVGV4dChjb2xvclBhcnQsIHggKyBkeDEgKyAoKG1heFdvcmRbd29yZElkeF0gLSBjb2xvclRleHRTaXplKSAvIDIpLCB5ICsgZHkpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChsZWZ0IHx8IHRleHRTaXplID4gdykge1xuICAgIGRyYXcoaW5kZW50LCBpbmRlbnQgKyBtYXhDb2xvclRleHRTaXplKTtcbiAgICByZXR1cm4geCArIG1heENvbG9yVGV4dFNpemUgKyBnLm1lYXN1cmVUZXh0KGdyYXlQYXJ0KS53aWR0aDtcblxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGR4ID0gKHcgLSB0ZXh0U2l6ZSkgLyAyO1xuICAgIGRyYXcoZHgsIGR4ICsgbWF4Q29sb3JUZXh0U2l6ZSk7XG4gICAgcmV0dXJuIHggKyBkeCArIG1heENvbG9yVGV4dFNpemU7XG4gIH1cbn07XG5cbiJdfQ==","export function errorToConsole(err) {\n var _a;\n if (typeof err === 'string' || err instanceof String) {\n return err;\n }\n else if ('$thrownJsError' in err) {\n return errorToConsole(err['$thrownJsError']);\n }\n else if (err instanceof Error) {\n return (_a = err.stack) !== null && _a !== void 0 ? _a : err.message;\n }\n else {\n return err.toString();\n }\n}\nexport function rectToConsole(rect) {\n return `(x=${rect.x}, y=${rect.y}, w=${rect.width}, h=${rect.height})`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tY29uc29sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvLWNvbnNvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFROztJQUNyQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLFlBQVksTUFBTSxFQUFFO1FBQ3BELE9BQU8sR0FBYSxDQUFDO0tBQ3RCO1NBQU0sSUFBSSxnQkFBZ0IsSUFBSSxHQUFHLEVBQUU7UUFDbEMsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztLQUM5QztTQUFNLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRTtRQUMvQixPQUFPLE1BQUMsR0FBYSxDQUFDLEtBQUssbUNBQUssR0FBYSxDQUFDLE9BQU8sQ0FBQztLQUN2RDtTQUFNO1FBQ0wsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDdkI7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFhO0lBQ3pDLE9BQU8sTUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yVG9Db25zb2xlKGVycjogYW55KTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnIHx8IGVyciBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgIHJldHVybiBlcnIgYXMgc3RyaW5nO1xuICB9IGVsc2UgaWYgKCckdGhyb3duSnNFcnJvcicgaW4gZXJyKSB7XG4gICAgcmV0dXJuIGVycm9yVG9Db25zb2xlKGVyclsnJHRocm93bkpzRXJyb3InXSk7XG4gIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gKGVyciBhcyBFcnJvcikuc3RhY2sgPz8gKGVyciBhcyBFcnJvcikubWVzc2FnZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXJyLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY3RUb0NvbnNvbGUocmVjdDogREcuUmVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBgKHg9JHtyZWN0Lnh9LCB5PSR7cmVjdC55fSwgdz0ke3JlY3Qud2lkdGh9LCBoPSR7cmVjdC5oZWlnaHR9KWA7XG59XG4iXX0=","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {findMonomers, parseHelm, getParts} from './utils';\nimport {printLeftOrCentered} from '@datagrok-libraries/bio/src/utils/cell-renderer';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\n\n\nexport class HelmCellRenderer extends DG.GridCellRenderer {\n get name() { return 'helm'; }\n\n get cellType() { return 'helm'; }\n\n get defaultWidth(): number | null { return 400; }\n\n get defaultHeight(): number | null { return 100; }\n\n onMouseMove(gridCell: DG.GridCell, e: MouseEvent): void {\n try {\n const maxLengthWordsSum = gridCell.cell.column.temp['helm-sum-maxLengthWords'];\n const maxIndex = Object.values(gridCell.cell.column.temp['helm-maxLengthWords']).length - 1;\n const argsX = e.offsetX - gridCell.gridColumn.left + (gridCell.gridColumn.left - gridCell.bounds.x);\n let left = 0;\n let right = maxIndex;\n let found = false;\n maxLengthWordsSum[maxIndex + 1] = argsX + 1;\n let mid = 0;\n if (argsX > maxLengthWordsSum[0]) {\n while (!found) {\n mid = Math.floor((right + left) / 2);\n if (argsX >= maxLengthWordsSum[mid] && argsX <= maxLengthWordsSum[mid + 1]) {\n left = mid;\n found = true;\n } else if (argsX < maxLengthWordsSum[mid]) {\n right = mid - 1;\n } else if (argsX > maxLengthWordsSum[mid + 1]) {\n left = mid + 1;\n }\n if (left == right) {\n found = true;\n }\n }\n }\n left = (argsX >= maxLengthWordsSum[left]) ? left + 1 : left;\n const monomers = findMonomers(gridCell.cell.value);\n let s: string = gridCell.cell.value ?? '';\n let subParts: string[] = parseHelm(s);\n let allParts: string[] = getParts(subParts, s);\n let tooltipMessage: HTMLElement[] = [];\n for (let i = 0; i < allParts.length; ++i) {\n if (monomers.has(allParts[i]))\n tooltipMessage[i] = ui.divV([\n ui.divText(`Monomer ${allParts[i]} not found.`),\n ui.divText('Open the Context Panel, then expand Manage Libraries')\n ]);\n }\n (((tooltipMessage[left]?.childNodes.length ?? 0) > 0))\n ? ui.tooltip.show(ui.div(tooltipMessage[left]), e.x + 16, e.y + 16)\n : ui.tooltip.hide();\n } catch (err: any) {\n const errMsg: string = errorToConsole(err);\n console.error('Helm: HelmCellRenderer.onMouseMove() error:\\n' + errMsg);\n }\n }\n\n render(g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number,\n gridCell: DG.GridCell, cellStyle: DG.GridCellStyle\n ) {\n const grid = gridCell.gridRow !== -1 ? gridCell.grid : undefined;\n const undefinedColor = 'rgb(100,100,100)';\n const grayColor = '#808080';\n const monomers = findMonomers(gridCell.cell.value);\n let s: string = gridCell.cell.value ?? '';\n let subParts: string[] = parseHelm(s);\n if (monomers.size == 0 && grid) {\n const host = ui.div([], {style: {width: `${w}px`, height: `${h}px`}});\n host.setAttribute('dataformat', 'helm');\n host.setAttribute('data', gridCell.cell.value);\n gridCell.element = host;\n //@ts-ignore\n const canvas = new JSDraw2.Editor(host, {width: w, height: h, skin: 'w8', viewonly: true});\n return;\n } else {\n if (!grid) {\n const r = window.devicePixelRatio;\n h = 28;\n g.canvas.height = h*r;\n g.canvas.style.height = `${h}px`;\n }\n w = grid ? Math.min(grid.canvas.width - x, w) : g.canvas.width - x;\n g.save();\n g.beginPath();\n g.rect(x, y, w, h);\n g.clip();\n g.font = '12px monospace';\n g.textBaseline = 'top';\n let x1 = x;\n let maxLengthWords: any = {};\n let maxLengthWordSum: any = {};\n let allParts: string[] = getParts(subParts, s);\n for (let i = 0; i < allParts.length; ++i) {\n maxLengthWords[i] = allParts[i].length * 7;\n let color = monomers.has(allParts[i]) ? 'red' : grayColor;\n g.fillStyle = undefinedColor;\n x1 = printLeftOrCentered(x1, y, w, h, g, allParts[i], color, 0, true, 1.0);\n }\n\n maxLengthWordSum[0] = maxLengthWords[0];\n for (let i = 1; i < allParts.length; i++) {\n maxLengthWordSum[i] = maxLengthWordSum[i - 1] + maxLengthWords[i];\n }\n gridCell.cell.column.temp = {\n 'helm-sum-maxLengthWords': maxLengthWordSum,\n 'helm-maxLengthWords': maxLengthWords\n };\n g.restore();\n return;\n }\n }\n}\n","import * as DG from 'datagrok-api/dg';\nimport { UnitsHandler } from './units-handler';\nimport { getSplitterForColumn, getStats } from './macromolecule';\n/** Class for handling conversion of notation systems in Macromolecule columns */\nexport class NotationConverter extends UnitsHandler {\n get splitter() {\n if (this._splitter === null)\n this._splitter = getSplitterForColumn(this.column);\n return this._splitter;\n }\n toFasta(targetNotation) { return targetNotation === \"fasta\" /* NOTATION.FASTA */; }\n toSeparator(targetNotation) { return targetNotation === \"separator\" /* NOTATION.SEPARATOR */; }\n toHelm(targetNotation) { return targetNotation === \"helm\" /* NOTATION.HELM */; }\n /**\n * Convert a Macromolecule column from FASTA to SEPARATOR notation\n *\n * @param {string} separator A specific separator to be used\n * @param {string} fastaGapSymbol Gap symbol in FASTA, '-' by default\n * @return {DG.Column} A new column in SEPARATOR notation\n */\n convertFastaToSeparator(separator, fastaGapSymbol = null) {\n if (fastaGapSymbol === null)\n fastaGapSymbol = this.defaultGapSymbol;\n const newColumn = this.getNewColumn(\"separator\" /* NOTATION.SEPARATOR */);\n // assign the values to the newly created empty column\n newColumn.init((idx) => {\n const fastaPolymer = this.column.get(idx);\n const fastaMonomersArray = this.splitter(fastaPolymer);\n for (let i = 0; i < fastaMonomersArray.length; i++) {\n if (fastaMonomersArray[i] === fastaGapSymbol)\n fastaMonomersArray[i] = UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n }\n return fastaMonomersArray.join(separator);\n });\n newColumn.setTag(DG.TAGS.UNITS, \"separator\" /* NOTATION.SEPARATOR */);\n newColumn.setTag(\"separator\" /* TAGS.separator */, separator);\n return newColumn;\n }\n /**\n * Get the wrapper strings for HELM, depending on the type of the\n * macromolecule (peptide, DNA, RNA)\n *\n * @return {string[]} Array of wrappers\n */\n getHelmWrappers() {\n const prefix = (this.isDna()) ? 'DNA1{' :\n (this.isRna()) ? 'RNA1{' :\n (this.isPeptide()) ? 'PEPTIDE1{' :\n 'Unknown'; // this case should be handled as exceptional\n if (prefix === 'Unknown')\n throw new Error('Neither peptide, nor nucleotide');\n const postfix = '}$$$';\n const leftWrapper = (this.isDna()) ? 'D(' :\n (this.isRna()) ? 'R(' : ''; // no wrapper for peptides\n const rightWrapper = (this.isDna() || this.isRna()) ? ')P' : ''; // no wrapper for peptides\n return [prefix, leftWrapper, rightWrapper, postfix];\n }\n // A helper function for converting strings to HELM\n convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix) {\n const monomerArray = this.splitter(sourcePolymer);\n const monomerHelmArray = monomerArray.map((mm) => {\n if (mm === sourceGapSymbol)\n return UnitsHandler._defaultGapSymbolsDict.HELM;\n else\n return `${leftWrapper}${mm}${rightWrapper}`;\n });\n return `${prefix}${monomerHelmArray.join('.')}${postfix}`;\n }\n /**\n * Convert a string with SEPARATOR/FASTA notation to HELM\n *\n * @param {string} sourcePolymer A string to be converted\n * @param {string | null} sourceGapSymbol An optional gap symbol, set to\n * default values ('-' for FASTA and '' for SEPARATOR) unless specified\n * @return {string} The target HELM string\n */\n convertStringToHelm(sourcePolymer, sourceGapSymbol = null) {\n if (sourceGapSymbol === null)\n sourceGapSymbol = this.defaultGapSymbol;\n const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();\n return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);\n }\n /**\n * Convert a column to HELM\n *\n * @param {string | null} sourceGapSymbol\n * @return {DG.Column}\n */\n convertToHelm(sourceGapSymbol = null) {\n if (sourceGapSymbol === null)\n sourceGapSymbol = this.defaultGapSymbol;\n const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();\n const newColumn = this.getNewColumn(\"helm\" /* NOTATION.HELM */);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const sourcePolymer = this.column.get(idx);\n return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);\n });\n newColumn.setTag(DG.TAGS.UNITS, \"helm\" /* NOTATION.HELM */);\n return newColumn;\n }\n /**\n * Convert SEPARATOR column to FASTA notation\n *\n * @param {string | null} fastaGapSymbol Optional gap symbol for FASTA\n * @return {DG.Column} Converted column\n */\n convertSeparatorToFasta(fastaGapSymbol = null) {\n if (fastaGapSymbol === null)\n fastaGapSymbol = UnitsHandler._defaultGapSymbolsDict.FASTA;\n const newColumn = this.getNewColumn(\"fasta\" /* NOTATION.FASTA */);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const separatorPolymer = this.column.get(idx);\n // items can be monomers or separators\n const separatorItemsArray = this.splitter(separatorPolymer);\n const fastaMonomersArray = [];\n for (let i = 0; i < separatorItemsArray.length; i++) {\n const item = separatorItemsArray[i];\n if (item.length === 0) {\n fastaMonomersArray.push(fastaGapSymbol);\n }\n else if (item.length > 1) {\n // the case of a multi-character monomer\n const monomer = '[' + item + ']';\n fastaMonomersArray.push(monomer);\n }\n else {\n fastaMonomersArray.push(item);\n }\n }\n return fastaMonomersArray.join('');\n });\n newColumn.setTag(DG.TAGS.UNITS, \"fasta\" /* NOTATION.FASTA */);\n return newColumn;\n }\n /**\n * Convert HELM string to FASTA/SEPARATOR\n *\n * @param {string} helmPolymer A string to be converted\n * @param {string} tgtNotation Target notation: FASTA or SEPARATOR\n * @param {string} tgtSeparator Optional target separator (for HELM ->\n * @param {string | null} tgtGapSymbol Optional target gap symbol\n * SEPARATOR)\n * @return {string} Converted string\n */\n convertHelmToFastaSeparator(helmPolymer, tgtNotation, tgtSeparator, tgtGapSymbol) {\n if (!tgtGapSymbol) {\n tgtGapSymbol = (this.toFasta(tgtNotation)) ?\n UnitsHandler._defaultGapSymbolsDict.FASTA :\n UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n }\n if (!tgtSeparator) {\n tgtSeparator = (this.toFasta(tgtNotation)) ? '' : this.separator;\n }\n const helmWrappersRe = /(R\\(|D\\(|\\)|P)/g;\n const isNucleotide = helmPolymer.startsWith('DNA') || helmPolymer.startsWith('RNA');\n // items can be monomers or helms\n const helmItemsArray = this.splitter(helmPolymer);\n const tgtMonomersArray = [];\n for (let i = 0; i < helmItemsArray.length; i++) {\n let item = helmItemsArray[i];\n if (isNucleotide)\n item = item.replace(helmWrappersRe, '');\n if (item === UnitsHandler._defaultGapSymbolsDict.HELM) {\n tgtMonomersArray.push(tgtGapSymbol);\n }\n else if (this.toFasta(tgtNotation) && item.length > 1) {\n // the case of a multi-character monomer converted to FASTA\n const monomer = '[' + item + ']';\n tgtMonomersArray.push(monomer);\n }\n else {\n tgtMonomersArray.push(item);\n }\n }\n return tgtMonomersArray.join(tgtSeparator);\n }\n /**\n * Convert HELM column to FASTA/SEPARATOR\n *\n * @param {string} tgtNotation Target notation: FASTA or SEPARATOR\n * @param {string} tgtSeparator Optional target separator (for HELM ->\n * @param {string | null} tgtGapSymbol Optional target gap symbol\n * SEPARATOR)\n * @return {DG.Column} Converted column\n */\n convertHelm(tgtNotation, tgtSeparator, tgtGapSymbol) {\n // This function must not contain calls of isDna() and isRna(), for\n // source helm columns may contain RNA, DNA and PT across different rows\n const newColumn = this.getNewColumn(tgtNotation);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const helmPolymer = this.column.get(idx);\n return this.convertHelmToFastaSeparator(helmPolymer, tgtNotation, tgtSeparator, tgtGapSymbol);\n // we cannot use isDna() or isRna() because source helm columns can\n // contain DNA, RNA and PT in different cells, so the corresponding\n // tags cannot be set for the whole column\n });\n // TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n const splitter = getSplitterForColumn(newColumn);\n const stats = getStats(newColumn, 5, splitter);\n const aligned = stats.sameLength ? 'SEQ.MSA' : 'SEQ';\n newColumn.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n return newColumn;\n }\n convertHelmToSeparator() {\n // TODO: implementatioreturn this.getNewColumn();\n return this.getNewColumn(\"separator\" /* NOTATION.SEPARATOR */);\n }\n /** Dispatcher method for notation conversion\n *\n * @param {NOTATION} tgtNotation Notation we want to convert to\n * @param {string | null} tgtSeparator Possible separator\n * @return {DG.Column} Converted column\n */\n convert(tgtNotation, tgtSeparator = null) {\n // possible exceptions\n if (this.notation === tgtNotation)\n throw new Error('tgt notation is invalid');\n if (this.toSeparator(tgtNotation) && tgtSeparator === null)\n throw new Error('tgt separator is not specified');\n if (this.isFasta() && this.toSeparator(tgtNotation) && tgtSeparator !== null)\n return this.convertFastaToSeparator(tgtSeparator);\n else if ((this.isFasta() || this.isSeparator()) && this.toHelm(tgtNotation))\n return this.convertToHelm();\n else if (this.isSeparator() && this.toFasta(tgtNotation))\n return this.convertSeparatorToFasta();\n else if (this.isHelm() && this.toFasta(tgtNotation)) // the case of HELM\n return this.convertHelm(tgtNotation);\n else if (this.isHelm() && this.toSeparator(tgtNotation))\n return this.convertHelm(tgtNotation, tgtSeparator);\n else\n throw new Error('Not supported conversion ' +\n `from source notation '${this.notation}' to target notation '${tgtNotation}'.`);\n }\n constructor(col) {\n super(col);\n this._splitter = null;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90YXRpb24tY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibm90YXRpb24tY29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdEMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxRQUFRLEVBQTRDLE1BQU0saUJBQWlCLENBQUM7QUFFMUcsaUZBQWlGO0FBQ2pGLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxZQUFZO0lBR2pELElBQWMsUUFBUTtRQUNwQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSTtZQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxjQUF3QixJQUFhLE9BQU8sY0FBYyxpQ0FBbUIsQ0FBQyxDQUFDLENBQUM7SUFFeEYsV0FBVyxDQUFDLGNBQXdCLElBQWEsT0FBTyxjQUFjLHlDQUF1QixDQUFDLENBQUMsQ0FBQztJQUVoRyxNQUFNLENBQUMsY0FBd0IsSUFBYSxPQUFPLGNBQWMsK0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBRTdGOzs7Ozs7T0FNRztJQUNLLHVCQUF1QixDQUFDLFNBQWlCLEVBQUUsaUJBQWdDLElBQUk7UUFDckYsSUFBSSxjQUFjLEtBQUssSUFBSTtZQUN6QixjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBRXpDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLHNDQUFvQixDQUFDO1FBQ3hELHNEQUFzRDtRQUN0RCxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7WUFDN0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3ZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xELElBQUksa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEtBQUssY0FBYztvQkFDMUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQzthQUN6RTtZQUNELE9BQU8sa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssdUNBQXFCLENBQUM7UUFDcEQsU0FBUyxDQUFDLE1BQU0sbUNBQWlCLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGVBQWU7UUFDckIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3hCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUNoQyxTQUFTLENBQUMsQ0FBQyw2Q0FBNkM7UUFFOUQsSUFBSSxNQUFNLEtBQUssU0FBUztZQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFFckQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsMEJBQTBCO1FBQ3hELE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLDBCQUEwQjtRQUMzRixPQUFPLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELG1EQUFtRDtJQUMzQyxtQkFBbUIsQ0FDekIsYUFBcUIsRUFDckIsZUFBdUIsRUFDdkIsTUFBYyxFQUNkLFdBQW1CLEVBQ25CLFlBQW9CLEVBQ3BCLE9BQWU7UUFFZixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sZ0JBQWdCLEdBQWEsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQVUsRUFBRSxFQUFFO1lBQ2pFLElBQUksRUFBRSxLQUFLLGVBQWU7Z0JBQ3hCLE9BQU8sWUFBWSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQzs7Z0JBRWhELE9BQU8sR0FBRyxXQUFXLEdBQUcsRUFBRSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxHQUFHLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxtQkFBbUIsQ0FDeEIsYUFBcUIsRUFDckIsa0JBQWlDLElBQUk7UUFFckMsSUFBSSxlQUFlLEtBQUssSUFBSTtZQUMxQixlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDNUUsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5RyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxhQUFhLENBQUMsa0JBQWlDLElBQUk7UUFDekQsSUFBSSxlQUFlLEtBQUssSUFBSTtZQUMxQixlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBRTFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFNUUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksNEJBQWUsQ0FBQztRQUNuRCx3Q0FBd0M7UUFDeEMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFO1lBQzdCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxlQUFnQixFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9HLENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssNkJBQWdCLENBQUM7UUFDL0MsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssdUJBQXVCLENBQUMsaUJBQWdDLElBQUk7UUFDbEUsSUFBSSxjQUFjLEtBQUssSUFBSTtZQUN6QixjQUFjLEdBQUcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQztRQUU3RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSw4QkFBZ0IsQ0FBQztRQUNwRCx3Q0FBd0M7UUFDeEMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFO1lBQzdCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUMsc0NBQXNDO1lBQ3RDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzVELE1BQU0sa0JBQWtCLEdBQWEsRUFBRSxDQUFDO1lBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ25ELE1BQU0sSUFBSSxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUNyQixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsY0FBZSxDQUFDLENBQUM7aUJBQzFDO3FCQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzFCLHdDQUF3QztvQkFDeEMsTUFBTSxPQUFPLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7b0JBQ2pDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDbEM7cUJBQU07b0JBQ0wsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUMvQjthQUNGO1lBQ0QsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSywrQkFBaUIsQ0FBQztRQUNoRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksMkJBQTJCLENBQ2hDLFdBQW1CLEVBQ25CLFdBQW1CLEVBQ25CLFlBQXFCLEVBQ3JCLFlBQXFCO1FBRXJCLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxZQUFZLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUM7U0FDakQ7UUFFRCxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pCLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUM5RTtRQUNELE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRixpQ0FBaUM7UUFDakMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsRCxNQUFNLGdCQUFnQixHQUFhLEVBQUUsQ0FBQztRQUN0QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QyxJQUFJLElBQUksR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxZQUFZO2dCQUNkLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxQyxJQUFJLElBQUksS0FBSyxZQUFZLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFO2dCQUNyRCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBYSxDQUFDLENBQUM7YUFDdEM7aUJBQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQXVCLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDbkUsMkRBQTJEO2dCQUMzRCxNQUFNLE9BQU8sR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQztnQkFDakMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ2hDO2lCQUFNO2dCQUNMLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM3QjtTQUNGO1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssV0FBVyxDQUFDLFdBQW1CLEVBQUUsWUFBcUIsRUFBRSxZQUFxQjtRQUNuRixtRUFBbUU7UUFDbkUsd0VBQXdFO1FBQ3hFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBdUIsQ0FBQyxDQUFDO1FBQzdELHdDQUF3QztRQUN4QyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7WUFDN0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekMsT0FBTyxJQUFJLENBQUMsMkJBQTJCLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDOUYsbUVBQW1FO1lBQ25FLG1FQUFtRTtZQUNuRSwwQ0FBMEM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxpRkFBaUY7UUFDakYsTUFBTSxRQUFRLEdBQWlCLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sS0FBSyxHQUFnQixRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNyRCxTQUFTLENBQUMsTUFBTSwrQkFBZSxPQUFPLENBQUMsQ0FBQztRQUV4QyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLGlEQUFpRDtRQUNqRCxPQUFPLElBQUksQ0FBQyxZQUFZLHNDQUFvQixDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE9BQU8sQ0FBQyxXQUFxQixFQUFFLGVBQThCLElBQUk7UUFDdEUsc0JBQXNCO1FBQ3RCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxXQUFXO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksWUFBWSxLQUFLLElBQUk7WUFDeEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBRXBELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksWUFBWSxLQUFLLElBQUk7WUFDMUUsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUN6RSxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUN6QixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUN0RCxPQUFPLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2FBQ25DLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsbUJBQW1CO1lBQ3RFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNsQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztZQUNyRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFlBQWEsQ0FBQyxDQUFDOztZQUVwRCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQjtnQkFDekMseUJBQXlCLElBQUksQ0FBQyxRQUFRLHlCQUF5QixXQUFXLElBQUksQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRCxZQUFtQixHQUFjO1FBQy9CLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQTdRTCxjQUFTLEdBQXdCLElBQUksQ0FBQztJQThROUMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyogRG8gbm90IGNoYW5nZSB0aGVzZSBpbXBvcnQgbGluZXMgdG8gbWF0Y2ggZXh0ZXJuYWwgbW9kdWxlcyBpbiB3ZWJwYWNrIGNvbmZpZ3VyYXRpb24gKi9cbmltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmltcG9ydCB7VW5pdHNIYW5kbGVyfSBmcm9tICcuL3VuaXRzLWhhbmRsZXInO1xuaW1wb3J0IHtnZXRTcGxpdHRlckZvckNvbHVtbiwgZ2V0U3RhdHMsIE5PVEFUSU9OLCBTZXFDb2xTdGF0cywgU3BsaXR0ZXJGdW5jLCBUQUdTfSBmcm9tICcuL21hY3JvbW9sZWN1bGUnO1xuXG4vKiogQ2xhc3MgZm9yIGhhbmRsaW5nIGNvbnZlcnNpb24gb2Ygbm90YXRpb24gc3lzdGVtcyBpbiBNYWNyb21vbGVjdWxlIGNvbHVtbnMgKi9cbmV4cG9ydCBjbGFzcyBOb3RhdGlvbkNvbnZlcnRlciBleHRlbmRzIFVuaXRzSGFuZGxlciB7XG4gIHByaXZhdGUgX3NwbGl0dGVyOiBTcGxpdHRlckZ1bmMgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgZ2V0IHNwbGl0dGVyKCk6IFNwbGl0dGVyRnVuYyB7XG4gICAgaWYgKHRoaXMuX3NwbGl0dGVyID09PSBudWxsKVxuICAgICAgdGhpcy5fc3BsaXR0ZXIgPSBnZXRTcGxpdHRlckZvckNvbHVtbih0aGlzLmNvbHVtbik7XG4gICAgcmV0dXJuIHRoaXMuX3NwbGl0dGVyO1xuICB9XG5cbiAgcHVibGljIHRvRmFzdGEodGFyZ2V0Tm90YXRpb246IE5PVEFUSU9OKTogYm9vbGVhbiB7IHJldHVybiB0YXJnZXROb3RhdGlvbiA9PT0gTk9UQVRJT04uRkFTVEE7IH1cblxuICBwdWJsaWMgdG9TZXBhcmF0b3IodGFyZ2V0Tm90YXRpb246IE5PVEFUSU9OKTogYm9vbGVhbiB7IHJldHVybiB0YXJnZXROb3RhdGlvbiA9PT0gTk9UQVRJT04uU0VQQVJBVE9SOyB9XG5cbiAgcHVibGljIHRvSGVsbSh0YXJnZXROb3RhdGlvbjogTk9UQVRJT04pOiBib29sZWFuIHsgcmV0dXJuIHRhcmdldE5vdGF0aW9uID09PSBOT1RBVElPTi5IRUxNOyB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBNYWNyb21vbGVjdWxlIGNvbHVtbiBmcm9tIEZBU1RBIHRvIFNFUEFSQVRPUiBub3RhdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VwYXJhdG9yICBBIHNwZWNpZmljIHNlcGFyYXRvciB0byBiZSB1c2VkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYXN0YUdhcFN5bWJvbCAgR2FwIHN5bWJvbCBpbiBGQVNUQSwgJy0nIGJ5IGRlZmF1bHRcbiAgICogQHJldHVybiB7REcuQ29sdW1ufSAgICAgICAgQSBuZXcgY29sdW1uIGluIFNFUEFSQVRPUiBub3RhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0RmFzdGFUb1NlcGFyYXRvcihzZXBhcmF0b3I6IHN0cmluZywgZmFzdGFHYXBTeW1ib2w6IHN0cmluZyB8IG51bGwgPSBudWxsKTogREcuQ29sdW1uIHtcbiAgICBpZiAoZmFzdGFHYXBTeW1ib2wgPT09IG51bGwpXG4gICAgICBmYXN0YUdhcFN5bWJvbCA9IHRoaXMuZGVmYXVsdEdhcFN5bWJvbDtcblxuICAgIGNvbnN0IG5ld0NvbHVtbiA9IHRoaXMuZ2V0TmV3Q29sdW1uKE5PVEFUSU9OLlNFUEFSQVRPUik7XG4gICAgLy8gYXNzaWduIHRoZSB2YWx1ZXMgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgZW1wdHkgY29sdW1uXG4gICAgbmV3Q29sdW1uLmluaXQoKGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBmYXN0YVBvbHltZXIgPSB0aGlzLmNvbHVtbi5nZXQoaWR4KTtcbiAgICAgIGNvbnN0IGZhc3RhTW9ub21lcnNBcnJheSA9IHRoaXMuc3BsaXR0ZXIoZmFzdGFQb2x5bWVyKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmFzdGFNb25vbWVyc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChmYXN0YU1vbm9tZXJzQXJyYXlbaV0gPT09IGZhc3RhR2FwU3ltYm9sKVxuICAgICAgICAgIGZhc3RhTW9ub21lcnNBcnJheVtpXSA9IFVuaXRzSGFuZGxlci5fZGVmYXVsdEdhcFN5bWJvbHNEaWN0LlNFUEFSQVRPUjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYXN0YU1vbm9tZXJzQXJyYXkuam9pbihzZXBhcmF0b3IpO1xuICAgIH0pO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgTk9UQVRJT04uU0VQQVJBVE9SKTtcbiAgICBuZXdDb2x1bW4uc2V0VGFnKFRBR1Muc2VwYXJhdG9yLCBzZXBhcmF0b3IpO1xuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB3cmFwcGVyIHN0cmluZ3MgZm9yIEhFTE0sIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGVcbiAgICogbWFjcm9tb2xlY3VsZSAocGVwdGlkZSwgRE5BLCBSTkEpXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBcnJheSBvZiB3cmFwcGVyc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRIZWxtV3JhcHBlcnMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHByZWZpeCA9ICh0aGlzLmlzRG5hKCkpID8gJ0ROQTF7JyA6XG4gICAgICAodGhpcy5pc1JuYSgpKSA/ICdSTkExeycgOlxuICAgICAgICAodGhpcy5pc1BlcHRpZGUoKSkgPyAnUEVQVElERTF7JyA6XG4gICAgICAgICAgJ1Vua25vd24nOyAvLyB0aGlzIGNhc2Ugc2hvdWxkIGJlIGhhbmRsZWQgYXMgZXhjZXB0aW9uYWxcblxuICAgIGlmIChwcmVmaXggPT09ICdVbmtub3duJylcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVpdGhlciBwZXB0aWRlLCBub3IgbnVjbGVvdGlkZScpO1xuXG4gICAgY29uc3QgcG9zdGZpeCA9ICd9JCQkJztcbiAgICBjb25zdCBsZWZ0V3JhcHBlciA9ICh0aGlzLmlzRG5hKCkpID8gJ0QoJyA6XG4gICAgICAodGhpcy5pc1JuYSgpKSA/ICdSKCcgOiAnJzsgLy8gbm8gd3JhcHBlciBmb3IgcGVwdGlkZXNcbiAgICBjb25zdCByaWdodFdyYXBwZXIgPSAodGhpcy5pc0RuYSgpIHx8IHRoaXMuaXNSbmEoKSkgPyAnKVAnIDogJyc7IC8vIG5vIHdyYXBwZXIgZm9yIHBlcHRpZGVzXG4gICAgcmV0dXJuIFtwcmVmaXgsIGxlZnRXcmFwcGVyLCByaWdodFdyYXBwZXIsIHBvc3RmaXhdO1xuICB9XG5cbiAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgc3RyaW5ncyB0byBIRUxNXG4gIHByaXZhdGUgY29udmVydFRvSGVsbUhlbHBlcihcbiAgICBzb3VyY2VQb2x5bWVyOiBzdHJpbmcsXG4gICAgc291cmNlR2FwU3ltYm9sOiBzdHJpbmcsXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgbGVmdFdyYXBwZXI6IHN0cmluZyxcbiAgICByaWdodFdyYXBwZXI6IHN0cmluZyxcbiAgICBwb3N0Zml4OiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb25vbWVyQXJyYXkgPSB0aGlzLnNwbGl0dGVyKHNvdXJjZVBvbHltZXIpO1xuICAgIGNvbnN0IG1vbm9tZXJIZWxtQXJyYXk6IHN0cmluZ1tdID0gbW9ub21lckFycmF5Lm1hcCgobW06IHN0cmluZykgPT4ge1xuICAgICAgaWYgKG1tID09PSBzb3VyY2VHYXBTeW1ib2wpXG4gICAgICAgIHJldHVybiBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5IRUxNO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gYCR7bGVmdFdyYXBwZXJ9JHttbX0ke3JpZ2h0V3JhcHBlcn1gO1xuICAgIH0pO1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHttb25vbWVySGVsbUFycmF5LmpvaW4oJy4nKX0ke3Bvc3RmaXh9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgc3RyaW5nIHdpdGggU0VQQVJBVE9SL0ZBU1RBIG5vdGF0aW9uIHRvIEhFTE1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBvbHltZXIgIEEgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IHNvdXJjZUdhcFN5bWJvbCAgQW4gb3B0aW9uYWwgZ2FwIHN5bWJvbCwgc2V0IHRvXG4gICAqIGRlZmF1bHQgdmFsdWVzICgnLScgZm9yIEZBU1RBIGFuZCAnJyBmb3IgU0VQQVJBVE9SKSB1bmxlc3Mgc3BlY2lmaWVkXG4gICAqIEByZXR1cm4ge3N0cmluZ30gIFRoZSB0YXJnZXQgSEVMTSBzdHJpbmdcbiAgICovXG4gIHB1YmxpYyBjb252ZXJ0U3RyaW5nVG9IZWxtKFxuICAgIHNvdXJjZVBvbHltZXI6IHN0cmluZyxcbiAgICBzb3VyY2VHYXBTeW1ib2w6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKHNvdXJjZUdhcFN5bWJvbCA9PT0gbnVsbClcbiAgICAgIHNvdXJjZUdhcFN5bWJvbCA9IHRoaXMuZGVmYXVsdEdhcFN5bWJvbDtcbiAgICBjb25zdCBbcHJlZml4LCBsZWZ0V3JhcHBlciwgcmlnaHRXcmFwcGVyLCBwb3N0Zml4XSA9IHRoaXMuZ2V0SGVsbVdyYXBwZXJzKCk7XG4gICAgcmV0dXJuIHRoaXMuY29udmVydFRvSGVsbUhlbHBlcihzb3VyY2VQb2x5bWVyLCBzb3VyY2VHYXBTeW1ib2wsIHByZWZpeCwgbGVmdFdyYXBwZXIsIHJpZ2h0V3JhcHBlciwgcG9zdGZpeCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIGNvbHVtbiB0byBIRUxNXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gc291cmNlR2FwU3ltYm9sXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICovXG4gIHByaXZhdGUgY29udmVydFRvSGVsbShzb3VyY2VHYXBTeW1ib2w6IHN0cmluZyB8IG51bGwgPSBudWxsKTogREcuQ29sdW1uIHtcbiAgICBpZiAoc291cmNlR2FwU3ltYm9sID09PSBudWxsKVxuICAgICAgc291cmNlR2FwU3ltYm9sID0gdGhpcy5kZWZhdWx0R2FwU3ltYm9sO1xuXG4gICAgY29uc3QgW3ByZWZpeCwgbGVmdFdyYXBwZXIsIHJpZ2h0V3JhcHBlciwgcG9zdGZpeF0gPSB0aGlzLmdldEhlbG1XcmFwcGVycygpO1xuXG4gICAgY29uc3QgbmV3Q29sdW1uID0gdGhpcy5nZXROZXdDb2x1bW4oTk9UQVRJT04uSEVMTSk7XG4gICAgLy8gYXNzaWduIHRoZSB2YWx1ZXMgdG8gdGhlIGVtcHR5IGNvbHVtblxuICAgIG5ld0NvbHVtbi5pbml0KChpZHg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qgc291cmNlUG9seW1lciA9IHRoaXMuY29sdW1uLmdldChpZHgpO1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFRvSGVsbUhlbHBlcihzb3VyY2VQb2x5bWVyLCBzb3VyY2VHYXBTeW1ib2whLCBwcmVmaXgsIGxlZnRXcmFwcGVyLCByaWdodFdyYXBwZXIsIHBvc3RmaXgpO1xuICAgIH0pO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgTk9UQVRJT04uSEVMTSk7XG4gICAgcmV0dXJuIG5ld0NvbHVtbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IFNFUEFSQVRPUiBjb2x1bW4gdG8gRkFTVEEgbm90YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBmYXN0YUdhcFN5bWJvbCBPcHRpb25hbCBnYXAgc3ltYm9sIGZvciBGQVNUQVxuICAgKiBAcmV0dXJuIHtERy5Db2x1bW59ICBDb252ZXJ0ZWQgY29sdW1uXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRTZXBhcmF0b3JUb0Zhc3RhKGZhc3RhR2FwU3ltYm9sOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IERHLkNvbHVtbiB7XG4gICAgaWYgKGZhc3RhR2FwU3ltYm9sID09PSBudWxsKVxuICAgICAgZmFzdGFHYXBTeW1ib2wgPSBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5GQVNUQTtcblxuICAgIGNvbnN0IG5ld0NvbHVtbiA9IHRoaXMuZ2V0TmV3Q29sdW1uKE5PVEFUSU9OLkZBU1RBKTtcbiAgICAvLyBhc3NpZ24gdGhlIHZhbHVlcyB0byB0aGUgZW1wdHkgY29sdW1uXG4gICAgbmV3Q29sdW1uLmluaXQoKGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBzZXBhcmF0b3JQb2x5bWVyID0gdGhpcy5jb2x1bW4uZ2V0KGlkeCk7XG4gICAgICAvLyBpdGVtcyBjYW4gYmUgbW9ub21lcnMgb3Igc2VwYXJhdG9yc1xuICAgICAgY29uc3Qgc2VwYXJhdG9ySXRlbXNBcnJheSA9IHRoaXMuc3BsaXR0ZXIoc2VwYXJhdG9yUG9seW1lcik7XG4gICAgICBjb25zdCBmYXN0YU1vbm9tZXJzQXJyYXk6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlcGFyYXRvckl0ZW1zQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHNlcGFyYXRvckl0ZW1zQXJyYXlbaV07XG4gICAgICAgIGlmIChpdGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGZhc3RhTW9ub21lcnNBcnJheS5wdXNoKGZhc3RhR2FwU3ltYm9sISk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gdGhlIGNhc2Ugb2YgYSBtdWx0aS1jaGFyYWN0ZXIgbW9ub21lclxuICAgICAgICAgIGNvbnN0IG1vbm9tZXIgPSAnWycgKyBpdGVtICsgJ10nO1xuICAgICAgICAgIGZhc3RhTW9ub21lcnNBcnJheS5wdXNoKG1vbm9tZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZhc3RhTW9ub21lcnNBcnJheS5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFzdGFNb25vbWVyc0FycmF5LmpvaW4oJycpO1xuICAgIH0pO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgTk9UQVRJT04uRkFTVEEpO1xuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH1cblxuICAvKipcbiAgICogIENvbnZlcnQgSEVMTSBzdHJpbmcgdG8gRkFTVEEvU0VQQVJBVE9SXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWxtUG9seW1lciAgICBBIHN0cmluZyB0byBiZSBjb252ZXJ0ZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRndE5vdGF0aW9uICAgIFRhcmdldCBub3RhdGlvbjogRkFTVEEgb3IgU0VQQVJBVE9SXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0Z3RTZXBhcmF0b3IgICBPcHRpb25hbCB0YXJnZXQgc2VwYXJhdG9yIChmb3IgSEVMTSAtPlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IHRndEdhcFN5bWJvbCAgIE9wdGlvbmFsIHRhcmdldCBnYXAgc3ltYm9sXG4gICAqIFNFUEFSQVRPUilcbiAgICogQHJldHVybiB7c3RyaW5nfSBDb252ZXJ0ZWQgc3RyaW5nXG4gICAqL1xuICBwdWJsaWMgY29udmVydEhlbG1Ub0Zhc3RhU2VwYXJhdG9yKFxuICAgIGhlbG1Qb2x5bWVyOiBzdHJpbmcsIFxuICAgIHRndE5vdGF0aW9uOiBzdHJpbmcsIFxuICAgIHRndFNlcGFyYXRvcj86IHN0cmluZywgXG4gICAgdGd0R2FwU3ltYm9sPzogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKCF0Z3RHYXBTeW1ib2wpIHtcbiAgICAgIHRndEdhcFN5bWJvbCA9ICh0aGlzLnRvRmFzdGEodGd0Tm90YXRpb24gYXMgTk9UQVRJT04pKSA/XG4gICAgICAgIFVuaXRzSGFuZGxlci5fZGVmYXVsdEdhcFN5bWJvbHNEaWN0LkZBU1RBIDpcbiAgICAgICAgVW5pdHNIYW5kbGVyLl9kZWZhdWx0R2FwU3ltYm9sc0RpY3QuU0VQQVJBVE9SO1xuICAgIH1cblxuICAgIGlmICghdGd0U2VwYXJhdG9yKSB7XG4gICAgICB0Z3RTZXBhcmF0b3IgPSAodGhpcy50b0Zhc3RhKHRndE5vdGF0aW9uIGFzIE5PVEFUSU9OKSkgPyAnJyA6IHRoaXMuc2VwYXJhdG9yO1xuICAgIH1cbiAgICBjb25zdCBoZWxtV3JhcHBlcnNSZSA9IC8oUlxcKHxEXFwofFxcKXxQKS9nO1xuICAgIGNvbnN0IGlzTnVjbGVvdGlkZSA9IGhlbG1Qb2x5bWVyLnN0YXJ0c1dpdGgoJ0ROQScpIHx8IGhlbG1Qb2x5bWVyLnN0YXJ0c1dpdGgoJ1JOQScpO1xuICAgIC8vIGl0ZW1zIGNhbiBiZSBtb25vbWVycyBvciBoZWxtc1xuICAgIGNvbnN0IGhlbG1JdGVtc0FycmF5ID0gdGhpcy5zcGxpdHRlcihoZWxtUG9seW1lcik7XG4gICAgY29uc3QgdGd0TW9ub21lcnNBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlbG1JdGVtc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgaXRlbSA9IGhlbG1JdGVtc0FycmF5W2ldO1xuICAgICAgaWYgKGlzTnVjbGVvdGlkZSlcbiAgICAgICAgaXRlbSA9IGl0ZW0ucmVwbGFjZShoZWxtV3JhcHBlcnNSZSwgJycpO1xuICAgICAgaWYgKGl0ZW0gPT09IFVuaXRzSGFuZGxlci5fZGVmYXVsdEdhcFN5bWJvbHNEaWN0LkhFTE0pIHtcbiAgICAgICAgdGd0TW9ub21lcnNBcnJheS5wdXNoKHRndEdhcFN5bWJvbCEpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnRvRmFzdGEodGd0Tm90YXRpb24gYXMgTk9UQVRJT04pICYmIGl0ZW0ubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyB0aGUgY2FzZSBvZiBhIG11bHRpLWNoYXJhY3RlciBtb25vbWVyIGNvbnZlcnRlZCB0byBGQVNUQVxuICAgICAgICBjb25zdCBtb25vbWVyID0gJ1snICsgaXRlbSArICddJztcbiAgICAgICAgdGd0TW9ub21lcnNBcnJheS5wdXNoKG1vbm9tZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGd0TW9ub21lcnNBcnJheS5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGd0TW9ub21lcnNBcnJheS5qb2luKHRndFNlcGFyYXRvcik7XG4gIH1cblxuICAvKipcbiAgICogIENvbnZlcnQgSEVMTSBjb2x1bW4gdG8gRkFTVEEvU0VQQVJBVE9SXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0Z3ROb3RhdGlvbiAgICBUYXJnZXQgbm90YXRpb246IEZBU1RBIG9yIFNFUEFSQVRPUlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGd0U2VwYXJhdG9yICAgT3B0aW9uYWwgdGFyZ2V0IHNlcGFyYXRvciAoZm9yIEhFTE0gLT5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSB0Z3RHYXBTeW1ib2wgICBPcHRpb25hbCB0YXJnZXQgZ2FwIHN5bWJvbFxuICAgKiBTRVBBUkFUT1IpXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn0gQ29udmVydGVkIGNvbHVtblxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0SGVsbSh0Z3ROb3RhdGlvbjogc3RyaW5nLCB0Z3RTZXBhcmF0b3I/OiBzdHJpbmcsIHRndEdhcFN5bWJvbD86IHN0cmluZyk6IERHLkNvbHVtbiB7XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBjb250YWluIGNhbGxzIG9mIGlzRG5hKCkgYW5kIGlzUm5hKCksIGZvclxuICAgIC8vIHNvdXJjZSBoZWxtIGNvbHVtbnMgbWF5IGNvbnRhaW4gUk5BLCBETkEgYW5kIFBUIGFjcm9zcyBkaWZmZXJlbnQgcm93c1xuICAgIGNvbnN0IG5ld0NvbHVtbiA9IHRoaXMuZ2V0TmV3Q29sdW1uKHRndE5vdGF0aW9uIGFzIE5PVEFUSU9OKTtcbiAgICAvLyBhc3NpZ24gdGhlIHZhbHVlcyB0byB0aGUgZW1wdHkgY29sdW1uXG4gICAgbmV3Q29sdW1uLmluaXQoKGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBoZWxtUG9seW1lciA9IHRoaXMuY29sdW1uLmdldChpZHgpO1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEhlbG1Ub0Zhc3RhU2VwYXJhdG9yKGhlbG1Qb2x5bWVyLCB0Z3ROb3RhdGlvbiwgdGd0U2VwYXJhdG9yLCB0Z3RHYXBTeW1ib2wpO1xuICAgICAgLy8gd2UgY2Fubm90IHVzZSBpc0RuYSgpIG9yIGlzUm5hKCkgYmVjYXVzZSBzb3VyY2UgaGVsbSBjb2x1bW5zIGNhblxuICAgICAgLy8gY29udGFpbiBETkEsIFJOQSBhbmQgUFQgaW4gZGlmZmVyZW50IGNlbGxzLCBzbyB0aGUgY29ycmVzcG9uZGluZ1xuICAgICAgLy8gdGFncyBjYW5ub3QgYmUgc2V0IGZvciB0aGUgd2hvbGUgY29sdW1uXG4gICAgfSk7XG5cbiAgICAvLyBUQUdTLmFsaWduZWQgaXMgbWFuZGF0b3J5IGZvciBjb2x1bW5zIG9mIE5PVEFUSU9OLkZBU1RBIGFuZCBOT1RBVElPTi5TRVBBUkFUT1JcbiAgICBjb25zdCBzcGxpdHRlcjogU3BsaXR0ZXJGdW5jID0gZ2V0U3BsaXR0ZXJGb3JDb2x1bW4obmV3Q29sdW1uKTtcbiAgICBjb25zdCBzdGF0czogU2VxQ29sU3RhdHMgPSBnZXRTdGF0cyhuZXdDb2x1bW4sIDUsIHNwbGl0dGVyKTtcbiAgICBjb25zdCBhbGlnbmVkID0gc3RhdHMuc2FtZUxlbmd0aCA/ICdTRVEuTVNBJyA6ICdTRVEnO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoVEFHUy5hbGlnbmVkLCBhbGlnbmVkKTtcblxuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRIZWxtVG9TZXBhcmF0b3IoKTogREcuQ29sdW1uIHtcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnRhdGlvcmV0dXJuIHRoaXMuZ2V0TmV3Q29sdW1uKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmV3Q29sdW1uKE5PVEFUSU9OLlNFUEFSQVRPUik7XG4gIH1cblxuICAvKiogRGlzcGF0Y2hlciBtZXRob2QgZm9yIG5vdGF0aW9uIGNvbnZlcnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtOT1RBVElPTn0gdGd0Tm90YXRpb24gICBOb3RhdGlvbiB3ZSB3YW50IHRvIGNvbnZlcnQgdG9cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSB0Z3RTZXBhcmF0b3IgICBQb3NzaWJsZSBzZXBhcmF0b3JcbiAgICogQHJldHVybiB7REcuQ29sdW1ufSAgICAgICAgICAgICAgICBDb252ZXJ0ZWQgY29sdW1uXG4gICAqL1xuICBwdWJsaWMgY29udmVydCh0Z3ROb3RhdGlvbjogTk9UQVRJT04sIHRndFNlcGFyYXRvcjogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBERy5Db2x1bW4ge1xuICAgIC8vIHBvc3NpYmxlIGV4Y2VwdGlvbnNcbiAgICBpZiAodGhpcy5ub3RhdGlvbiA9PT0gdGd0Tm90YXRpb24pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RndCBub3RhdGlvbiBpcyBpbnZhbGlkJyk7XG4gICAgaWYgKHRoaXMudG9TZXBhcmF0b3IodGd0Tm90YXRpb24pICYmIHRndFNlcGFyYXRvciA9PT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGd0IHNlcGFyYXRvciBpcyBub3Qgc3BlY2lmaWVkJyk7XG5cbiAgICBpZiAodGhpcy5pc0Zhc3RhKCkgJiYgdGhpcy50b1NlcGFyYXRvcih0Z3ROb3RhdGlvbikgJiYgdGd0U2VwYXJhdG9yICE9PSBudWxsKVxuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEZhc3RhVG9TZXBhcmF0b3IodGd0U2VwYXJhdG9yKTtcbiAgICBlbHNlIGlmICgodGhpcy5pc0Zhc3RhKCkgfHwgdGhpcy5pc1NlcGFyYXRvcigpKSAmJiB0aGlzLnRvSGVsbSh0Z3ROb3RhdGlvbikpXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VG9IZWxtKCk7XG4gICAgZWxzZSBpZiAodGhpcy5pc1NlcGFyYXRvcigpICYmIHRoaXMudG9GYXN0YSh0Z3ROb3RhdGlvbikpXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0U2VwYXJhdG9yVG9GYXN0YSgpO1xuICAgIGVsc2UgaWYgKHRoaXMuaXNIZWxtKCkgJiYgdGhpcy50b0Zhc3RhKHRndE5vdGF0aW9uKSkgLy8gdGhlIGNhc2Ugb2YgSEVMTVxuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEhlbG0odGd0Tm90YXRpb24pO1xuICAgIGVsc2UgaWYgKHRoaXMuaXNIZWxtKCkgJiYgdGhpcy50b1NlcGFyYXRvcih0Z3ROb3RhdGlvbikpXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0SGVsbSh0Z3ROb3RhdGlvbiwgdGd0U2VwYXJhdG9yISk7XG4gICAgZWxzZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIGNvbnZlcnNpb24gJyArXG4gICAgICAgIGBmcm9tIHNvdXJjZSBub3RhdGlvbiAnJHt0aGlzLm5vdGF0aW9ufScgdG8gdGFyZ2V0IG5vdGF0aW9uICcke3RndE5vdGF0aW9ufScuYCk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29sOiBERy5Db2x1bW4pIHtcbiAgICBzdXBlcihjb2wpO1xuICB9XG59XG4iXX0=","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {WebEditorMonomer, RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from './constants';\nimport {HelmWebEditor} from './helm-web-editor';\nimport {HelmCellRenderer} from './cell-renderer';\nimport {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types';\nimport {NotationConverter} from '@datagrok-libraries/bio/src/utils/notation-converter';\nimport {findMonomers} from './utils';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\nimport { NOTATION } from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nexport const _package = new DG.Package();\nlet monomerLib: IMonomerLib | null = null;\n\n//tags: init\nexport async function initHelm(): Promise<void> {\n return Promise.all([new Promise((resolve, reject) => {\n // @ts-ignore\n dojo.ready(function() { resolve(null); });\n }), await grok.functions.call('Bio:getBioLib')]).then(([_, lib]: [void, IMonomerLib]) => {\n monomerLib = lib;\n rewriteLibraries(); // initHelm()\n monomerLib.onChanged.subscribe((_) => {\n try {\n rewriteLibraries(); // initHelm()\n\n const monTypeList: string[] = monomerLib.getTypes();\n const msgStr: string = 'Monomer lib updated:<br />' + (\n monTypeList.length == 0 ? 'empty' : monTypeList.map((monType) => {\n return `${monType} ${monomerLib.getMonomerNamesByType(monType).length}`;\n }).join('<br />'));\n\n grok.shell.info(msgStr);\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Helm: initHelm monomerLib.onChanged() error:\\n' + errMsg);\n // throw err; // Prevent disabling event handler\n }\n });\n });\n}\n\nfunction rewriteLibraries() {\n org.helm.webeditor.Monomers.clear();\n monomerLib.getTypes().forEach((type) => {\n const mms = monomerLib.getMonomerNamesByType(type);\n mms.forEach((symbol) => {\n let isBroken = false;\n const monomer: Monomer = monomerLib.getMonomer(type, symbol);\n const webEditorMonomer: WebEditorMonomer = {\n id: symbol,\n m: monomer.molfile,\n n: monomer.name,\n na: monomer.naturalAnalog,\n rs: monomer.rgroups.length,\n type: monomer.polymerType,\n mt: monomer.monomerType,\n at: {}\n };\n\n if (monomer.rgroups.length > 0) {\n webEditorMonomer.rs = monomer.rgroups.length;\n const at = {};\n monomer.rgroups.forEach(it => {\n at[it[RGROUP_LABEL]] = it[RGROUP_CAP_GROUP_NAME];\n });\n webEditorMonomer.at = at;\n } else if (monomer.data[SMILES] != null) {\n webEditorMonomer.rs = Object.keys(getRS(monomer.data[SMILES].toString())).length;\n webEditorMonomer.at = getRS(monomer.data[SMILES].toString());\n } else {\n isBroken = true;\n }\n\n if (!isBroken)\n org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);\n });\n });\n\n // Obsolete\n let grid: DG.Grid = grok.shell.tv.grid;\n if (grid) grid.invalidate();\n}\n\n//name: helmCellRenderer\n//tags: cellRenderer\n//meta.cellType: helm\n//meta.columnTags: units=helm\n//output: grid_cell_renderer result\nexport function helmCellRenderer(): HelmCellRenderer {\n return new HelmCellRenderer();\n}\n\nfunction checkMonomersAndOpenWebEditor(cell?: DG.Cell, value?: string, units?: string) {\n const cellValue = typeof units === 'undefined' ? cell.value : value;\n const monomers = findMonomers(cellValue);\n if (monomers.size == 0) \n webEditor(cell, value, units);\n else\n grok.shell.warning(`Monomers ${Array.from(monomers).join(', ')} are absent! <br/>` +\n `Please, upload the monomer library! <br/>` +\n `<a href=\"https://datagrok.ai/help/domains/bio/macromolecules\" target=\"_blank\">Learn more</a>`);\n}\n\n//tags: cellEditor\n//description: Macromolecule \n//input: grid_cell cell\n//meta.columnTags: quality=Macromolecule, units=helm\nexport function editMoleculeCell(cell: DG.GridCell): void {\n checkMonomersAndOpenWebEditor(cell.cell, undefined, undefined);\n}\n\n//name: Open Helm Web Editor\n//description: Adds editor\n//meta.action: Open Helm Web Editor\n//input: string mol { semType: Macromolecule }\nexport function openEditor(mol: string): void {\n let df = grok.shell.tv.grid.dataFrame;\n let col = df.columns.bySemType('Macromolecule');\n const colUnits = col.getTag(DG.TAGS.UNITS);\n if (colUnits === NOTATION.HELM) \n checkMonomersAndOpenWebEditor(df.currentCell, undefined, undefined);\n let converter = new NotationConverter(col);\n const resStr = converter.convertStringToHelm(mol, '/'); \n checkMonomersAndOpenWebEditor(df.currentCell, resStr, col.getTag(DG.TAGS.UNITS));\n}\n\n//name: Properties\n//tags: panel, widgets\n//input: string helmString {semType: Macromolecule}\n//output: widget result\nexport async function propertiesPanel(helmString: string) {\n let grid = grok.shell.tv.grid;\n let parent = grid.root.parentElement;\n const host = ui.div([]);\n parent.appendChild(host);\n let editor = new JSDraw2.Editor(host, {viewonly: true});\n host.style.width = '0px';\n host.style.height = '0px';\n editor.setHelm(helmString);\n let formula = editor.getFormula(true);\n let molWeight = Math.round(editor.getMolWeight() * 100) / 100;\n let coef = Math.round(editor.getExtinctionCoefficient(true) * 100) / 100;\n parent.lastChild.remove();\n return new DG.Widget(\n ui.tableFromMap({\n 'formula': formula.replace(/<sub>/g, '').replace(/<\\/sub>/g, ''),\n 'molecular weight': molWeight,\n 'extinction coefficient': coef,\n })\n );\n}\n\nfunction webEditor(cell?: DG.Cell, value?: string, units?: string) {\n let view = ui.div();\n let df = grok.shell.tv.grid.dataFrame;\n let converter = new NotationConverter(df.columns.bySemType('Macromolecule'));\n org.helm.webeditor.MolViewer.molscale = 0.8;\n let app = new scil.helm.App(view, {\n showabout: false,\n mexfontsize: '90%',\n mexrnapinontab: true,\n topmargin: 20,\n mexmonomerstab: true,\n sequenceviewonly: false,\n mexfavoritefirst: true,\n mexfilter: true\n });\n var sizes = app.calculateSizes();\n app.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);\n var s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};\n //@ts-ignore\n scil.apply(app.sequence.style, s);\n //@ts-ignore\n scil.apply(app.notation.style, s);\n s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + app.toolbarheight) + 'px'};\n //@ts-ignore\n scil.apply(app.properties.parent.style, s);\n app.structureview.resize(sizes.rightwidth, sizes.bottomheight + app.toolbarheight);\n app.mex.resize(sizes.topheight - 80);\n setTimeout(function() {\n if (typeof units === 'undefined') {\n app.canvas.helm.setSequence(cell.value, 'HELM');\n } else {\n app.canvas.helm.setSequence(value, 'HELM');\n }\n }, 200);\n //@ts-ignore\n ui.dialog({showHeader: false, showFooter: true})\n .add(view)\n .onOK(() => {\n let helmValue = app.canvas.getHelm(true).replace(/<\\/span>/g, '').replace(/<span style='background:#bbf;'>/g, '');\n if (typeof units === 'undefined') {\n cell.value = helmValue;\n } else {\n let convertedRes = converter.convertHelmToFastaSeparator(helmValue, units);\n cell.value = convertedRes;\n }\n }).show({modal: true, fullScreen: true});\n}\n\nfunction getRS(smiles: string) {\n const newS = smiles.match(/(?<=\\[)[^\\][]*(?=])/gm);\n const res = {};\n let el = '';\n let digit;\n for (let i = 0; i < newS.length; i++) {\n if (newS[i] != null) {\n if (/\\d/.test(newS[i])) {\n digit = newS[i][newS[i].length - 1];\n newS[i] = newS[i].replace(/[0-9]/g, '');\n for (let j = 0; j < newS[i].length; j++) {\n if (newS[i][j] != ':')\n el += newS[i][j];\n }\n res['R' + digit] = el;\n el = '';\n }\n }\n }\n return res;\n}\n\n//name: getMolfiles\n//input: column col {semType: Macromolecule}\n//output: column res \nexport function getMolfiles(col: DG.Column): DG.Column {\n let grid = grok.shell.tv.grid;\n let parent = grid.root.parentElement;\n let res = DG.Column.string('mols', col.length);\n const host = ui.div([]);\n parent.appendChild(host);\n let editor = new JSDraw2.Editor(host, {viewonly: true});\n host.style.width = '0px';\n host.style.height = '0px';\n res.init((i) => {\n editor.setHelm(col.get(i));\n let mol = editor.getMolfile();\n return mol;\n });\n parent.lastChild.remove();\n return res;\n}\n\n//name: helmWebEditor\n//output: object\nexport function helmWebEditor(): HelmWebEditor {\n return new HelmWebEditor();\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","grok","ui","DG","HelmWebEditor","constructor","w","h","this","host","style","width","height","editor","JSDraw2","Editor","viewonly","resizeEditor","setSize","createWebEditor","editorView","org","helm","webeditor","MolViewer","molscale","webEditor","scil","App","showabout","mexfontsize","mexrnapinontab","topmargin","mexmonomerstab","sequenceviewonly","mexfavoritefirst","mexfilter","sizes","calculateSizes","canvas","resize","rightwidth","topheight","s","bottomheight","apply","sequence","notation","toolbarheight","properties","parent","structureview","mex","setTimeout","setSequence","editorDiv","getParts","subParts","allParts","k","length","indexOfMonomer","indexOf","helmBeforeMonomer","slice","push","substring","parseHelm","split","monomers","Utils","isNullOrEmpty","seqs","i","p","detachAnnotation","str","ss","monomer","includes","elements","replace","el","element","match","findMonomers","helmString","types","keys","monomerTypeList","monomer_names","Monomers","getMonomerSet","forEach","id","split_string","Set","filter","val","sep","ret","frag","parentheses","bracket","braces","quote","c","c2","_detachAppendix","tag","r","repeat","endswith","lastIndexOf","RegExp","m","wu","Float32Array","vectorLength","v","sqrSum","Math","sqrt","static","dt","simplified","PaletteType","palette","cp","objList","colour","ind","colourPalette","_palette","undefinedColor","Lesk","lesk","makePalette","GrokGroups","grokGroups","RasMol","rasMol","resM","aaSynonyms","super","Aminoacids","scheme","Error","isInner","inner","outer","char","isNaN","parseInt","_a","_b","_c","chemPaletteInstance","getPalette","outerMonomer","innerMonomer","getInnerOuter","amino","toUpperCase","AAFullNames","toLowerCase","SemType","SemTypeMultipleAlignment","Names","AASmiles","AASmilesTruncated","Nucleotides","UnknownColorPalette","concat","values","pI","hash","charCodeAt","hashCode","color","dgColor","g","b","distToBlack","pow","correctColor","buildPalette","col","semType","stats","getStats","splitterAsFasta","aligned","sameLength","alphabet","alphabetCandidates","alphabetCandidatesSim","map","freq","gapSymbol","delete","freqA","alphabetA","has","freqV","alphabetV","v1","v2","prod","vectorDotProduct","getAlphabetSimilarity","maxCos","max","detectAlphabet","setTag","units","_units","column","_column","_notation","defaultGapSymbol","_defaultGapSymbol","separator","getTag","undefined","name","isFasta","isSeparator","getAlphabetSize","alphabetSizeStr","alphabetSize","splitter","getSplitterForColumn","console","warn","getAlphabetIsMultichar","isHelm","isRna","isDna","isPeptide","isMsa","getNotation","startsWith","getNewColumn","targetNotation","len","newColName","dataFrame","columns","getUnusedName","newColumn","Array","fill","srcAligned","srcAlphabet","srcAlphabetSize","srcAlphabetIsMultichar","toString","templateCol","some","unitsStringIsValid","tags","_defaultGapSymbolsDict","FASTA","HELM","SEPARATOR","seqCol","minLength","firstLength","seq","categories","mSeq","PeptideFastaAlphabet","DnaFastaAlphabet","RnaFastaAlphabet","monomerRe","matchAll","ma","mRes","toArray","helmRe","helmPp1Re","splitterAsHelm","lastIndex","ea","exec","inSeq","mm","pp1M","limit","getSplitterWithSeparator","getSplitter","longMonomerPartRe","DrawStyle","printLeftOrCentered","x","y","pivot","left","transparencyRate","last","drawStyle","classic","maxWord","wordIdx","gridCell","referenceSequence","maxLengthOfMonomer","textAlign","colorPart","grayPart","MSA","colorCode","compareWithCurrent","highlightDifference","cell","temp","currentMonomer","shortAminoMatch","needAddDots","shortAmino","monomerToShortFunction","textSize","measureText","maxColorTextSize","colorTextSize","dy","fontBoundingBoxAscent","fontBoundingBoxDescent","draw","dx1","dx2","drawColor","fillStyle","globalAlpha","fillText","dx","errorToConsole","err","String","stack","message","HelmCellRenderer","cellType","defaultWidth","defaultHeight","onMouseMove","e","maxLengthWordsSum","maxIndex","argsX","offsetX","gridColumn","bounds","right","found","mid","floor","tooltipMessage","childNodes","errMsg","error","render","cellStyle","grid","gridRow","size","window","devicePixelRatio","min","save","beginPath","rect","clip","font","textBaseline","x1","maxLengthWords","maxLengthWordSum","restore","setAttribute","skin","NotationConverter","_splitter","toFasta","toSeparator","toHelm","convertFastaToSeparator","fastaGapSymbol","init","idx","fastaPolymer","fastaMonomersArray","join","getHelmWrappers","prefix","convertToHelmHelper","sourcePolymer","sourceGapSymbol","leftWrapper","rightWrapper","postfix","convertStringToHelm","convertToHelm","convertSeparatorToFasta","separatorPolymer","separatorItemsArray","item","convertHelmToFastaSeparator","helmPolymer","tgtNotation","tgtSeparator","tgtGapSymbol","helmWrappersRe","isNucleotide","helmItemsArray","tgtMonomersArray","convertHelm","convertHelmToSeparator","convert","_package","monomerLib","initHelm","Promise","all","resolve","reject","dojo","ready","then","_","lib","rewriteLibraries","onChanged","subscribe","monTypeList","getTypes","msgStr","monType","getMonomerNamesByType","clear","type","symbol","isBroken","getMonomer","webEditorMonomer","molfile","n","na","naturalAnalog","rs","rgroups","polymerType","mt","monomerType","at","it","data","getRS","addOneMonomer","invalidate","helmCellRenderer","checkMonomersAndOpenWebEditor","view","df","converter","bySemType","app","showHeader","showFooter","add","onOK","helmValue","getHelm","convertedRes","show","modal","fullScreen","from","editMoleculeCell","openEditor","mol","currentCell","resStr","propertiesPanel","root","parentElement","appendChild","setHelm","formula","getFormula","molWeight","round","getMolWeight","coef","getExtinctionCoefficient","lastChild","remove","smiles","newS","res","digit","test","j","getMolfiles","getMolfile","helmWebEditor"],"sourceRoot":""}
1
+ {"version":3,"file":"package.js","mappings":"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","sources":["webpack://helm/webpack/bootstrap","webpack://helm/webpack/runtime/compat get default export","webpack://helm/webpack/runtime/define property getters","webpack://helm/webpack/runtime/hasOwnProperty shorthand","webpack://helm/webpack/runtime/make namespace object","webpack://helm/external var \"grok\"","webpack://helm/external var \"ui\"","webpack://helm/external var \"DG\"","webpack://helm/./src/helm-web-editor.ts","webpack://helm/./src/utils.ts","webpack://helm/external var \"wu\"","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/types.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/consts.js","webpack://helm/./node_modules/fastest-levenshtein/esm/mod.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/needleman-wunsch.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/macromolecule-distance-functions.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/hamming.js","webpack://helm/./node_modules/@datagrok-libraries/ml/src/macromolecule-distance-functions/levenstein.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/utils.js","webpack://helm/./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/vector-operations.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/monomer-works/monomer-utils.js","webpack://helm/./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/seq-palettes.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/aminoacids.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/nucleotides.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/unknown.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/cell-renderer.js","webpack://helm/./node_modules/@datagrok-libraries/utils/src/to-console.js","webpack://helm/./src/cell-renderer.ts","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/notation-converter.js","webpack://helm/./src/package.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = grok;","const __WEBPACK_NAMESPACE_OBJECT__ = ui;","const __WEBPACK_NAMESPACE_OBJECT__ = DG;","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nexport class HelmWebEditor {\n host: any;\n editor: any;\n w = 200;\n h = 100;\n constructor() {\n this.host = ui.div([], {style: {width: `${this.w}px`, height: `${this.h}px`}});\n this.editor = new JSDraw2.Editor(this.host, {width: this.w, height: this.h, viewonly: true});\n }\n\n resizeEditor(w: number, h: number) {\n this.editor.setSize(w, h);\n }\n\n createWebEditor(value: string) {\n const editorView = ui.div();\n org.helm.webeditor.MolViewer.molscale = 0.8;\n const webEditor = new scil.helm.App(editorView, {\n showabout: false,\n mexfontsize: '90%',\n mexrnapinontab: true,\n topmargin: 20,\n mexmonomerstab: true,\n sequenceviewonly: false,\n mexfavoritefirst: true,\n mexfilter: true\n });\n const sizes = webEditor.calculateSizes();\n webEditor.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);\n let s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};\n //@ts-ignore\n scil.apply(webEditor.sequence.style, s);\n //@ts-ignore\n scil.apply(webEditor.notation.style, s);\n s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + webEditor.toolbarheight) + 'px'};\n //@ts-ignore\n scil.apply(webEditor.properties.parent.style, s);\n webEditor.structureview.resize(sizes.rightwidth, sizes.bottomheight + webEditor.toolbarheight);\n webEditor.mex.resize(sizes.topheight - 80);\n setTimeout(function() {\n webEditor.canvas.helm.setSequence(value, 'HELM');\n }, 200);\n return {editorDiv: editorView, webEditor: webEditor};\n }\n}\n\n","import * as DG from 'datagrok-api/dg';\n\nexport function getParts(subParts: string[], s: string): string[] {\n const j = 0;\n const allParts: string[] = [];\n for (let k = 0; k < subParts.length; ++k) {\n const indexOfMonomer = s.indexOf(subParts[k]);\n const helmBeforeMonomer = s.slice(j, indexOfMonomer);\n allParts.push(helmBeforeMonomer);\n allParts.push(subParts[k]);\n s = s.substring(indexOfMonomer + subParts[k].length);\n }\n allParts.push(s);\n return allParts;\n}\n\nexport function parseHelm(s: string) {\n const sections = split(s, '$');\n s = sections[0];\n const monomers = [];\n //@ts-ignore\n if (!scil.Utils.isNullOrEmpty(s)) {\n const seqs = split(s, '|');\n for (let i = 0; i < seqs.length; ++i) {\n const e = detachAnnotation(seqs[i]);\n s = e.str;\n\n let p = s.indexOf('{');\n\n s = s.substring(p + 1);\n p = s.indexOf('}');\n s = s.substring(0, p);\n\n const ss = split(s, '.');\n for (const monomer of ss) {\n if (!monomer || monomer === '') continue;\n if (monomer.startsWith('[') && monomer.includes(']')) {\n const element = monomer.substring(1, monomer.indexOf(']'));\n monomers.push(element);\n const residue = monomer.substring(monomer.indexOf(']') + 1);\n ss.push(residue);\n } else if (monomer.includes('[') && monomer.endsWith(']')) {\n const element = monomer.substring(monomer.lastIndexOf('[') + 1, monomer.length - 1);\n monomers.push(element);\n const residue = monomer.substring(0, monomer.lastIndexOf('['));\n ss.push(residue);\n } else if (monomer.includes('(') && monomer.includes(')')) {\n // here we only want to split the string at first '(' and last ')'\n // because entries like [L-hArg(Et,Et)]([L-hArg(Et,Et)]) where L-hArg(Et,Et) is a single monomer\n const firstPiece = monomer.substring(0, monomer.indexOf('('));\n const thirdPiece = monomer.substring(monomer.lastIndexOf(')') + 1);\n const secondPiece = monomer.substring(firstPiece.length + 1, monomer.length - thirdPiece.length - 1);\n const elements =[firstPiece, secondPiece, thirdPiece];\n for (const el of elements)\n ss.push(el);\n } else {\n monomers.push(monomer);\n }\n }\n }\n }\n return monomers;\n}\n/* this function returns names of monomers that are NOT in the monomer library */\nexport function findMonomers(helmString: string) {\n //@ts-ignore\n const types = Object.keys(org.helm.webeditor.monomerTypeList());\n const monomers: any = [];\n const monomerNames: any = [];\n for (let i = 0; i < types.length; i++) {\n //@ts-ignore\n // eslint-disable-next-line new-cap\n monomers.push(new scil.helm.Monomers.getMonomerSet(types[i]));\n Object.keys(monomers[i]).forEach((k) => {\n monomerNames.push(monomers[i][k].id);\n });\n }\n const splitString = parseHelm(helmString);\n return new Set(splitString.filter((val) => !monomerNames.includes(val)));\n}\n\nfunction split(s: string, sep: string) {\n const ret = [];\n let frag = '';\n let parentheses = 0;\n let bracket = 0;\n let braces = 0;\n let quote = 0;\n for (let i = 0; i < s.length; ++i) {\n let c = s.substring(i, i + 1);\n if (c == sep && bracket == 0 && parentheses == 0 && braces == 0 && quote == 0) {\n ret.push(frag);\n frag = '';\n } else {\n frag += c;\n if (quote > 0) {\n if (c == '\\\\' && i + 1 < s.length) {\n ++i;\n const c2 = s.substring(i, i + 1);\n frag += c2;\n c += c2;\n }\n }\n if (c == '\\\"') {\n if (!(i > 0 && s.substring(i - 1, i) == '\\\\'))\n quote = quote == 0 ? 1 : 0;\n } else if (c == '[') {\n ++bracket;\n } else if (c == ']') {\n --bracket;\n } else if (c == '(') {\n ++parentheses;\n } else if (c == ')') {\n --parentheses;\n } else if (c == '{') {\n ++braces;\n } else if (c == '}') {\n --braces;\n }\n }\n }\n ret.push(frag);\n return ret;\n}\n\nfunction detachAnnotation(s: string) {\n const ret = _detachAppendix(s, '\\\"');\n if (ret.tag != null)\n return ret;\n\n const r = _detachAppendix(s, '\\'');\n return {tag: ret.tag, repeat: r.tag, str: r.str};\n}\n\nfunction _detachAppendix(s: string, c: string) {\n let tag = null;\n //@ts-ignore\n if (scil.Utils.endswith(s, c)) {\n let p = s.length - 1;\n while (p > 0) {\n p = s.lastIndexOf(c, p - 1);\n if (p <= 0 || s.substring(p - 1, p) != '\\\\')\n break;\n }\n\n if (p > 0 && p < s.length - 1) {\n tag = s.substring(p + 1, s.length - 1);\n s = s.substring(0, p);\n }\n }\n if (tag != null)\n tag = tag.replace(new RegExp('\\\\' + c, 'g'), c);\n return {tag: unescape(tag), str: s};\n}\n\nfunction unescape(s: string) {\n //@ts-ignore\n if (scil.Utils.isNullOrEmpty(s))\n return s;\n\n return s.replace(/[\\\\]./g, function(m) {\n switch (m) {\n case '\\\\r':\n return '\\r';\n case '\\\\n':\n return '\\n';\n case '\\\\t':\n return '\\t';\n default:\n return m.substring(1);\n }\n });\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = wu;","/** Alphabet candidate type */\nexport class CandidateType {\n constructor(name, alphabet, cutoff) {\n this.name = name;\n this.alphabet = alphabet;\n this.cutoff = cutoff;\n }\n}\n/** Alphabet candidate similarity type */\nexport class CandidateSimType extends CandidateType {\n constructor(candidate, freq, similarity) {\n super(candidate.name, candidate.alphabet, candidate.cutoff);\n this.freq = freq;\n this.similarity = similarity;\n }\n}\n//# sourceMappingURL=types.js.map","import { CandidateType } from './types';\nexport const monomerRe = /\\[(\\w+)\\]|(\\w)|(-)/g;\nexport const Alphabets = new class {\n constructor() {\n this.fasta = {\n peptide: new Set([\n 'G', 'L', 'Y', 'S', 'E', 'Q', 'D', 'N', 'F', 'A',\n 'K', 'R', 'H', 'C', 'V', 'P', 'W', 'I', 'M', 'T',\n ]),\n dna: new Set(['A', 'C', 'G', 'T']),\n rna: new Set(['A', 'C', 'G', 'U']),\n };\n }\n}();\nexport const candidateAlphabets = [\n new CandidateType(\"PT\" /* ALPHABET.PT */, Alphabets.fasta.peptide, 0.50),\n new CandidateType(\"DNA\" /* ALPHABET.DNA */, Alphabets.fasta.dna, 0.55),\n new CandidateType(\"RNA\" /* ALPHABET.RNA */, Alphabets.fasta.rna, 0.55),\n];\n//# sourceMappingURL=consts.js.map","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","// 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 */\nexport function needlemanWunch(args) {\n return (seq1, seq2) => {\n const { gapOpen, gapExtend, scoringMatrix, alphabetIndexes } = Object.assign(Object.assign({}, 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 to invert the result\n return -matrix[prevRow][seq1.length];\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVlZGxlbWFuLXd1bnNjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5lZWRsZW1hbi13dW5zY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEseUNBQXlDO0FBQ3pDLE1BQU0sUUFBUSxHQUNkLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUYsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRW5HLG9DQUFvQztBQUNwQyxNQUFNLFdBQVcsR0FBeUI7SUFDeEMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3RFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUU7SUFDckUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUU7Q0FDOUQsQ0FBQztBQVNGLE1BQU0sV0FBVyxHQUF1QjtJQUN0QyxPQUFPLEVBQUUsQ0FBQztJQUNWLFNBQVMsRUFBRSxDQUFDO0lBQ1osYUFBYSxFQUFFLFFBQVE7SUFDdkIsZUFBZSxFQUFFLFdBQVc7Q0FDN0IsQ0FBQztBQUVGLDRHQUE0RztBQUM1RyxNQUFNLFVBQVUsY0FBYyxDQUFDLElBQWlDO0lBQzlELE9BQU8sQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFXLEVBQUU7UUFDN0MsTUFBTSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBQyxtQ0FBTyxXQUFXLEdBQUssSUFBSSxDQUFDLENBQUM7UUFDdkYsZ0VBQWdFO1FBQ2hFLCtDQUErQztRQUMvQyxNQUFNLE1BQU0sR0FBZTtZQUN6QixJQUFJLEtBQUssQ0FBUyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDMUMsSUFBSSxLQUFLLENBQVMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQzNDLENBQUM7UUFDRiw2RUFBNkU7UUFDN0UsNEZBQTRGO1FBQzVGLE1BQU0sWUFBWSxHQUFjLElBQUksS0FBSyxDQUFVLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sY0FBYyxHQUFjLElBQUksS0FBSyxDQUFVLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWxGLDZDQUE2QztRQUM3QywwQ0FBMEM7UUFDMUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQix1QkFBdUI7UUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUN0QyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBRWhELG1DQUFtQztRQUNuQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztZQUNwRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hDLE1BQU0sUUFBUSxHQUNaLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JHLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUUsQ0FBQztnQkFDMUUsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3BGLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUMzQixRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FDcEIsQ0FBQztnQkFDRixvQkFBb0I7Z0JBQ3BCLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRTtvQkFDbkMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDeEIsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztpQkFDM0I7cUJBQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO29CQUN0QyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUN4QixjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO2lCQUMxQjtxQkFBTTtvQkFDTCxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO29CQUN2QixjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2lCQUMzQjthQUNGO1lBQ0QsWUFBWTtZQUNaLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDbEIsT0FBTyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM3QjtRQUNELDZFQUE2RTtRQUM3RSwrQkFBK0I7UUFDL0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7bW1EaXN0YW5jZUZ1bmN0aW9uVHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIEJsb3N1bSA2MiBtYXRyaXggZm9yIHByb3RlaW4gc2VxdWVuY2VzXG5jb25zdCBCTE9TVU02MjpBcnJheTxBcnJheTxudW1iZXI+PiA9XG5bWzQsIC0xLCAtMiwgLTIsIDAsIC0xLCAtMSwgMCwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTEsIDEsIDAsIC0zLCAtMiwgMCwgLTIsIC0xLCAwLCAtNF0sXG4gIFstMSwgNSwgMCwgLTIsIC0zLCAxLCAwLCAtMiwgMCwgLTMsIC0yLCAyLCAtMSwgLTMsIC0yLCAtMSwgLTEsIC0zLCAtMiwgLTMsIC0xLCAwLCAtMSwgLTRdLFxuICBbLTIsIDAsIDYsIDEsIC0zLCAwLCAwLCAwLCAxLCAtMywgLTMsIDAsIC0yLCAtMywgLTIsIDEsIDAsIC00LCAtMiwgLTMsIDMsIDAsIC0xLCAtNF0sXG4gIFstMiwgLTIsIDEsIDYsIC0zLCAwLCAyLCAtMSwgLTEsIC0zLCAtNCwgLTEsIC0zLCAtMywgLTEsIDAsIC0xLCAtNCwgLTMsIC0zLCA0LCAxLCAtMSwgLTRdLFxuICBbMCwgLTMsIC0zLCAtMywgOSwgLTMsIC00LCAtMywgLTMsIC0xLCAtMSwgLTMsIC0xLCAtMiwgLTMsIC0xLCAtMSwgLTIsIC0yLCAtMSwgLTMsIC0zLCAtMiwgLTRdLFxuICBbLTEsIDEsIDAsIDAsIC0zLCA1LCAyLCAtMiwgMCwgLTMsIC0yLCAxLCAwLCAtMywgLTEsIDAsIC0xLCAtMiwgLTEsIC0yLCAwLCAzLCAtMSwgLTRdLFxuICBbLTEsIDAsIDAsIDIsIC00LCAyLCA1LCAtMiwgMCwgLTMsIC0zLCAxLCAtMiwgLTMsIC0xLCAwLCAtMSwgLTMsIC0yLCAtMiwgMSwgNCwgLTEsIC00XSxcbiAgWzAsIC0yLCAwLCAtMSwgLTMsIC0yLCAtMiwgNiwgLTIsIC00LCAtNCwgLTIsIC0zLCAtMywgLTIsIDAsIC0yLCAtMiwgLTMsIC0zLCAtMSwgLTIsIC0xLCAtNF0sXG4gIFstMiwgMCwgMSwgLTEsIC0zLCAwLCAwLCAtMiwgOCwgLTMsIC0zLCAtMSwgLTIsIC0xLCAtMiwgLTEsIC0yLCAtMiwgMiwgLTMsIDAsIDAsIC0xLCAtNF0sXG4gIFstMSwgLTMsIC0zLCAtMywgLTEsIC0zLCAtMywgLTQsIC0zLCA0LCAyLCAtMywgMSwgMCwgLTMsIC0yLCAtMSwgLTMsIC0xLCAzLCAtMywgLTMsIC0xLCAtNF0sXG4gIFstMSwgLTIsIC0zLCAtNCwgLTEsIC0yLCAtMywgLTQsIC0zLCAyLCA0LCAtMiwgMiwgMCwgLTMsIC0yLCAtMSwgLTIsIC0xLCAxLCAtNCwgLTMsIC0xLCAtNF0sXG4gIFstMSwgMiwgMCwgLTEsIC0zLCAxLCAxLCAtMiwgLTEsIC0zLCAtMiwgNSwgLTEsIC0zLCAtMSwgMCwgLTEsIC0zLCAtMiwgLTIsIDAsIDEsIC0xLCAtNF0sXG4gIFstMSwgLTEsIC0yLCAtMywgLTEsIDAsIC0yLCAtMywgLTIsIDEsIDIsIC0xLCA1LCAwLCAtMiwgLTEsIC0xLCAtMSwgLTEsIDEsIC0zLCAtMSwgLTEsIC00XSxcbiAgWy0yLCAtMywgLTMsIC0zLCAtMiwgLTMsIC0zLCAtMywgLTEsIDAsIDAsIC0zLCAwLCA2LCAtNCwgLTIsIC0yLCAxLCAzLCAtMSwgLTMsIC0zLCAtMSwgLTRdLFxuICBbLTEsIC0yLCAtMiwgLTEsIC0zLCAtMSwgLTEsIC0yLCAtMiwgLTMsIC0zLCAtMSwgLTIsIC00LCA3LCAtMSwgLTEsIC00LCAtMywgLTIsIC0yLCAtMSwgLTIsIC00XSxcbiAgWzEsIC0xLCAxLCAwLCAtMSwgMCwgMCwgMCwgLTEsIC0yLCAtMiwgMCwgLTEsIC0yLCAtMSwgNCwgMSwgLTMsIC0yLCAtMiwgMCwgMCwgMCwgLTRdLFxuICBbMCwgLTEsIDAsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTEsIDEsIDUsIC0yLCAtMiwgMCwgLTEsIC0xLCAwLCAtNF0sXG4gIFstMywgLTMsIC00LCAtNCwgLTIsIC0yLCAtMywgLTIsIC0yLCAtMywgLTIsIC0zLCAtMSwgMSwgLTQsIC0zLCAtMiwgMTEsIDIsIC0zLCAtNCwgLTMsIC0yLCAtNF0sXG4gIFstMiwgLTIsIC0yLCAtMywgLTIsIC0xLCAtMiwgLTMsIDIsIC0xLCAtMSwgLTIsIC0xLCAzLCAtMywgLTIsIC0yLCAyLCA3LCAtMSwgLTMsIC0yLCAtMSwgLTRdLFxuICBbMCwgLTMsIC0zLCAtMywgLTEsIC0yLCAtMiwgLTMsIC0zLCAzLCAxLCAtMiwgMSwgLTEsIC0yLCAtMiwgMCwgLTMsIC0xLCA0LCAtMywgLTIsIC0xLCAtNF0sXG4gIFstMiwgLTEsIDMsIDQsIC0zLCAwLCAxLCAtMSwgMCwgLTMsIC00LCAwLCAtMywgLTMsIC0yLCAwLCAtMSwgLTQsIC0zLCAtMywgNCwgMSwgLTEsIC00XSxcbiAgWy0xLCAwLCAwLCAxLCAtMywgMywgNCwgLTIsIDAsIC0zLCAtMywgMSwgLTEsIC0zLCAtMSwgMCwgLTEsIC0zLCAtMiwgLTIsIDEsIDQsIC0xLCAtNF0sXG4gIFswLCAtMSwgLTEsIC0xLCAtMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTIsIDAsIDAsIC0yLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC00XSxcbiAgWy00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgLTQsIC00LCAtNCwgMV1dO1xuXG4vLyBQcm90ZWluIGluZGV4ZXMgZm9yIEJMT1NVTSBtYXRyaXhcbmNvbnN0IFByb3RJbmRleGVzOiB7W2lkOnN0cmluZ106bnVtYmVyfSA9IHtcbiAgJ0EnOiAwLCAnUic6IDEsICdOJzogMiwgJ0QnOiAzLCAnQyc6IDQsICdRJzogNSwgJ0UnOiA2LCAnRyc6IDcsICdIJzogOCxcbiAgJ0knOiA5LCAnTCc6IDEwLCAnSyc6IDExLCAnTSc6IDEyLCAnRic6IDEzLCAnUCc6IDE0LCAnUyc6IDE1LCAnVCc6IDE2LFxuICAnVyc6IDE3LCAnWSc6IDE4LCAnVic6IDE5LCAnQic6IDIwLCAnWic6IDIxLCAnWCc6IDIyLCAnKic6IDIzXG59O1xuXG5pbnRlcmZhY2UgTmVlZGxlbWFuV3VuY2hBcmdzIHtcbiAgZ2FwT3BlbjogbnVtYmVyO1xuICBnYXBFeHRlbmQ6IG51bWJlcjtcbiAgc2NvcmluZ01hdHJpeDogbnVtYmVyW11bXTtcbiAgYWxwaGFiZXRJbmRleGVzOiB7W2lkOnN0cmluZ106bnVtYmVyfTtcbn1cblxuY29uc3QgZGVmYXVsdEFyZ3M6IE5lZWRsZW1hbld1bmNoQXJncyA9IHtcbiAgZ2FwT3BlbjogOCxcbiAgZ2FwRXh0ZW5kOiAyLFxuICBzY29yaW5nTWF0cml4OiBCTE9TVU02MixcbiAgYWxwaGFiZXRJbmRleGVzOiBQcm90SW5kZXhlc1xufTtcblxuLyoqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbGN1bGF0ZXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHNlcXVlbmNlcyBiYXNlZCBvbiBnYXAgcGVuYWx0eSBhbmQgbWF0cml4ICovXG5leHBvcnQgZnVuY3Rpb24gbmVlZGxlbWFuV3VuY2goYXJnczogUGFydGlhbDxOZWVkbGVtYW5XdW5jaEFyZ3M+KTogbW1EaXN0YW5jZUZ1bmN0aW9uVHlwZSB7XG4gIHJldHVybiAoc2VxMTogc3RyaW5nLCBzZXEyOiBzdHJpbmcpIDogbnVtYmVyID0+IHtcbiAgICBjb25zdCB7Z2FwT3BlbiwgZ2FwRXh0ZW5kLCBzY29yaW5nTWF0cml4LCBhbHBoYWJldEluZGV4ZXN9ID0gey4uLmRlZmF1bHRBcmdzLCAuLi5hcmdzfTtcbiAgICAvLyBBcyB3ZSBkb24ndCBuZWVkIHRyYWNlYmFjaywgbm8gbmVlZCB0byBzdG9yZSB0aGUgd2hvbGUgbWF0cml4XG4gICAgLy8gSW50ZWFkLCB3ZSB3aWxsIHN0b3JlIG9ubHkgdGhlIGxhc3QgdHdvIHJvd3NcbiAgICBjb25zdCBtYXRyaXg6IG51bWJlcltdW10gPSBbXG4gICAgICBuZXcgQXJyYXk8bnVtYmVyPihzZXExLmxlbmd0aCArIDEpLmZpbGwoMCksXG4gICAgICBuZXcgQXJyYXk8bnVtYmVyPihzZXExLmxlbmd0aCArIDEpLmZpbGwoMClcbiAgICBdO1xuICAgIC8vIHNpbWlsYXJseSwgd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHdoYXQgb3BlcmF0aW9uIGxlZCB0byB0aGUgY3VycmVudCBjZWxsXG4gICAgLy8gaS5lLiB3aGV0aGVyIHdlIGNhbWUgZnJvbSB0aGUgbGVmdCwgdG9wIG9yIGRpYWdvbmFsIHRvIGFzc2lnbiBnYXAgb3Blbi9nYXAgZXh0ZW5kIHBlbmFsdHlcbiAgICBjb25zdCB2ZXJ0aWNhbEdhcHM6IGJvb2xlYW5bXSA9IG5ldyBBcnJheTxib29sZWFuPihzZXExLmxlbmd0aCArIDEpLmZpbGwoZmFsc2UpO1xuICAgIGNvbnN0IGhvcml6b250YWxHYXBzOiBib29sZWFuW10gPSBuZXcgQXJyYXk8Ym9vbGVhbj4oc2VxMS5sZW5ndGggKyAxKS5maWxsKGZhbHNlKTtcblxuICAgIC8vdmFyaWFibGVzIHRvIGtlZXAgdHJhY2sgd2hpY2ggcm93IHdlIGFyZSBpblxuICAgIC8vIHRoZXkgd2lsbCBzd2FwIHBsYWNlcyBvbiBlYWNoIGl0ZXJhdGlvblxuICAgIGxldCBwcmV2Um93ID0gMDtcbiAgICBsZXQgY3VyclJvdyA9IDE7XG4gICAgLy8gSW5pdGlhbGl6ZSBmaXJzdCByb3dcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlcTEubGVuZ3RoICsgMTsgaSsrKVxuICAgICAgbWF0cml4WzBdW2ldID0gLWdhcE9wZW4gLSAoaSAtIDEpICogZ2FwRXh0ZW5kO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSByZXN0IG9mIHRoZSBtYXRyaXhcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlcTIubGVuZ3RoICsgMTsgaSsrKSB7XG4gICAgICBtYXRyaXhbY3VyclJvd11bMF0gPSAtZ2FwT3BlbiAtIChpIC0gMSkgKiBnYXBFeHRlbmQ7XG4gICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHNlcTEubGVuZ3RoICsgMTsgaisrKSB7XG4gICAgICAgIGNvbnN0IGRpYWdvbmFsID1cbiAgICAgICAgICBtYXRyaXhbcHJldlJvd11baiAtIDFdICsgc2NvcmluZ01hdHJpeFthbHBoYWJldEluZGV4ZXNbc2VxMVtqIC0gMV1dXVthbHBoYWJldEluZGV4ZXNbc2VxMltpIC0gMV1dXTtcbiAgICAgICAgY29uc3QgdG9wID0gbWF0cml4W3ByZXZSb3ddW2pdIC0gKHZlcnRpY2FsR2Fwc1tqXSA/IGdhcEV4dGVuZCA6IGdhcE9wZW4gKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IG1hdHJpeFtjdXJyUm93XVtqIC0gMV0gLSAoaG9yaXpvbnRhbEdhcHNbaiAtIDFdID8gZ2FwRXh0ZW5kIDogZ2FwT3Blbik7XG4gICAgICAgIG1hdHJpeFtjdXJyUm93XVtqXSA9IE1hdGgubWF4KFxuICAgICAgICAgIGRpYWdvbmFsLCBsZWZ0LCB0b3BcbiAgICAgICAgKTtcbiAgICAgICAgLy8gdXBkYXRlIGdhcCBhcnJheXNcbiAgICAgICAgaWYgKG1hdHJpeFtjdXJyUm93XVtqXSA9PT0gZGlhZ29uYWwpIHtcbiAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSBmYWxzZTtcbiAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG1hdHJpeFtjdXJyUm93XVtqXSA9PT0gbGVmdCkge1xuICAgICAgICAgIHZlcnRpY2FsR2Fwc1tqXSA9IGZhbHNlO1xuICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSB0cnVlO1xuICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFN3YXAgcm93c1xuICAgICAgcHJldlJvdyA9IGN1cnJSb3c7XG4gICAgICBjdXJyUm93ID0gKGN1cnJSb3cgKyAxKSAlIDI7XG4gICAgfVxuICAgIC8vIGFzIHRoZSBtYXRyaXggaXMgdGhlIHNpbWlsYXJpdHkgbWF0cml4LCBidXQgd2UgYXJlIGludGVyZXN0ZWQgaW4gZGlzdGFuY2UsXG4gICAgLy8gd2UgbmVlZCB0byBpbnZlcnQgdGhlIHJlc3VsdFxuICAgIHJldHVybiAtbWF0cml4W3ByZXZSb3ddW3NlcTEubGVuZ3RoXTtcbiAgfTtcbn1cbiJdfQ==","import { hamming } from './hamming';\nimport { levenstein } from './levenstein';\nimport { needlemanWunch } from './needleman-wunsch';\n/** Enum containing currently supported macromolecule distance functions\n * Hamming distance will be used if the sequences are already aligned\n * Needleman distance will be used for protein sequences with known BLOSUM62 matrix\n * Levenshtein distance will be used for nucleotide sequences as for them substitution matrix is same as identity matrix\n */\nexport var MmDistanceFunctionsNames;\n(function (MmDistanceFunctionsNames) {\n MmDistanceFunctionsNames[\"HAMMING\"] = \"Hamming\";\n MmDistanceFunctionsNames[\"LEVENSHTEIN\"] = \"Levenshtein\";\n MmDistanceFunctionsNames[\"NEEDLEMANN_WUNSCH\"] = \"Needlemann-Wunsch\";\n})(MmDistanceFunctionsNames || (MmDistanceFunctionsNames = {}));\n;\nexport const mmDistanceFunctions = {\n [MmDistanceFunctionsNames.HAMMING]: hamming,\n [MmDistanceFunctionsNames.LEVENSHTEIN]: levenstein,\n [MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH]: needlemanWunch\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS1kaXN0YW5jZS1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYWNyb21vbGVjdWxlLWRpc3RhbmNlLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR2xEOzs7O0dBSUc7QUFDSCxNQUFNLENBQU4sSUFBWSx3QkFJWDtBQUpELFdBQVksd0JBQXdCO0lBQ2hDLCtDQUFtQixDQUFBO0lBQ25CLHVEQUEyQixDQUFBO0lBQzNCLG1FQUF1QyxDQUFBO0FBQzNDLENBQUMsRUFKVyx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBSW5DO0FBQUEsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUE4RTtJQUM1RyxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU87SUFDM0MsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxVQUFVO0lBQ2xELENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsRUFBRSxjQUFjO0NBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2hhbW1pbmd9IGZyb20gJy4vaGFtbWluZyc7XG5pbXBvcnQge2xldmVuc3RlaW59IGZyb20gJy4vbGV2ZW5zdGVpbic7XG5pbXBvcnQge25lZWRsZW1hbld1bmNofSBmcm9tICcuL25lZWRsZW1hbi13dW5zY2gnO1xuaW1wb3J0IHttbURpc3RhbmNlRnVuY3Rpb25UeXBlfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIEVudW0gY29udGFpbmluZyBjdXJyZW50bHkgc3VwcG9ydGVkIG1hY3JvbW9sZWN1bGUgZGlzdGFuY2UgZnVuY3Rpb25zXG4gKiBIYW1taW5nIGRpc3RhbmNlIHdpbGwgYmUgdXNlZCBpZiB0aGUgc2VxdWVuY2VzIGFyZSBhbHJlYWR5IGFsaWduZWRcbiAqIE5lZWRsZW1hbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIHByb3RlaW4gc2VxdWVuY2VzIHdpdGgga25vd24gQkxPU1VNNjIgbWF0cml4XG4gKiBMZXZlbnNodGVpbiBkaXN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIG51Y2xlb3RpZGUgc2VxdWVuY2VzIGFzIGZvciB0aGVtIHN1YnN0aXR1dGlvbiBtYXRyaXggaXMgc2FtZSBhcyBpZGVudGl0eSBtYXRyaXhcbiAqL1xuZXhwb3J0IGVudW0gTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzIHtcbiAgICBIQU1NSU5HID0gJ0hhbW1pbmcnLFxuICAgIExFVkVOU0hURUlOID0gJ0xldmVuc2h0ZWluJyxcbiAgICBORUVETEVNQU5OX1dVTlNDSCA9ICdOZWVkbGVtYW5uLVd1bnNjaCdcbn07XG5cbmV4cG9ydCBjb25zdCBtbURpc3RhbmNlRnVuY3Rpb25zOiBSZWNvcmQ8TW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLCAodmFsdWU/OiBhbnkpID0+IG1tRGlzdGFuY2VGdW5jdGlvblR5cGU+ID0ge1xuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkhBTU1JTkddOiBoYW1taW5nLFxuICBbTW1EaXN0YW5jZUZ1bmN0aW9uc05hbWVzLkxFVkVOU0hURUlOXTogbGV2ZW5zdGVpbixcbiAgW01tRGlzdGFuY2VGdW5jdGlvbnNOYW1lcy5ORUVETEVNQU5OX1dVTlNDSF06IG5lZWRsZW1hbld1bmNoXG59O1xuIl19","export function hamming() {\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 if (seq1.length !== seq2.length)\n diff = Math.abs(seq1.length - seq2.length);\n let result = 0;\n for (let i = 0; i < Math.min(seq1.length, seq2.length); i++) {\n if (seq1[i] !== seq2[i])\n result++;\n }\n return result + diff;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtbWluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhhbW1pbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLE9BQU87SUFDckIsT0FBTyxDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsRUFBRTtRQUNwQywrREFBK0Q7UUFDL0QsK0ZBQStGO1FBQy9GLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNiLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTTtZQUM3QixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzRCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixNQUFNLEVBQUUsQ0FBQztTQUNaO1FBQ0QsT0FBTyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge21tRGlzdGFuY2VGdW5jdGlvblR5cGV9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFtbWluZygpOiBtbURpc3RhbmNlRnVuY3Rpb25UeXBlIHtcbiAgcmV0dXJuIChzZXExOiBzdHJpbmcsIHNlcTI6IHN0cmluZykgPT4ge1xuICAgIC8vIGhhbW1pbmcgZGlzdGFuY2Ugc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHNhbWUgc2l6ZSBzdHJpbmdzLFxuICAgIC8vIGJ1dCBzdGlsbCwgbGV0cyBhZGQgYSBjaGVjayBhbmQgaWYgdGhleSBhcmUgbm90IHNhbWUgbGVuZ3RoIGFkZCB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcmVzdWx0XG4gICAgbGV0IGRpZmYgPSAwO1xuICAgIGlmIChzZXExLmxlbmd0aCAhPT0gc2VxMi5sZW5ndGgpXG4gICAgICBkaWZmID0gTWF0aC5hYnMoc2VxMS5sZW5ndGggLSBzZXEyLmxlbmd0aCk7XG5cbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKHNlcTEubGVuZ3RoLCBzZXEyLmxlbmd0aCk7IGkrKykge1xuICAgICAgaWYgKHNlcTFbaV0gIT09IHNlcTJbaV0pXG4gICAgICAgIHJlc3VsdCsrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0ICsgZGlmZjtcbiAgfTtcbn1cbiJdfQ==","import { distance } from 'fastest-levenshtein';\nexport function levenstein() {\n return (seq1, seq2) => {\n return distance(seq1, seq2);\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV2ZW5zdGVpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxldmVuc3RlaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRzdDLE1BQU0sVUFBVSxVQUFVO0lBQ3hCLE9BQU8sQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQUU7UUFDcEMsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Rpc3RhbmNlfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcbmltcG9ydCB7bW1EaXN0YW5jZUZ1bmN0aW9uVHlwZX0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsZXZlbnN0ZWluKCk6IG1tRGlzdGFuY2VGdW5jdGlvblR5cGUge1xuICByZXR1cm4gKHNlcTE6IHN0cmluZywgc2VxMjogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIGRpc3RhbmNlKHNlcTEsIHNlcTIpO1xuICB9O1xufVxuIl19","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport * as DG from 'datagrok-api/dg';\nimport { candidateAlphabets } from './macromolecule/consts';\nimport { detectAlphabet, getSplitterForColumn, getSplitterWithSeparator, getStats, splitterAsFasta, splitterAsHelm } from './macromolecule/utils';\nimport { mmDistanceFunctions, MmDistanceFunctionsNames } from '@datagrok-libraries/ml/src/macromolecule-distance-functions';\nimport { getMonomerLibHelper } from '../monomer-works/monomer-utils';\n/** Class for handling notation units in Macromolecule columns */\nexport class UnitsHandler {\n static setUnitsToFastaColumn(col) {\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE || col.getTag(DG.TAGS.UNITS) !== \"fasta\" /* NOTATION.FASTA */)\n throw new Error(`The column of notation '${\"fasta\" /* NOTATION.FASTA */}' must be '${DG.SEMTYPE.MACROMOLECULE}'.`);\n col.setTag(DG.TAGS.UNITS, \"fasta\" /* NOTATION.FASTA */);\n UnitsHandler.setTags(col, splitterAsFasta);\n }\n static setUnitsToSeparatorColumn(col, separator) {\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE || col.getTag(DG.TAGS.UNITS) !== \"separator\" /* NOTATION.SEPARATOR */)\n throw new Error(`The column of notation '${\"separator\" /* NOTATION.SEPARATOR */}' must be '${DG.SEMTYPE.MACROMOLECULE}'.`);\n if (!separator)\n throw new Error(`The column of notation '${\"separator\" /* NOTATION.SEPARATOR */}' must have the separator tag.`);\n col.setTag(DG.TAGS.UNITS, \"separator\" /* NOTATION.SEPARATOR */);\n col.setTag(\"separator\" /* TAGS.separator */, separator);\n UnitsHandler.setTags(col, getSplitterWithSeparator(separator));\n }\n static setUnitsToHelmColumn(col) {\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error(`The column of notation '${\"helm\" /* NOTATION.HELM */}' must be '${DG.SEMTYPE.MACROMOLECULE}'`);\n col.setTag(DG.TAGS.UNITS, \"helm\" /* NOTATION.HELM */);\n UnitsHandler.setTags(col, splitterAsHelm);\n }\n /** From detectMacromolecule */\n static setTags(col, splitter) {\n const units = col.getTag(DG.TAGS.UNITS);\n const stats = getStats(col, 5, splitter);\n const alphabetIsMultichar = Object.keys(stats.freq).some((m) => m.length > 1);\n if ([\"fasta\" /* NOTATION.FASTA */, \"separator\" /* NOTATION.SEPARATOR */].includes(units)) {\n // Empty monomer alphabet is not allowed\n if (Object.keys(stats.freq).length === 0)\n throw new Error('Alphabet is empty');\n const aligned = stats.sameLength ? \"SEQ.MSA\" /* ALIGNMENT.SEQ_MSA */ : \"SEQ\" /* ALIGNMENT.SEQ */;\n col.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n const alphabet = detectAlphabet(stats.freq, candidateAlphabets);\n col.setTag(\"alphabet\" /* TAGS.alphabet */, alphabet);\n if (alphabet === \"UN\" /* ALPHABET.UN */) {\n const alphabetSize = Object.keys(stats.freq).length;\n const alphabetIsMultichar = Object.keys(stats.freq).some((m) => m.length > 1);\n col.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, alphabetSize.toString());\n col.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, alphabetIsMultichar ? 'true' : 'false');\n }\n }\n }\n get units() { return this._units; }\n get column() { return this._column; }\n get notation() { return this._notation; }\n get defaultGapSymbol() { return this._defaultGapSymbol; }\n get separator() {\n var _a;\n const separator = (_a = this.column.getTag(\"separator\" /* TAGS.separator */)) !== null && _a !== void 0 ? _a : undefined;\n if (this.notation === \"separator\" /* NOTATION.SEPARATOR */ && separator === undefined)\n throw new Error(`Separator is mandatory for column '${this.column.name}' of notation '${this.notation}'.`);\n return separator;\n }\n get aligned() {\n const aligned = this.column.getTag(\"aligned\" /* TAGS.aligned */);\n // TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n if (!aligned && (this.isFasta() || this.isSeparator()))\n throw new Error('Tag aligned not set');\n return aligned;\n }\n /** Alphabet name (upper case) */\n get alphabet() {\n const alphabet = this.column.getTag(\"alphabet\" /* TAGS.alphabet */);\n // TAGS.alphabet is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n if (!alphabet && (this.isFasta() || this.isSeparator()))\n throw new Error('Tag alphabet not set');\n return alphabet;\n }\n get helmCompatible() {\n return this.column.getTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */);\n }\n getAlphabetSize() {\n if (this.notation == \"helm\" /* NOTATION.HELM */ || this.alphabet == \"UN\" /* ALPHABET.UN */) {\n const alphabetSizeStr = this.column.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n let alphabetSize;\n if (alphabetSizeStr) {\n alphabetSize = parseInt(alphabetSizeStr);\n }\n else {\n // calculate alphabetSize on demand\n const splitter = getSplitterForColumn(this.column);\n const stats = getStats(this.column, 1, splitter);\n alphabetSize = Object.keys(stats.freq).length;\n }\n return alphabetSize;\n }\n else {\n switch (this.alphabet) {\n case \"PT\" /* ALPHABET.PT */:\n return 20;\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return 4;\n case 'NT':\n console.warn(`Unexpected alphabet 'NT'.`);\n return 4;\n default:\n throw new Error(`Unexpected alphabet '${this.alphabet}'.`);\n }\n }\n }\n getAlphabetIsMultichar() {\n if (this.notation === \"helm\" /* NOTATION.HELM */)\n return true;\n else if (this.alphabet !== \"UN\" /* ALPHABET.UN */)\n return false;\n else\n return this.column.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */) === 'true';\n }\n isFasta() { return this.notation === \"fasta\" /* NOTATION.FASTA */; }\n isSeparator() { return this.notation === \"separator\" /* NOTATION.SEPARATOR */; }\n isHelm() { return this.notation === \"helm\" /* NOTATION.HELM */; }\n isRna() { return this.alphabet === \"RNA\" /* ALPHABET.RNA */; }\n isDna() { return this.alphabet === \"DNA\" /* ALPHABET.DNA */; }\n isPeptide() { return this.alphabet === \"PT\" /* ALPHABET.PT */; }\n isMsa() { return this.aligned ? this.aligned.toUpperCase().includes('MSA') : false; }\n isHelmCompatible() { return this.helmCompatible === 'true'; }\n /** Associate notation types with the corresponding units */\n /**\n * @return {NOTATION} Notation associated with the units type\n */\n getNotation() {\n if (this.units.toLowerCase().startsWith(\"fasta\" /* NOTATION.FASTA */))\n return \"fasta\" /* NOTATION.FASTA */;\n else if (this.units.toLowerCase().startsWith(\"separator\" /* NOTATION.SEPARATOR */))\n return \"separator\" /* NOTATION.SEPARATOR */;\n else if (this.units.toLowerCase().startsWith(\"helm\" /* NOTATION.HELM */))\n return \"helm\" /* NOTATION.HELM */;\n else\n throw new Error(`Column '${this.column.name}' has unexpected notation '${this.units}'.`);\n }\n /**\n * Create a new empty column of the specified notation type and the same\n * length as column\n *\n * @param {NOTATION} targetNotation\n * @return {DG.Column}\n */\n getNewColumn(targetNotation, separator) {\n const col = this.column;\n const len = col.length;\n const name = targetNotation.toLowerCase() + '(' + col.name + ')';\n const newColName = col.dataFrame.columns.getUnusedName(name);\n const newColumn = DG.Column.fromList('string', newColName, new Array(len).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, targetNotation);\n if (targetNotation === \"separator\" /* NOTATION.SEPARATOR */) {\n if (!separator)\n throw new Error(`Notation \\'${\"separator\" /* NOTATION.SEPARATOR */}\\' requires separator value.`);\n newColumn.setTag(\"separator\" /* TAGS.separator */, separator);\n }\n newColumn.setTag(DG.TAGS.CELL_RENDERER, 'Macromolecule');\n const srcAligned = col.getTag(\"aligned\" /* TAGS.aligned */);\n if (srcAligned)\n newColumn.setTag(\"aligned\" /* TAGS.aligned */, srcAligned);\n const srcAlphabet = col.getTag(\"alphabet\" /* TAGS.alphabet */);\n if (srcAlphabet)\n newColumn.setTag(\"alphabet\" /* TAGS.alphabet */, srcAlphabet);\n let srcAlphabetSize = col.getTag(\".alphabetSize\" /* TAGS.alphabetSize */);\n if (srcAlphabetSize)\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n const srcAlphabetIsMultichar = col.getTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */);\n if (srcAlphabetIsMultichar !== undefined)\n newColumn.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, srcAlphabetIsMultichar);\n if (targetNotation == \"helm\" /* NOTATION.HELM */) {\n srcAlphabetSize = this.getAlphabetSize().toString();\n newColumn.setTag(\".alphabetSize\" /* TAGS.alphabetSize */, srcAlphabetSize);\n }\n return newColumn;\n }\n /**\n * Create a new empty column using templateCol as a template\n *\n * @param {DG.Column} templateCol the properties and units of this column are used as a\n * template to build the new one\n * @return {DG.Column}\n */\n static getNewColumn(templateCol) {\n const col = new UnitsHandler(templateCol);\n const targetNotation = col.notation;\n return col.getNewColumn(targetNotation);\n }\n /**\n * A helper function checking the validity of the 'units' string\n *\n * @param {string} units the string to be validated\n * @return {boolean}\n */\n static unitsStringIsValid(units) {\n units = units.toLowerCase();\n const prefixes = [\"fasta\" /* NOTATION.FASTA */, \"separator\" /* NOTATION.SEPARATOR */, \"helm\" /* NOTATION.HELM */];\n const postfixes = ['rna', 'dna', 'pt'];\n const prefixCriterion = prefixes.some((p) => units.startsWith(p.toLowerCase()));\n return prefixCriterion;\n }\n /**\n * Construct a new column of semantic type MACROMOLECULE from the list of\n * specified parameters\n *\n * @param {number} len the length of the new column\n * @param {string} name the name of the new column\n * @param {string} units the units of the new column\n * @return {DG.Column}\n */\n static getNewColumnFromParams(len, name, units) {\n // WARNING: in this implementation is is impossible to verify the uniqueness\n // of the new column's name\n // TODO: verify the validity of units parameter\n if (!UnitsHandler.unitsStringIsValid(units))\n throw new Error('Invalid format of \\'units\\' parameter');\n const newColumn = DG.Column.fromList('string', name, new Array(len).fill(''));\n newColumn.semType = DG.SEMTYPE.MACROMOLECULE;\n newColumn.setTag(DG.TAGS.UNITS, units);\n return newColumn;\n }\n getDistanceFunctionName() {\n // TODO add support for helm and separator notation\n if (!this.isFasta())\n throw new Error('Only FASTA notation is supported');\n if (this.isMsa())\n return MmDistanceFunctionsNames.HAMMING;\n switch (this.alphabet) {\n // As DNA and RNA scoring matrices are same as identity matrices(mostly),\n // we can use very fast and optimized Levenshtein distance library\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return MmDistanceFunctionsNames.LEVENSHTEIN;\n case \"PT\" /* ALPHABET.PT */:\n return MmDistanceFunctionsNames.NEEDLEMANN_WUNSCH;\n // For default case, let's use Levenshtein distance\n default:\n return MmDistanceFunctionsNames.LEVENSHTEIN;\n }\n }\n getDistanceFunction() {\n return mmDistanceFunctions[this.getDistanceFunctionName()]();\n }\n // checks if the separator notation is compatible with helm library\n checkHelmCompatibility() {\n return __awaiter(this, void 0, void 0, function* () {\n // check first for the column tag to avoid extra processing\n if (this.column.tags.has(\".isHelmCompatible\" /* TAGS.isHelmCompatible */))\n return this.column.getTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */) === 'true';\n // get the monolmer lib and check against the column\n const monomerLibHelper = yield getMonomerLibHelper();\n const bioLib = monomerLibHelper.getBioLib();\n // retrieve peptides\n const peptides = bioLib.getMonomerSymbolsByType(\"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */.toString());\n // convert the peptides list to a set for faster lookup\n const peptidesSet = new Set(peptides);\n // get splitter for given separator and check if all monomers are in the lib\n const splitterFunc = getSplitterWithSeparator(this.separator);\n // iterate over the columns, split them and check if all monomers are in the lib\n //TODO maybe add missing threshhold so that if there are not too many missing monomers\n // the column is still considered helm compatible\n for (const row of this.column.categories) {\n const monomers = splitterFunc(row);\n for (const monomer of monomers) {\n if (!peptidesSet.has(monomer)) {\n this.column.setTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */, 'false');\n return false;\n }\n }\n }\n this.column.setTag(\".isHelmCompatible\" /* TAGS.isHelmCompatible */, 'true');\n return true;\n });\n }\n constructor(col) {\n this._column = col;\n const units = this._column.getTag(DG.TAGS.UNITS);\n if (units !== null && units !== undefined)\n this._units = units;\n else\n throw new Error('Units are not specified in column');\n this._notation = this.getNotation();\n this._defaultGapSymbol = (this.isFasta()) ? UnitsHandler._defaultGapSymbolsDict.FASTA :\n (this.isHelm()) ? UnitsHandler._defaultGapSymbolsDict.HELM :\n UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n if (!this.column.tags.has(\"aligned\" /* TAGS.aligned */) || !this.column.tags.has(\"alphabet\" /* TAGS.alphabet */) ||\n (!this.column.tags.has(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */) && !this.isHelm() && this.alphabet === \"UN\" /* ALPHABET.UN */)) {\n // The following detectors and setters are to be called because the column is likely\n // as the UnitsHandler constructor was called on the column.\n if (this.isFasta()) {\n UnitsHandler.setUnitsToFastaColumn(this.column);\n }\n else if (this.isSeparator()) {\n const separator = col.getTag(\"separator\" /* TAGS.separator */);\n UnitsHandler.setUnitsToSeparatorColumn(this.column, separator);\n }\n else if (this.isHelm()) {\n UnitsHandler.setUnitsToHelmColumn(this.column);\n }\n else {\n throw new Error(`Unexpected units '${this.column.getTag(DG.TAGS.UNITS)}'.`);\n }\n }\n // if (!this.column.tags.has(TAGS.alphabetSize)) {\n // if (this.isHelm())\n // throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +\n // `tag '${TAGS.alphabetSize}' is mandatory.`);\n // else if (['UN'].includes(this.alphabet))\n // throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +\n // `tag '${TAGS.alphabetSize}' is mandatory.`);\n // }\n if (!this.column.tags.has(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */)) {\n if (this.isHelm()) {\n this.column.setTag(\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */, 'true');\n }\n else if (['UN'].includes(this.alphabet)) {\n throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +\n `tag '${\".alphabetIsMultichar\" /* TAGS.alphabetIsMultichar */}' is mandatory.`);\n }\n }\n }\n}\nUnitsHandler._defaultGapSymbolsDict = {\n HELM: '*',\n SEPARATOR: '',\n FASTA: '-',\n};\n//# sourceMappingURL=units-handler.js.map","import * as DG from 'datagrok-api/dg';\nimport wu from 'wu';\nimport { CandidateSimType } from './types';\nimport { Alphabets, candidateAlphabets, monomerRe } from './consts';\nimport { UnitsHandler } from '../units-handler';\nimport { Vector } from '@datagrok-libraries/utils/src/type-declarations';\nimport { vectorDotProduct, vectorLength } from '@datagrok-libraries/utils/src/vector-operations';\nimport { AminoacidsPalettes } from '../../aminoacids';\nimport { NucleotidesPalettes } from '../../nucleotides';\nimport { UnknownSeqPalettes } from '../../unknown';\n/** Stats of sequences with specified splitter func, returns { freq, sameLength }.\n * @param {DG.Column} seqCol\n * @param {number} minLength\n * @param {SplitterFunc} splitter\n * @return { SeqColStats }, sameLength: boolean } stats of column sequences\n */\nexport function getStats(seqCol, minLength, splitter) {\n const freq = {};\n let sameLength = true;\n let firstLength = null;\n for (const seq of seqCol.categories) {\n const mSeq = splitter(seq);\n if (firstLength == null)\n firstLength = mSeq.length;\n else if (mSeq.length !== firstLength)\n sameLength = false;\n if (mSeq.length >= minLength) {\n for (const m of mSeq) {\n if (!(m in freq))\n freq[m] = 0;\n freq[m] += 1;\n }\n }\n }\n return { freq: freq, sameLength: sameLength };\n}\n/** Split sequence for single character monomers, square brackets multichar monomer names or gap symbol.\n * @param {any} seq object with sequence\n * @return {string[]} array of monomers\n */\nexport function splitterAsFasta(seq) {\n return wu(seq.toString().matchAll(monomerRe))\n .map((ma) => {\n const m = ma[0];\n const mRes = m.length > 1 ? ma[1] : m;\n return mRes;\n }).toArray();\n}\n/** Gets method to split sequence by separator\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitterWithSeparator(separator, limit = undefined) {\n return (seq) => {\n return seq.split(separator, limit);\n };\n}\nconst helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nconst helmPp1Re = /\\[([^\\[\\]]+)]/g;\n/** Splits Helm string to monomers, but does not replace monomer names to other notation (e.g. for RNA).\n * Only for linear polymers, does not split RNA for ribose and phosphate monomers.\n * @param {string} seq Source string of HELM notation\n * @return {string[]}\n */\nexport function splitterAsHelm(seq) {\n helmRe.lastIndex = 0;\n const ea = helmRe.exec(seq.toString());\n const inSeq = ea ? ea[2] : null;\n const mmPostProcess = (mm) => {\n helmPp1Re.lastIndex = 0;\n const pp1M = helmPp1Re.exec(mm);\n if (pp1M && pp1M.length >= 2)\n return pp1M[1];\n else\n return mm;\n };\n const mmList = inSeq ? inSeq.split('.') : [];\n return mmList.map(mmPostProcess);\n}\n/** Get splitter method to split sequences to monomers\n * @param {string} units\n * @param {string} separator\n * @param limit\n * @return {SplitterFunc}\n */\nexport function getSplitter(units, separator, limit = undefined) {\n if (units.toLowerCase().startsWith(\"fasta\" /* NOTATION.FASTA */))\n return splitterAsFasta;\n else if (units.toLowerCase().startsWith(\"separator\" /* NOTATION.SEPARATOR */))\n return getSplitterWithSeparator(separator, limit);\n else if (units.toLowerCase().startsWith(\"helm\" /* NOTATION.HELM */))\n return splitterAsHelm;\n else\n throw new Error(`Unexpected units ${units} .`);\n // TODO: Splitter for HELM\n}\n/** Generate splitter function for sequence column\n * @param {DG.Column} col\n * @return {SplitterFunc} Splitter function\n */\nexport function getSplitterForColumn(col) {\n if (col.semType !== DG.SEMTYPE.MACROMOLECULE)\n throw new Error(`Get splitter for semType \"${DG.SEMTYPE.MACROMOLECULE}\" only.`);\n const units = col.getTag(DG.TAGS.UNITS);\n const separator = col.getTag(\"separator\" /* TAGS.separator */);\n return getSplitter(units, separator);\n}\nconst longMonomerPartRe = /(\\w+)/g;\n/** Convert long monomer names to short ones */\nexport function monomerToShort(amino, maxLengthOfMonomer) {\n var _a, _b;\n const shortAminoMatch = amino.match(longMonomerPartRe);\n const needAddDots = amino.length > maxLengthOfMonomer || ((_a = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch.length) !== null && _a !== void 0 ? _a : 0) > 1;\n const shortAmino = (_b = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch[0]) !== null && _b !== void 0 ? _b : ' ';\n return !needAddDots ? shortAmino : shortAmino.substring(0, maxLengthOfMonomer) + '…';\n}\n/** */\nexport function getAlphabet(alphabet) {\n switch (alphabet) {\n case \"DNA\" /* ALPHABET.DNA */:\n return Alphabets.fasta.dna;\n case \"RNA\" /* ALPHABET.RNA */:\n return Alphabets.fasta.rna;\n case \"PT\" /* ALPHABET.PT */:\n return Alphabets.fasta.peptide;\n default:\n throw new Error(`Unsupported alphabet '${alphabet}'.`);\n }\n}\n/** Calculate similarity in current sequence and alphabet.\n * @param {MonomerFreqs} freq\n * @param {Set<string>} alphabet\n * @param {string} gapSymbol\n * @return {number} Cosine similarity\n */\nexport function getAlphabetSimilarity(freq, alphabet, gapSymbol = '-') {\n const keys = new Set([...new Set(Object.keys(freq)), ...alphabet]);\n keys.delete(gapSymbol);\n const freqA = [];\n const alphabetA = [];\n for (const m of keys) {\n freqA.push(m in freq ? freq[m] : 0);\n alphabetA.push(alphabet.has(m) ? 1 : 0);\n }\n /* There were a few ideas: chi-squared, pearson correlation (variance?), scalar product */\n const freqV = new Vector(freqA);\n const alphabetV = new Vector(alphabetA);\n return vectorDotProduct(freqV, alphabetV) / (vectorLength(freqV) * vectorLength(alphabetV));\n}\n/** From detectMacromolecule */\nexport function detectAlphabet(freq, candidates, gapSymbol = '-') {\n const candidatesSims = candidates.map((c) => {\n const sim = getAlphabetSimilarity(freq, c.alphabet, gapSymbol);\n return new CandidateSimType(c, freq, sim);\n });\n let alphabetName;\n const maxSim = Math.max(...candidatesSims.map((cs) => cs.similarity > cs.cutoff ? cs.similarity : -1));\n if (maxSim > 0) {\n const sim = candidatesSims.find((cs) => cs.similarity === maxSim);\n alphabetName = sim.name;\n }\n else {\n alphabetName = \"UN\" /* ALPHABET.UN */;\n }\n return alphabetName;\n}\n/** Selects a suitable palette based on column data\n * @param {DG.Column} seqCol Column to look for a palette\n * @param {number} minLength minimum length of sequence to detect palette (empty strings are allowed)\n * @return {SeqPalette} Palette corresponding to the alphabet of the sequences in the column\n */\nexport function pickUpPalette(seqCol, minLength = 5) {\n let alphabet;\n if (seqCol.semType == DG.SEMTYPE.MACROMOLECULE) {\n const uh = new UnitsHandler(seqCol);\n alphabet = uh.alphabet;\n }\n else {\n const stats = getStats(seqCol, minLength, splitterAsFasta);\n alphabet = detectAlphabet(stats.freq, candidateAlphabets);\n }\n const res = getPaletteByType(alphabet);\n return res;\n}\nexport function getPaletteByType(paletteType) {\n switch (paletteType) {\n case \"PT\" /* ALPHABET.PT */:\n return AminoacidsPalettes.GrokGroups;\n case \"DNA\" /* ALPHABET.DNA */:\n case \"RNA\" /* ALPHABET.RNA */:\n return NucleotidesPalettes.Chromatogram;\n // other\n default:\n return UnknownSeqPalettes.Color;\n }\n}\nexport function pickUpSeqCol(df) {\n var _a;\n const semTypeColList = df.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);\n let resCol = (_a = semTypeColList.find((col) => {\n const units = col.getTag(DG.TAGS.UNITS);\n return units ? units.indexOf('MSA') !== -1 : false;\n })) !== null && _a !== void 0 ? _a : null;\n if (!resCol && semTypeColList.length > 0)\n resCol = semTypeColList[0];\n return resCol;\n}\n//# sourceMappingURL=utils.js.map","import { Vector } from './type-declarations';\nimport { randomFloat, randomInt } from './random';\n/**\n * Asserts a condition by throwing an Error.\n *\n * @export\n * @param {boolean} [condition=false] Condition to assert.\n * @param {string} [message='Assertion error.'] Message to output.\n * @throws {Error}\n */\nexport function assert(condition = false, message = 'Assertion error.') {\n if (!condition)\n throw new Error(message);\n}\n/**\n * Creates new two-dimensional array and fills it with the value given.\n *\n * @param {number} dimension1 The first dimension of the coordinates (number of rows).\n * @param {number} dimension2 The second dimension of the coordinates (number of columns).\n * @param {number} [fill=0] A value to fill the coordinates with.\n * @return {Coordinates} A two-dimensional filled with the value given.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nfunction initCoordinates(dimension1, dimension2, fill = 0) {\n return new Array(dimension1).fill(fill).map(() => (new Vector(dimension2).fill(fill)));\n}\n/**\n * Transpose matrix.\n *\n * @export\n * @param {Matrix} matrix The matrix to be transposed.\n * @return {Matrix} Transposed matrix.\n * @todo Might be slow since used Array.map. Probably needs performance revision.\n */\nexport function transposeMatrix(matrix) {\n return new Array(matrix[0].length).fill(0)\n .map((_, i) => (new Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));\n}\n/**\n * Adds two vectors with the second one to be multiplied by the given ratio.\n *\n * @export\n * @param {Vector} p The first vector to add.\n * @param {Vector} q The second vector to add.\n * @param {number} [multiplier=1] A multiplier to be used before the second vector is added.\n * @return {Vector} New vector contained the result of operation p+multiplier*q.\n */\nexport function vectorAdd(p, q, multiplier = 1) {\n const nItems = p.length;\n assert(nItems == q.length, 'Vector lengths do not match.');\n const total = new Vector(nItems);\n for (let i = 0; i < p.length; ++i)\n total[i] = p[i] + multiplier * q[i];\n return total;\n}\n/**\n * Sums the vector's items.\n *\n * @param {Vector} v The vector to be summed.\n * @return {number} The vector's items sum.\n */\nfunction itemsSum(v) {\n let total = 0;\n for (let i = 0; i < v.length; ++i)\n total += v[i];\n return total;\n}\n/**\n * Suqares the vector's items.\n *\n * @param {Vector} v The vector to square.\n * @return {Vector} A new vector containing the original's items squared.\n */\nfunction vectorSquare(v) {\n const nItems = v.length;\n const total = new Vector(nItems);\n for (let i = 0; i < v.length; ++i)\n total[i] = v[i] * v[i];\n return total;\n}\nexport function vectorLength(v) {\n let sqrSum = 0;\n for (let i = 0; i < v.length; i++)\n sqrSum += v[i] * v[i];\n return Math.sqrt(sqrSum);\n}\nexport function vectorDotProduct(v1, v2) {\n if (v1.length != v2.length)\n throw new Error('The dimensionality of the vectors must match');\n let prod = 0;\n for (let i = 0; i < v1.length; i++)\n prod += v1[i] * v2[i];\n return prod;\n}\n/**\n * Creates a matrix filled with random floating point values.\n *\n * @export\n * @param {number} dimension1 The first dimension of the matrix.\n * @param {number} dimension2 The second dimension of the matrix.\n * @param {number} [scale=1.] Max value given by random generator.\n * @return {Matrix} A new matrix filled with random floating point values.\n */\nexport function fillRandomMatrix(dimension1, dimension2, scale = 1.) {\n const matrix = initCoordinates(dimension1, dimension2);\n for (let i = 0; i < dimension1; ++i) {\n for (let j = 0; j < dimension2; ++j)\n matrix[i][j] = randomFloat(scale);\n }\n return matrix;\n}\n/**\n * Calculates Euclidean distance between two vectors.\n *\n * @export\n * @param {Vector} p The first vector.\n * @param {Vector} q The second vector.\n * @return {number} Euclidean distance between the given vectors.\n */\nexport function calculateEuclideanDistance(p, q) {\n const diff = vectorAdd(p, q, -1);\n const sqdiff = vectorSquare(diff);\n const sqdiffSumm = itemsSum(sqdiff);\n return Math.sqrt(sqdiffSumm);\n}\n/**\n * Creates a distance matrix using a custom distance function.\n *\n * @export\n * @param {Vectors} data Input vectors to calculate distances.\n * @param {DistanceMetric} distance Custom distance function.\n * @return {Matrix} Calculated custom distance matrix.\n */\nexport function calcDistanceMatrix(data, distance) {\n const nItems = data.length;\n const matrix = initCoordinates(nItems, nItems, 0);\n for (let i = 0; i < nItems; ++i) {\n for (let j = i + 1; j < nItems; ++j) {\n const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);\n matrix[i][j] = matrix[j][i] = d;\n }\n }\n return matrix;\n}\n/** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/\nexport function genRange(begin, end, endExclusive = false) {\n const nItems = end - begin + (endExclusive ? 0 : 1);\n const series = new Int32Array(nItems);\n for (let i = 0; i < nItems; ++i)\n series[i] = begin + i;\n return series;\n}\n/**\n * Returns order of values as if they are sorted.\n *\n * @export\n * @param {any[]} values Input array.\n * @param {boolean} [reverse=false] Whether to return reversed order.\n * @return {number[]} The order computed.\n */\nexport function argSort(values, reverse = false) {\n const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);\n const decor = (v, i) => [v, i]; // set index to value\n const undecor = (a) => a[1]; // leave only index\n const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);\n return _argsort(values);\n}\n/**\n * Returns the indexes of the most diverse objects according to the dist function\n * @param {number} length total number of objects\n * @param {number} n number of diverse elements to find\n * @param {(i1: number, i2: number) => number} dist a function which calculates distance between\n * two objects using their indexes\n * @returns {number[]} The indexes of the most diverse objects\n */\nexport function getDiverseSubset(length, n, dist) {\n function maxBy(values, orderBy) {\n let maxValue = null;\n let maxOrderBy = null;\n for (const element of values) {\n const elementOrderBy = orderBy(element);\n if (maxOrderBy == null || elementOrderBy > maxOrderBy) {\n maxValue = element;\n maxOrderBy = elementOrderBy;\n }\n }\n return maxValue;\n }\n const subset = [randomInt(length - 1)];\n const complement = new Set();\n for (let i = 0; i < length; ++i) {\n if (!subset.includes(i))\n complement.add(i);\n }\n while (subset.length < n) {\n const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {\n return dist(i, val);\n })));\n if (idx) {\n subset.push(idx);\n complement.delete(idx);\n }\n }\n return subset;\n}\n/**\n * Returns normalized vector\n * @param {Vector} data numerical array\n */\nexport function normalize(data) {\n let mean = 0;\n let std = 0;\n for (let i = 0; i < data.length; ++i)\n mean += data[i];\n mean /= data.length;\n for (let i = 0; i < data.length; ++i)\n std += (data[i] - mean) * (data[i] - mean);\n std = Math.sqrt(std / data.length);\n for (let i = 0; i < data.length; ++i)\n data[i] = (data[i] - mean) / std;\n return data;\n}\n/**\n * Finds set difference between two lists.\n * @param {any[]} a The first list.\n * @param {any[]} b The second list.\n * @return {any[]}\n */\nexport function setDifference(a, b) {\n const bSet = new Set(b);\n return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxPQUFlLENBQUM7SUFDL0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBYztJQUM1QyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1B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LENBQUM7UUFDbEMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBRTdDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7SUFFbkMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLENBQVEsRUFBRSxDQUFRO0lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWF0cml4LCBWZWN0b3IsIENvb3JkaW5hdGVzLCBWZWN0b3JzLCBEaXN0YW5jZU1ldHJpY30gZnJvbSAnLi90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge3JhbmRvbUZsb2F0LCByYW5kb21JbnR9IGZyb20gJy4vcmFuZG9tJztcblxuLyoqXG4gKiBBc3NlcnRzIGEgY29uZGl0aW9uIGJ5IHRocm93aW5nIGFuIEVycm9yLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmRpdGlvbj1mYWxzZV0gQ29uZGl0aW9uIHRvIGFzc2VydC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZT0nQXNzZXJ0aW9uIGVycm9yLiddIE1lc3NhZ2UgdG8gb3V0cHV0LlxuICogQHRocm93cyB7RXJyb3J9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uOiBib29sZWFuID0gZmFsc2UsIG1lc3NhZ2U6IHN0cmluZyA9ICdBc3NlcnRpb24gZXJyb3IuJykge1xuICBpZiAoIWNvbmRpdGlvbilcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBuZXcgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGFuZCBmaWxscyBpdCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBjb29yZGluYXRlcyAobnVtYmVyIG9mIHJvd3MpLlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjIgVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2YgY29sdW1ucykuXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGw9MF0gQSB2YWx1ZSB0byBmaWxsIHRoZSBjb29yZGluYXRlcyB3aXRoLlxuICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IEEgdHdvLWRpbWVuc2lvbmFsIGZpbGxlZCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqIEB0b2RvIE1pZ2h0IGJlIHNsb3cgc2luY2UgdXNlZCBBcnJheS5tYXAuIFByb2JhYmx5IG5lZWRzIHBlcmZvcm1hbmNlIHJldmlzaW9uLlxuICovXG5mdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBjb25zdCBkaWZmID0gdmVjdG9yQWRkKHAsIHEsIC0xKTtcbiAgY29uc3Qgc3FkaWZmID0gdmVjdG9yU3F1YXJlKGRpZmYpO1xuICBjb25zdCBzcWRpZmZTdW1tID0gaXRlbXNTdW0oc3FkaWZmKTtcbiAgcmV0dXJuIE1hdGguc3FydChzcWRpZmZTdW1tKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGlzdGFuY2UgbWF0cml4IHVzaW5nIGEgY3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yc30gZGF0YSBJbnB1dCB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZXMuXG4gKiBAcGFyYW0ge0Rpc3RhbmNlTWV0cmljfSBkaXN0YW5jZSBDdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtNYXRyaXh9IENhbGN1bGF0ZWQgY3VzdG9tIGRpc3RhbmNlIG1hdHJpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGNEaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opIHtcbiAgICAgIGNvbnN0IGQ6IG51bWJlciA9IChkYXRhW2ldID09IG51bGwpIHx8IChkYXRhW2pdID09IG51bGwpID8gMCA6IGRpc3RhbmNlKGRhdGFbaV0sIGRhdGFbal0pO1xuICAgICAgbWF0cml4W2ldW2pdID0gbWF0cml4W2pdW2ldID0gZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hdHJpeDtcbn1cblxuLyoqIEdlbmVyYXRlcyBhcnJheSBmcm9tIGEgcmFuZ2UgW2JlZ2luOyBlbmRdIG9yIFtiZWdpbjsgZW5kKSBpZiBlbmRFeGNsdXNpdmUuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlblJhbmdlKGJlZ2luOiBudW1iZXIsIGVuZDogbnVtYmVyLCBlbmRFeGNsdXNpdmUgPSBmYWxzZSk6IEludDMyQXJyYXkge1xuICBjb25zdCBuSXRlbXMgPSBlbmQgLSBiZWdpbiArIChlbmRFeGNsdXNpdmUgPyAwIDogMSk7XG4gIGNvbnN0IHNlcmllcyA9IG5ldyBJbnQzMkFycmF5KG5JdGVtcyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuSXRlbXM7ICsraSlcbiAgICBzZXJpZXNbaV0gPSBiZWdpbiArIGk7XG5cbiAgcmV0dXJuIHNlcmllcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG9yZGVyIG9mIHZhbHVlcyBhcyBpZiB0aGV5IGFyZSBzb3J0ZWQuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHthbnlbXX0gdmFsdWVzIElucHV0IGFycmF5LlxuICogQHBhcmFtIHtib29sZWFufSBbcmV2ZXJzZT1mYWxzZV0gV2hldGhlciB0byByZXR1cm4gcmV2ZXJzZWQgb3JkZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJbXX0gVGhlIG9yZGVyIGNvbXB1dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJnU29ydCh2YWx1ZXM6IGFueVtdLCByZXZlcnNlID0gZmFsc2UpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNvcnRmbiA9IHJldmVyc2UgPyAoYTogYW55W10sIGI6IGFueVtdKSA9PiAoYlswXSAtIGFbMF0pIDogKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGFbMF0gLSBiWzBdKTtcbiAgY29uc3QgZGVjb3IgPSAodjogYW55LCBpOiBudW1iZXIpID0+IFt2LCBpXTsgLy8gc2V0IGluZGV4IHRvIHZhbHVlXG4gIGNvbnN0IHVuZGVjb3IgPSAoYTogYW55W10pID0+IGFbMV07IC8vIGxlYXZlIG9ubHkgaW5kZXhcbiAgY29uc3QgX2FyZ3NvcnQgPSAoYXJyOiBhbnlbXSkgPT4gYXJyLm1hcChkZWNvcikuc29ydChzb3J0Zm4pLm1hcCh1bmRlY29yKTtcbiAgcmV0dXJuIF9hcmdzb3J0KHZhbHVlcyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBkaXN0IGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRvdGFsIG51bWJlciBvZiBvYmplY3RzXG4gKiBAcGFyYW0ge251bWJlcn0gbiBudW1iZXIgb2YgZGl2ZXJzZSBlbGVtZW50cyB0byBmaW5kXG4gKiBAcGFyYW0geyhpMTogbnVtYmVyLCBpMjogbnVtYmVyKSA9PiBudW1iZXJ9IGRpc3QgYSBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gb2JqZWN0cyB1c2luZyB0aGVpciBpbmRleGVzXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBpbmRleGVzIG9mIHRoZSBtb3N0IGRpdmVyc2Ugb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGl2ZXJzZVN1YnNldChsZW5ndGg6IG51bWJlciwgbjogbnVtYmVyLCBkaXN0OiAoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyW10ge1xuICBmdW5jdGlvbiBtYXhCeSh2YWx1ZXM6IEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPiwgb3JkZXJCeTogKGk6IG51bWJlcikgPT4gbnVtYmVyKSB7XG4gICAgbGV0IG1heFZhbHVlID0gbnVsbDtcbiAgICBsZXQgbWF4T3JkZXJCeSA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7XG4gICAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGVsZW1lbnRPcmRlckJ5ID4gbWF4T3JkZXJCeSkge1xuICAgICAgICBtYXhWYWx1ZSA9IGVsZW1lbnQ7XG4gICAgICAgIG1heE9yZGVyQnkgPSBlbGVtZW50T3JkZXJCeTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFZhbHVlO1xuICB9XG5cbiAgY29uc3Qgc3Vic2V0ID0gW3JhbmRvbUludChsZW5ndGggLSAxKV07XG4gIGNvbnN0IGNvbXBsZW1lbnQgPSBuZXcgU2V0KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICghc3Vic2V0LmluY2x1ZGVzKGkpKVxuICAgICAgY29tcGxlbWVudC5hZGQoaSk7XG4gIH1cblxuICB3aGlsZSAoc3Vic2V0Lmxlbmd0aCA8IG4pIHtcbiAgICBjb25zdCBpZHggPSBtYXhCeShcbiAgICAgIGNvbXBsZW1lbnQudmFsdWVzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxudW1iZXI+LFxuICAgICAgKGkpID0+IE1hdGgubWluLmFwcGx5KE1hdGgsIHN1YnNldC5tYXAoZnVuY3Rpb24odmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZGlzdChpLCB2YWwpO1xuICAgICAgfSkpKTtcbiAgICBpZiAoaWR4KSB7XG4gICAgICBzdWJzZXQucHVzaChpZHgpO1xuICAgICAgY29tcGxlbWVudC5kZWxldGUoaWR4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1YnNldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGl6ZWQgdmVjdG9yXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gZGF0YSBudW1lcmljYWwgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhOiBWZWN0b3IpOiBWZWN0b3Ige1xuICBsZXQgbWVhbiA9IDA7XG4gIGxldCBzdGQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICBtZWFuICs9IGRhdGFbaV07XG5cbiAgbWVhbiAvPSBkYXRhLmxlbmd0aDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgc3RkICs9IChkYXRhW2ldIC0gbWVhbikgKiAoZGF0YVtpXSAtIG1lYW4pO1xuXG4gIHN0ZCA9IE1hdGguc3FydChzdGQgLyBkYXRhLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pIC8gc3RkO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEZpbmRzIHNldCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxpc3RzLlxuICogQHBhcmFtIHthbnlbXX0gYSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7YW55W119IGIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREaWZmZXJlbmNlKGE6IGFueVtdLCBiOiBhbnlbXSk6IGFueVtdIHtcbiAgY29uc3QgYlNldCA9IG5ldyBTZXQoYik7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYS5maWx0ZXIoKHgpID0+ICFiU2V0Lmhhcyh4KSkpLnZhbHVlcygpKTtcbn1cbiJdfQ==","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n// import * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\nimport * as grok from 'datagrok-api/grok';\nimport { HELM_CORE_FIELDS, jsonSdfMonomerLibDict, MONOMER_ENCODE_MAX, MONOMER_ENCODE_MIN, SDF_MONOMER_NAME } from '../utils/const';\nimport { getSplitter } from '../utils/macromolecule/utils';\nexport function encodeMonomers(col) {\n let encodeSymbol = MONOMER_ENCODE_MIN;\n const monomerSymbolDict = {};\n const units = col.tags[DG.TAGS.UNITS];\n const sep = col.getTag(\"separator\" /* TAGS.separator */);\n const splitterFunc = getSplitter(units, sep);\n const encodedStringArray = [];\n for (let i = 0; i < col.length; ++i) {\n let encodedMonomerStr = '';\n const monomers = splitterFunc(col.get(i));\n monomers.forEach((m) => {\n if (!monomerSymbolDict[m]) {\n if (encodeSymbol > MONOMER_ENCODE_MAX) {\n grok.shell.error(`Not enough symbols to encode monomers`);\n return null;\n }\n monomerSymbolDict[m] = encodeSymbol;\n encodeSymbol++;\n }\n encodedMonomerStr += String.fromCodePoint(monomerSymbolDict[m]);\n });\n encodedStringArray.push(encodedMonomerStr);\n }\n return DG.Column.fromStrings('encodedMolecules', encodedStringArray);\n}\nexport function getMolfilesFromSeq(col, monomersLibObject) {\n const units = col.tags[DG.TAGS.UNITS];\n const sep = col.getTag('separator');\n const splitterFunc = getSplitter(units, sep);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n for (let i = 0; i < col.length; ++i) {\n const macroMolecule = col.get(i);\n const monomers = splitterFunc(macroMolecule);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n if (monomers[j]) {\n if (!monomersDict[monomers[j]]) {\n grok.shell.warning(`Monomer ${monomers[j]} is missing in HELM library. Structure cannot be created`);\n return null;\n }\n // what is the reason of double conversion?\n molFilesForSeq.push(JSON.parse(JSON.stringify(monomersDict[monomers[j]])));\n }\n }\n molFiles.push(molFilesForSeq);\n }\n return molFiles;\n}\nexport function getMolfilesFromSingleSeq(cell, monomersLibObject) {\n const units = cell.column.tags[DG.TAGS.UNITS];\n const sep = cell.column.getTag('separator');\n const splitterFunc = getSplitter(units, sep);\n const monomersDict = createMomomersMolDict(monomersLibObject);\n const molFiles = [];\n const macroMolecule = cell.value;\n const monomers = splitterFunc(macroMolecule);\n const molFilesForSeq = [];\n for (let j = 0; j < monomers.length; ++j) {\n if (monomers[j]) {\n if (!monomersDict[monomers[j]]) {\n grok.shell.warning(`Monomer ${monomers[j]} is missing in HELM library. Structure cannot be created`);\n return null;\n }\n molFilesForSeq.push(JSON.parse(JSON.stringify(monomersDict[monomers[j]])));\n }\n }\n molFiles.push(molFilesForSeq);\n return molFiles;\n}\nexport function createMomomersMolDict(lib) {\n const dict = {};\n lib.forEach((it) => {\n if (it['polymerType'] === 'PEPTIDE') {\n const monomerObject = {};\n HELM_CORE_FIELDS.forEach((field) => {\n monomerObject[field] = it[field];\n });\n dict[it[\"symbol\" /* HELM_FIELDS.SYMBOL */]] = monomerObject;\n }\n });\n return dict;\n}\nexport function createJsonMonomerLibFromSdf(table) {\n const resultLib = [];\n for (let i = 0; i < table.rowCount; i++) {\n const monomer = {};\n Object.keys(jsonSdfMonomerLibDict).forEach((key) => {\n if (key === \"symbol\" /* HELM_FIELDS.SYMBOL */) {\n const monomerSymbol = table.get(jsonSdfMonomerLibDict[key], i);\n monomer[key] = monomerSymbol === '.' ? table.get(SDF_MONOMER_NAME, i) : monomerSymbol;\n }\n else if (key === \"rgroups\" /* HELM_FIELDS.RGROUPS */) {\n const rgroups = table.get(jsonSdfMonomerLibDict[key], i).split('\\n');\n const jsonRgroups = [];\n rgroups.forEach((g) => {\n const rgroup = {};\n const altAtom = g.substring(g.lastIndexOf(']') + 1);\n const radicalNum = g.match(/\\[R(\\d+)\\]/)[1];\n rgroup[\"capGroupSmiles\" /* HELM_RGROUP_FIELDS.CAP_GROUP_SMILES */] = altAtom === 'H' ? `[*:${radicalNum}][H]` : `O[*:${radicalNum}]`;\n rgroup[\"alternateId\" /* HELM_RGROUP_FIELDS.ALTERNATE_ID */] = altAtom === 'H' ? `R${radicalNum}-H` : `R${radicalNum}-OH`;\n rgroup[\"capGroupName\" /* HELM_RGROUP_FIELDS.CAP_GROUP_NAME */] = altAtom === 'H' ? `H` : `OH`;\n rgroup[\"label\" /* HELM_RGROUP_FIELDS.LABEL */] = `R${radicalNum}`;\n jsonRgroups.push(rgroup);\n });\n monomer[key] = jsonRgroups;\n }\n else {\n if (jsonSdfMonomerLibDict[key])\n monomer[key] = table.get(jsonSdfMonomerLibDict[key], i);\n }\n });\n resultLib.push(monomer);\n }\n return resultLib;\n}\nexport function getMonomerLibHelper() {\n return __awaiter(this, void 0, void 0, function* () {\n const funcList = DG.Func.find({ package: 'Bio', name: 'getMonomerLibHelper' });\n if (funcList.length === 0)\n throw new Error('Package \"Bio\" must be installer for MonomerLibraryHelper.');\n const res = (yield funcList[0].prepare().call()).getOutputParamValue();\n return res;\n });\n}\n//# sourceMappingURL=monomer-utils.js.map","/**\n * Denotes a vector of floating poit values.\n *\n * @export\n * @class Vector\n * @extends {Float32Array}\n */\nexport class Vector extends Float32Array {\n}\n/**\n * Denotes a two-dimensional matrix.\n *\n * @export\n * @class Matrix\n * @extends {Array<Vector>}\n */\nexport class Matrix extends Array {\n}\n/**\n * Denotes cartesian coordinates.\n *\n * @export\n * @class Coordinates\n * @extends {Matrix}\n */\nexport class Coordinates extends Matrix {\n}\n/**\n * Denotes an array of arbitrary-typed vectors.\n *\n * @export\n * @class Vectors\n * @extends {Array<any>}\n */\nexport class Vectors extends Array {\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiJdfQ==","export class SeqPaletteBase {\n static makePalette(dt, simplified = false, PaletteType = SeqPaletteBase) {\n const palette = {};\n dt.forEach((cp) => {\n const objList = cp[0];\n const colour = cp[1];\n objList.forEach((obj, ind) => {\n palette[obj] = this.colourPalette[colour][simplified ? 0 : ind];\n });\n });\n return new PaletteType(palette);\n }\n constructor(palette) {\n this._palette = palette;\n }\n get(m) {\n return this._palette[m];\n }\n}\nSeqPaletteBase.undefinedColor = 'rgb(100,100,100)';\n/** Palette with shades of primary colors */\nSeqPaletteBase.colourPalette = {\n 'orange': ['rgb(255,187,120)', 'rgb(245,167,100)', 'rgb(235,137,70)', 'rgb(205, 111, 71)'],\n 'all_green': ['rgb(44,160,44)', 'rgb(74,160,74)', 'rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)',\n 'rgb(24,110,79)', 'rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'all_blue': ['rgb(31,119,180)', 'rgb(23,190,207)', 'rgb(122, 102, 189)', 'rgb(158,218,229)', 'rgb(141, 124, 217)',\n 'rgb(31, 120, 150)'],\n 'magenta': ['rgb(162,106,192)', 'rgb(197,165,224)', 'rgb(208,113,218)'],\n 'red': ['rgb(214,39,40)', 'rgb(255,152,150)'],\n 'st_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(31,119,180)'],\n 'dark_blue': ['rgb(31,119,180)', 'rgb(31, 120, 150)'],\n 'light_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(108, 218, 229)', 'rgb(23,190,227)'],\n 'lilac_blue': ['rgb(124,102,211)', 'rgb(149,134,217)', 'rgb(97, 81, 150)'],\n 'dark_green': ['rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)', 'rgb(24,110,79)'],\n 'green': ['rgb(44,160,44)', 'rgb(74,160,74)'],\n 'light_green': ['rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],\n 'st_green': ['rgb(44,160,44)', 'rgb(152,223,138)', 'rgb(39, 174, 96)', 'rgb(74,160,74)'],\n 'pink': ['rgb(247,182,210)'],\n 'brown': ['rgb(140,86,75)', 'rgb(102, 62, 54)'],\n 'gray': ['rgb(127,127,127)', 'rgb(199,199,199)', 'rgb(196,156,148)', 'rgb(222, 222, 180)'],\n 'yellow': ['rgb(188,189,34)'],\n 'white': ['rgb(230,230,230)'],\n};\n//# sourceMappingURL=seq-palettes.js.map","import { SeqPaletteBase } from './seq-palettes';\nexport class AminoacidsPalettes extends SeqPaletteBase {\n static get Lesk() {\n if (this.lesk === void 0) {\n this.lesk = this.makePalette([\n [['G', 'A', 'S', 'T'], 'orange'],\n [['C', 'V', 'I', 'L', 'P', 'F', 'Y', 'M', 'W'], 'all_green'],\n [['N', 'Q', 'H'], 'magenta'],\n [['D', 'E'], 'red'],\n [['K', 'R'], 'all_blue'],\n ], false, AminoacidsPalettes);\n }\n return this.lesk;\n }\n static get GrokGroups() {\n if (this.grokGroups === void 0) {\n this.grokGroups = this.makePalette([\n [['C', 'U'], 'yellow'],\n [['G', 'P'], 'red'],\n [['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'], 'all_green'],\n [['R', 'H', 'K'], 'light_blue'],\n [['D', 'E'], 'dark_blue'],\n [['S', 'T', 'N', 'Q'], 'orange'],\n ], false, AminoacidsPalettes);\n }\n return this.grokGroups;\n }\n static get RasMol() {\n if (this.rasMol === void 0) {\n this.rasMol = new AminoacidsPalettes({\n // http://acces.ens-lyon.fr/biotic/rastop/help/colour.htm\n 'D': '#E60A0A',\n 'E': '#E60A0A',\n 'C': '#E6E600',\n 'M': '#E6E600',\n 'K': '#145AFF',\n 'R': '#145AFF',\n 'S': '#FA9600',\n 'T': '#FA9600',\n 'F': '#3232AA',\n 'Y': '#3232AA',\n 'N': '#00DCDC',\n 'Q': '#00DCDC',\n 'G': '#EBEBEB',\n 'L': '#0F820F',\n 'V': '#0F820F',\n 'I': '#0F820F',\n 'A': '#C8C8C8',\n 'W': '#B45AB4',\n 'H': '#8282D2',\n 'P': '#DC9682',\n 'others': '#BEA06E',\n });\n }\n return this.rasMol;\n }\n get(m) {\n const resM = m in AminoacidsPalettes.aaSynonyms ? AminoacidsPalettes.aaSynonyms[m] : m;\n const res = super.get(resM);\n return res;\n }\n}\n/** Only some of the synonyms. These were obtained from the clustered oligopeptide dataset. */\nAminoacidsPalettes.aaSynonyms = {\n 'MeNle': 'L',\n 'MeA': 'A',\n 'MeG': 'G',\n 'MeF': 'F',\n};\nexport class Aminoacids {\n static getPalette(scheme = 'grok') {\n switch (scheme) {\n case 'grok':\n return AminoacidsPalettes.GrokGroups;\n case 'lesk':\n return AminoacidsPalettes.Lesk;\n default:\n throw new Error(`ChemPalette: scheme \\`${scheme}\\` does not exist`);\n }\n }\n /**\n * Returns divided amino acid with its content in the bracket, if the content is number, then its omitted\n *\n * @param {string} c raw amino\n * @return {[string, string]} outer and inner content\n */\n static getInnerOuter(c) {\n let isInner = 0;\n let inner = '';\n let outer = '';\n for (const char of c) {\n if (char == '(')\n isInner++;\n else if (char == ')')\n isInner--;\n else if (isInner)\n inner += char;\n else\n outer += char;\n }\n return !isNaN(parseInt(inner)) ? [outer, ''] : [outer, inner];\n }\n static getColorAAPivot(monomer = '', scheme = 'grok') {\n var _a, _b, _c;\n //const chemPaletteInstance = AAPalettes.GrokGroups();\n const chemPaletteInstance = this.getPalette(scheme);\n let [outerMonomer, innerMonomer] = this.getInnerOuter(monomer);\n outerMonomer = (outerMonomer.length > 6 ? `${outerMonomer.slice(0, 3)}...` : outerMonomer);\n innerMonomer = (innerMonomer.length > 6 ? `${innerMonomer.slice(0, 3)}...` : innerMonomer);\n if (monomer.length == 1 || monomer[1] == '(') {\n const amino = (_a = monomer[0]) === null || _a === void 0 ? void 0 : _a.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 1] :\n [this.undefinedColor, outerMonomer, innerMonomer, 1];\n }\n if (monomer[0] == 'd' && monomer[1] in chemPaletteInstance) {\n if (monomer.length == 2 || monomer[2] == '(') {\n const amino = (_b = monomer[1]) === null || _b === void 0 ? void 0 : _b.toUpperCase();\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 2] :\n [this.undefinedColor, outerMonomer, innerMonomer, 2];\n }\n }\n if (monomer.substring(0, 3) in this.AAFullNames) {\n if (monomer.length == 3 || monomer[3] == '(') {\n const amino = this.AAFullNames[monomer.substring(0, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 3] :\n [this.undefinedColor, outerMonomer, innerMonomer, 3];\n }\n }\n if (((_c = monomer[0]) === null || _c === void 0 ? void 0 : _c.toLowerCase()) == monomer[0]) {\n if (monomer.substring(1, 3) in this.AAFullNames) {\n if (monomer.length == 4 || monomer[4] == '(') {\n const amino = this.AAFullNames[monomer.substring(1, 3)];\n return amino in chemPaletteInstance ?\n [chemPaletteInstance.get(amino), amino, innerMonomer, 4] :\n [this.undefinedColor, outerMonomer, innerMonomer, 4];\n }\n }\n }\n return [this.undefinedColor, outerMonomer, innerMonomer, 0];\n }\n}\nAminoacids.SemType = 'Aminoacids';\nAminoacids.SemTypeMultipleAlignment = 'AminoacidsMultipleAlignment';\nAminoacids.undefinedColor = 'rgb(100,100,100)';\nAminoacids.Names = {\n 'G': 'Glycine',\n 'L': 'Leucine',\n 'Y': 'Tyrosine',\n 'S': 'Serine',\n 'E': 'Glutamic acid',\n 'Q': 'Glutamine',\n 'D': 'Aspartic acid',\n 'N': 'Asparagine',\n 'F': 'Phenylalanine',\n 'A': 'Alanine',\n 'K': 'Lysine',\n 'R': 'Arginine',\n 'H': 'Histidine',\n 'C': 'Cysteine',\n 'V': 'Valine',\n 'P': 'Proline',\n 'W': 'Tryptophan',\n 'I': 'Isoleucine',\n 'M': 'Methionine',\n 'T': 'Threonine',\n};\nAminoacids.AASmiles = {\n 'G': 'NCC(=O)O',\n 'L': 'N[C@H](CC(C)C)C(=O)O',\n 'Y': 'NC(CC1=CC=C(O)C=C1)C(=O)O',\n 'S': 'NC(CO)C(=O)O',\n 'E': 'N[C@@H](CCC(O)=O)C(=O)O',\n 'Q': 'N[C@@H](CCC(N)=O)C(=O)O',\n 'D': 'N[C@@H](CC(O)=O)C(=O)O',\n 'N': 'N[C@@H](CC(N)=O)C(=O)O',\n 'F': 'NC(CC1=CC=CC=C1)C(=O)O',\n 'A': 'N[C@H](C)C(=O)O',\n 'K': 'NC(CCCCN)C(=O)O',\n 'R': 'N[C@H](CCCNC(=N)C)C(=O)O',\n 'H': 'NC(CC1=CN=C[N]1)C(=O)O',\n 'C': 'N[C@@H](CS)C(=O)O',\n 'V': 'NC(C(C)C)C(=O)O',\n 'P': 'N(CCC1)C1C(=O)O',\n 'W': 'N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O',\n 'I': 'N[C@H]([C@H](C)CC)C(=O)O',\n 'M': 'NC(CCSC)C(=O)O',\n 'T': 'NC(C(O)C)C(=O)O',\n};\nAminoacids.AASmilesTruncated = {\n 'G': '*C*',\n 'L': 'CC(C)C[C@H](*)*',\n 'Y': 'C1=CC(=CC=C1CC(*)*)O',\n 'S': 'OCC(*)C*',\n 'E': '*[C@@H](CCC(O)=O)*',\n 'Q': '*N[C@@H](CCC(N)=O)*',\n 'D': '*[C@@H](CC(O)=O)*',\n 'N': '*[C@@H](CC(N)=O)*',\n 'F': 'C1=CC=C(C=C1)CC(*)*',\n 'A': 'C[C@H](*)*',\n 'K': 'C(CCN)CC(*)*',\n 'R': '*[C@H](CCCNC(=N)C)*',\n 'H': 'C1=C(NC=N1)CC(*)*',\n 'C': 'C([C@@H](*)*)S',\n 'V': 'CC(C)C(*)*',\n 'P': 'C1CCN(*)C1*',\n 'W': '*[C@@H](Cc1c2ccccc2n([H])c1)*',\n 'I': 'CC[C@H](C)[C@H](*)*',\n 'M': 'CSCCC(*)*',\n 'T': 'CC(O)C(*)*',\n};\n/** TODO: Full?\n */\nAminoacids.AAFullNames = {\n 'Ala': 'A',\n 'Arg': 'R',\n 'Asn': 'N',\n 'Asp': 'D',\n 'Cys': 'C',\n 'Gln': 'Q',\n 'Glu': 'E',\n 'Gly': 'G',\n 'His': 'H',\n 'Ile': 'I',\n 'Leu': 'L',\n 'Lys': 'K',\n 'Met': 'M',\n 'Phe': 'F',\n 'Pro': 'P',\n 'Ser': 'S',\n 'Thr': 'T',\n 'Trp': 'W',\n 'Tyr': 'Y',\n 'Val': 'V',\n};\n//# sourceMappingURL=aminoacids.js.map","import { SeqPaletteBase } from './seq-palettes';\nexport class NucleotidesPalettes extends SeqPaletteBase {\n static get Chromatogram() {\n if (this.chromatogram === void 0) {\n this.chromatogram = new NucleotidesPalettes({\n 'A': 'green',\n 'C': 'blue',\n 'G': 'black',\n 'T': 'red',\n 'U': 'red',\n 'others': 'gray',\n });\n }\n return this.chromatogram;\n }\n}\nexport class Nucleotides {\n}\nNucleotides.SemType = 'Nucleotides';\nNucleotides.SemTypeMultipleAlignment = 'NucleotidesMultipleAlignment';\nNucleotides.Names = {\n 'A': 'Adenine',\n 'C': 'Cytosine',\n 'G': 'Guanine',\n 'T': 'Thymine',\n 'U': 'Uracil',\n};\n//# sourceMappingURL=nucleotides.js.map","import * as DG from 'datagrok-api/dg';\n/** makes the color less white, makes the transparency effect always perceptible\n * @param {string} color x coordinate.\n * */\nfunction correctColor(color) {\n if (color == null)\n return 'rgb(100,100,100)';\n const dgColor = DG.Color.fromHtml(color);\n const g = DG.Color.g(dgColor);\n const r = DG.Color.r(dgColor);\n const b = DG.Color.b(dgColor);\n // calculate euclidean distance to white\n const distToBlack = Math.sqrt(Math.pow(0 - r, 2) + Math.pow(0 - g, 2) + Math.pow(0 - b, 2));\n // normalize vector r g b\n const normR = r / distToBlack;\n const normG = g / distToBlack;\n const normB = b / distToBlack;\n if (distToBlack > 210) {\n return `rgb(${normR * 210},${normG * 210},${normB * 210})`;\n }\n return DG.Color.toRgb(dgColor);\n}\nexport class StringUtils {\n static hashCode(s) {\n let hash = 0;\n if (s.length === 0)\n return hash;\n for (let i = 0; i < s.length; i++) {\n const chr = s.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n }\n}\nimport { SeqPaletteBase } from './seq-palettes';\nexport class UnknownSeqPalette {\n}\nexport class GrayAllPalette extends UnknownSeqPalette {\n get(m) {\n return '#666666';\n }\n}\nexport class UnknownColorPalette extends UnknownSeqPalette {\n static buildPalette() {\n const res = [].concat(...Object.values(SeqPaletteBase.colourPalette));\n return res;\n }\n get(m) {\n const hash = StringUtils.hashCode(m);\n const pI = hash % UnknownColorPalette.palette.length;\n return correctColor(UnknownColorPalette.palette[pI]);\n }\n}\nUnknownColorPalette.palette = UnknownColorPalette.buildPalette();\nexport class UnknownSeqPalettes extends SeqPaletteBase {\n static get Gray() {\n if (this.gray === void 0)\n this.gray = new GrayAllPalette();\n return this.gray;\n }\n static get Color() {\n if (this.color === void 0)\n this.color = new UnknownColorPalette();\n return this.color;\n }\n}\n//# sourceMappingURL=unknown.js.map","import { monomerToShort } from './macromolecule/utils';\nconst undefinedColor = 'rgb(100,100,100)';\nconst grayColor = '#808080';\nconst blackColor = 'rgb(0,0,0)';\nconst monomerToShortFunction = monomerToShort;\nexport var DrawStyle;\n(function (DrawStyle) {\n DrawStyle[\"MSA\"] = \"MSA\";\n DrawStyle[\"classic\"] = \"classic\";\n})(DrawStyle || (DrawStyle = {}));\n/**\n * A function that prints a string aligned to left or centered.\n *\n * @param {number} x x coordinate.\n * @param {number} y y coordinate.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {CanvasRenderingContext2D} g Canvas rendering context.\n * @param {string} s String to print.\n * @param {string} [color=undefinedColor] String color.\n * @param {number} [pivot=0] Pirvot.\n * @param {boolean} [left=false] Is left aligned.\n * @param {number} [transparencyRate=0.0] Transparency rate where 1.0 is fully transparent\n * @param {string} [separator=''] Is separator for sequence.\n * @param {boolean} [last=false] Is checker if element last or not.\n * @param drawStyle Is draw style. MSA - for multicharSeq, classic - for other seq.\n * @param maxWord Is array of max words for each line.\n * @param wordIdx Is index of word we currently draw.\n * @param gridCell Is grid cell.\n * @param referenceSequence Is reference sequence for diff mode.\n * @param maxLengthOfMonomer Is max length of monomer.\n * @return {number} x coordinate to start printing at.\n */\nexport const printLeftOrCentered = (x, y, w, h, g, s, color = undefinedColor, pivot = 0, left = false, transparencyRate = 1.0, separator = '', last = false, drawStyle = DrawStyle.classic, maxWord = {}, wordIdx = 0, gridCell = null, referenceSequence = [], maxLengthOfMonomer = null) => {\n var _a, _b, _c;\n g.textAlign = 'start';\n let colorPart = s.substring(0);\n let grayPart = last ? '' : separator;\n if (drawStyle === DrawStyle.MSA) {\n grayPart = '';\n }\n let colorCode = true;\n let compareWithCurrent = true;\n let highlightDifference = 'difference';\n if ((gridCell != null) && (gridCell.cell.column != null)) {\n colorCode = (_a = gridCell.cell.column.temp['color-code']) !== null && _a !== void 0 ? _a : true;\n compareWithCurrent = (_b = gridCell.cell.column.temp['compare-with-current']) !== null && _b !== void 0 ? _b : true;\n highlightDifference = (_c = gridCell.cell.column.temp['highlight-difference']) !== null && _c !== void 0 ? _c : 'difference';\n }\n const currentMonomer = referenceSequence[wordIdx];\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'difference')) {\n transparencyRate = (colorPart == currentMonomer) ? 0.3 : transparencyRate;\n }\n if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'equal')) {\n transparencyRate = (colorPart != currentMonomer) ? 0.3 : transparencyRate;\n }\n if (maxLengthOfMonomer != null) {\n colorPart = monomerToShortFunction(colorPart, maxLengthOfMonomer);\n }\n let textSize = g.measureText(colorPart + grayPart);\n const indent = 5;\n let maxColorTextSize = g.measureText(colorPart).width;\n let colorTextSize = g.measureText(colorPart).width;\n const dy = h / 2 - (textSize.fontBoundingBoxAscent + textSize.fontBoundingBoxDescent) / 2 + 1;\n textSize = textSize.width;\n if (drawStyle === DrawStyle.MSA) {\n maxColorTextSize = maxWord[wordIdx];\n textSize = maxWord[wordIdx];\n }\n function draw(dx1, dx2) {\n const drawColor = colorCode ? color : blackColor;\n g.fillStyle = drawColor;\n g.globalAlpha = transparencyRate;\n if (drawStyle === DrawStyle.classic) {\n g.fillText(colorPart, x + dx1, y + dy);\n g.fillStyle = grayColor;\n g.fillText(grayPart, x + dx2, y + dy);\n }\n if (drawStyle === DrawStyle.MSA) {\n g.fillStyle = drawColor;\n g.fillText(colorPart, x + dx1 + ((maxWord[wordIdx] - colorTextSize) / 2), y + dy);\n }\n }\n if (left || textSize > w) {\n draw(indent, indent + maxColorTextSize);\n return x + maxColorTextSize + g.measureText(grayPart).width;\n }\n else {\n const dx = (w - textSize) / 2;\n draw(dx, dx + maxColorTextSize);\n return x + dx + maxColorTextSize;\n }\n};\n//# sourceMappingURL=cell-renderer.js.map","export function errorToConsole(err) {\n var _a;\n if (typeof err === 'string' || err instanceof String) {\n return err;\n }\n else if ('$thrownJsError' in err) {\n return errorToConsole(err['$thrownJsError']);\n }\n else if (err instanceof Error) {\n return (_a = err.stack) !== null && _a !== void 0 ? _a : err.message;\n }\n else {\n return err.toString();\n }\n}\nexport function rectToConsole(rect) {\n return `(x=${rect.x}, y=${rect.y}, w=${rect.width}, h=${rect.height})`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tY29uc29sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvLWNvbnNvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFROztJQUNyQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLFlBQVksTUFBTSxFQUFFO1FBQ3BELE9BQU8sR0FBYSxDQUFDO0tBQ3RCO1NBQU0sSUFBSSxnQkFBZ0IsSUFBSSxHQUFHLEVBQUU7UUFDbEMsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztLQUM5QztTQUFNLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRTtRQUMvQixPQUFPLE1BQUMsR0FBYSxDQUFDLEtBQUssbUNBQUssR0FBYSxDQUFDLE9BQU8sQ0FBQztLQUN2RDtTQUFNO1FBQ0wsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDdkI7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFhO0lBQ3pDLE9BQU8sTUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yVG9Db25zb2xlKGVycjogYW55KTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnIHx8IGVyciBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgIHJldHVybiBlcnIgYXMgc3RyaW5nO1xuICB9IGVsc2UgaWYgKCckdGhyb3duSnNFcnJvcicgaW4gZXJyKSB7XG4gICAgcmV0dXJuIGVycm9yVG9Db25zb2xlKGVyclsnJHRocm93bkpzRXJyb3InXSk7XG4gIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gKGVyciBhcyBFcnJvcikuc3RhY2sgPz8gKGVyciBhcyBFcnJvcikubWVzc2FnZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXJyLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY3RUb0NvbnNvbGUocmVjdDogREcuUmVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBgKHg9JHtyZWN0Lnh9LCB5PSR7cmVjdC55fSwgdz0ke3JlY3Qud2lkdGh9LCBoPSR7cmVjdC5oZWlnaHR9KWA7XG59XG4iXX0=","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {findMonomers, parseHelm, getParts} from './utils';\nimport {printLeftOrCentered} from '@datagrok-libraries/bio/src/utils/cell-renderer';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\n\n\nexport class HelmCellRenderer extends DG.GridCellRenderer {\n get name() { return 'helm'; }\n\n get cellType() { return 'helm'; }\n\n get defaultWidth(): number | null { return 400; }\n\n get defaultHeight(): number | null { return 100; }\n\n onMouseMove(gridCell: DG.GridCell, e: MouseEvent): void {\n try {\n const maxLengthWordsSum = gridCell.cell.column.temp['helm-sum-maxLengthWords'];\n const maxIndex = Object.values(gridCell.cell.column.temp['helm-maxLengthWords']).length - 1;\n const argsX = e.offsetX - gridCell.gridColumn.left + (gridCell.gridColumn.left - gridCell.bounds.x);\n let left = 0;\n let right = maxIndex;\n let found = false;\n maxLengthWordsSum[maxIndex + 1] = argsX + 1;\n let mid = 0;\n if (argsX > maxLengthWordsSum[0]) {\n while (!found) {\n mid = Math.floor((right + left) / 2);\n if (argsX >= maxLengthWordsSum[mid] && argsX <= maxLengthWordsSum[mid + 1]) {\n left = mid;\n found = true;\n } else if (argsX < maxLengthWordsSum[mid]) {\n right = mid - 1;\n } else if (argsX > maxLengthWordsSum[mid + 1]) {\n left = mid + 1;\n }\n if (left == right)\n found = true;\n }\n }\n left = (argsX >= maxLengthWordsSum[left]) ? left + 1 : left;\n const monomers = findMonomers(gridCell.cell.value);\n const s: string = gridCell.cell.value ?? '';\n const subParts: string[] = parseHelm(s);\n const allParts: string[] = getParts(subParts, s);\n const tooltipMessage: HTMLElement[] = [];\n for (let i = 0; i < allParts.length; ++i) {\n if (monomers.has(allParts[i])) {\n tooltipMessage[i] = ui.divV([\n ui.divText(`Monomer '${allParts[i]}' not found.`),\n ui.divText('Open the Context Panel, then expand Manage Libraries')\n ]);\n }\n }\n (((tooltipMessage[left]?.childNodes.length ?? 0) > 0)) ?\n ui.tooltip.show(ui.div(tooltipMessage[left]), e.x + 16, e.y + 16) :\n ui.tooltip.hide();\n } catch (err: any) {\n const errMsg: string = errorToConsole(err);\n console.error('Helm: HelmCellRenderer.onMouseMove() error:\\n' + errMsg);\n }\n }\n\n render(g: CanvasRenderingContext2D, x: number, y: number, w: number, h: number,\n gridCell: DG.GridCell, cellStyle: DG.GridCellStyle\n ) {\n const grid = gridCell.gridRow !== -1 ? gridCell.grid : undefined;\n const undefinedColor = 'rgb(100,100,100)';\n const grayColor = '#808080';\n const monomers = findMonomers(gridCell.cell.value);\n const s: string = gridCell.cell.value ?? '';\n const subParts: string[] = parseHelm(s);\n if (monomers.size == 0 && grid) {\n const host = ui.div([], {style: {width: `${w}px`, height: `${h}px`}});\n host.setAttribute('dataformat', 'helm');\n host.setAttribute('data', gridCell.cell.value);\n gridCell.element = host;\n //@ts-ignore\n const canvas = new JSDraw2.Editor(host, {width: w, height: h, skin: 'w8', viewonly: true});\n return;\n } else {\n if (!grid) {\n const r = window.devicePixelRatio;\n h = 28;\n g.canvas.height = h * r;\n g.canvas.style.height = `${h}px`;\n }\n w = grid ? Math.min(grid.canvas.width - x, w) : g.canvas.width - x;\n g.save();\n g.beginPath();\n g.rect(x, y, w, h);\n g.clip();\n g.font = '12px monospace';\n g.textBaseline = 'top';\n let x1 = x;\n const maxLengthWords: any = {};\n const maxLengthWordSum: any = {};\n const allParts: string[] = getParts(subParts, s);\n for (let i = 0; i < allParts.length; ++i) {\n maxLengthWords[i] = allParts[i].length * 7;\n const color = monomers.has(allParts[i]) ? 'red' : grayColor;\n g.fillStyle = undefinedColor;\n x1 = printLeftOrCentered(x1, y, w, h, g, allParts[i], color, 0, true, 1.0);\n }\n\n maxLengthWordSum[0] = maxLengthWords[0];\n for (let i = 1; i < allParts.length; i++)\n maxLengthWordSum[i] = maxLengthWordSum[i - 1] + maxLengthWords[i];\n\n gridCell.cell.column.temp = {\n 'helm-sum-maxLengthWords': maxLengthWordSum,\n 'helm-maxLengthWords': maxLengthWords\n };\n g.restore();\n return;\n }\n }\n}\n","import * as DG from 'datagrok-api/dg';\nimport { UnitsHandler } from './units-handler';\nimport { getSplitterForColumn, getStats } from './macromolecule/utils';\n/** Class for handling conversion of notation systems in Macromolecule columns */\nexport class NotationConverter extends UnitsHandler {\n get splitter() {\n if (this._splitter === null)\n this._splitter = getSplitterForColumn(this.column);\n return this._splitter;\n }\n toFasta(targetNotation) { return targetNotation === \"fasta\" /* NOTATION.FASTA */; }\n toSeparator(targetNotation) { return targetNotation === \"separator\" /* NOTATION.SEPARATOR */; }\n toHelm(targetNotation) { return targetNotation === \"helm\" /* NOTATION.HELM */; }\n /**\n * Convert a Macromolecule column from FASTA to SEPARATOR notation\n *\n * @param {string} separator A specific separator to be used\n * @param {string} fastaGapSymbol Gap symbol in FASTA, '-' by default\n * @return {DG.Column} A new column in SEPARATOR notation\n */\n convertFastaToSeparator(separator, fastaGapSymbol = null) {\n if (fastaGapSymbol === null)\n fastaGapSymbol = this.defaultGapSymbol;\n const newColumn = this.getNewColumn(\"separator\" /* NOTATION.SEPARATOR */, separator);\n // assign the values to the newly created empty column\n newColumn.init((idx) => {\n const fastaPolymer = this.column.get(idx);\n const fastaMonomersArray = this.splitter(fastaPolymer);\n for (let i = 0; i < fastaMonomersArray.length; i++) {\n if (fastaMonomersArray[i] === fastaGapSymbol)\n fastaMonomersArray[i] = UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n }\n return fastaMonomersArray.join(separator);\n });\n newColumn.setTag(DG.TAGS.UNITS, \"separator\" /* NOTATION.SEPARATOR */);\n return newColumn;\n }\n /**\n * Get the wrapper strings for HELM, depending on the type of the\n * macromolecule (peptide, DNA, RNA)\n *\n * @return {string[]} Array of wrappers\n */\n getHelmWrappers() {\n const prefix = (this.isDna()) ? 'DNA1{' :\n (this.isRna() || this.isHelmCompatible()) ? 'RNA1{' :\n (this.isPeptide()) ? 'PEPTIDE1{' :\n 'Unknown'; // this case should be handled as exceptional\n if (prefix === 'Unknown')\n throw new Error('Neither peptide, nor nucleotide');\n const postfix = '}$$$$';\n const leftWrapper = (this.isDna()) ? 'D(' :\n (this.isRna()) ? 'R(' : ''; // no wrapper for peptides\n const rightWrapper = (this.isDna() || this.isRna()) ? ')P' : ''; // no wrapper for peptides\n return [prefix, leftWrapper, rightWrapper, postfix];\n }\n // A helper function for converting strings to HELM\n convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix) {\n const monomerArray = this.splitter(sourcePolymer);\n const monomerHelmArray = monomerArray.map((mm) => {\n if (mm === sourceGapSymbol)\n return UnitsHandler._defaultGapSymbolsDict.HELM;\n else\n return `${leftWrapper}${mm}${rightWrapper}`;\n });\n return `${prefix}${monomerHelmArray.join('.')}${postfix}`;\n }\n /**\n * Convert a string with SEPARATOR/FASTA notation to HELM\n *\n * @param {string} sourcePolymer A string to be converted\n * @param {string | null} sourceGapSymbol An optional gap symbol, set to\n * default values ('-' for FASTA and '' for SEPARATOR) unless specified\n * @return {string} The target HELM string\n */\n convertStringToHelm(sourcePolymer, sourceGapSymbol = null) {\n if (sourceGapSymbol === null)\n sourceGapSymbol = this.defaultGapSymbol;\n const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();\n return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);\n }\n /**\n * Convert a column to HELM\n *\n * @param {string | null} sourceGapSymbol\n * @return {DG.Column}\n */\n convertToHelm(sourceGapSymbol = null) {\n if (sourceGapSymbol === null)\n sourceGapSymbol = this.defaultGapSymbol;\n const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();\n const newColumn = this.getNewColumn(\"helm\" /* NOTATION.HELM */);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const sourcePolymer = this.column.get(idx);\n return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);\n });\n newColumn.setTag(DG.TAGS.UNITS, \"helm\" /* NOTATION.HELM */);\n return newColumn;\n }\n /**\n * Convert SEPARATOR column to FASTA notation\n *\n * @param {string | null} fastaGapSymbol Optional gap symbol for FASTA\n * @return {DG.Column} Converted column\n */\n convertSeparatorToFasta(fastaGapSymbol = null) {\n if (fastaGapSymbol === null)\n fastaGapSymbol = UnitsHandler._defaultGapSymbolsDict.FASTA;\n const newColumn = this.getNewColumn(\"fasta\" /* NOTATION.FASTA */);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const separatorPolymer = this.column.get(idx);\n // items can be monomers or separators\n const separatorItemsArray = this.splitter(separatorPolymer);\n const fastaMonomersArray = [];\n for (let i = 0; i < separatorItemsArray.length; i++) {\n const item = separatorItemsArray[i];\n if (item.length === 0) {\n fastaMonomersArray.push(fastaGapSymbol);\n }\n else if (item.length > 1) {\n // the case of a multi-character monomer\n const monomer = '[' + item + ']';\n fastaMonomersArray.push(monomer);\n }\n else {\n fastaMonomersArray.push(item);\n }\n }\n return fastaMonomersArray.join('');\n });\n newColumn.setTag(DG.TAGS.UNITS, \"fasta\" /* NOTATION.FASTA */);\n return newColumn;\n }\n /**\n * Convert HELM string to FASTA/SEPARATOR\n *\n * @param {string} helmPolymer A string to be converted\n * @param {string} tgtNotation Target notation: FASTA or SEPARATOR\n * @param {string} tgtSeparator Optional target separator (for HELM ->\n * @param {string | null} tgtGapSymbol Optional target gap symbol\n * SEPARATOR)\n * @return {string} Converted string\n */\n convertHelmToFastaSeparator(helmPolymer, tgtNotation, tgtSeparator, tgtGapSymbol) {\n if (!tgtGapSymbol) {\n tgtGapSymbol = (this.toFasta(tgtNotation)) ?\n UnitsHandler._defaultGapSymbolsDict.FASTA :\n UnitsHandler._defaultGapSymbolsDict.SEPARATOR;\n }\n if (!tgtSeparator) {\n tgtSeparator = (this.toFasta(tgtNotation)) ? '' : this.separator;\n }\n const helmWrappersRe = /(R\\(|D\\(|\\)|P)/g;\n const isNucleotide = helmPolymer.startsWith('DNA') || helmPolymer.startsWith('RNA');\n // items can be monomers or helms\n const helmItemsArray = this.splitter(helmPolymer);\n const tgtMonomersArray = [];\n for (let i = 0; i < helmItemsArray.length; i++) {\n let item = helmItemsArray[i];\n if (isNucleotide)\n item = item.replace(helmWrappersRe, '');\n if (item === UnitsHandler._defaultGapSymbolsDict.HELM) {\n tgtMonomersArray.push(tgtGapSymbol);\n }\n else if (this.toFasta(tgtNotation) && item.length > 1) {\n // the case of a multi-character monomer converted to FASTA\n const monomer = '[' + item + ']';\n tgtMonomersArray.push(monomer);\n }\n else {\n tgtMonomersArray.push(item);\n }\n }\n return tgtMonomersArray.join(tgtSeparator);\n }\n /**\n * Convert HELM column to FASTA/SEPARATOR\n *\n * @param {string} tgtNotation Target notation: FASTA or SEPARATOR\n * @param {string} tgtSeparator Optional target separator (for HELM ->\n * @param {string | null} tgtGapSymbol Optional target gap symbol\n * SEPARATOR)\n * @return {DG.Column} Converted column\n */\n convertHelm(tgtNotation, tgtSeparator, tgtGapSymbol) {\n // This function must not contain calls of isDna() and isRna(), for\n // source helm columns may contain RNA, DNA and PT across different rows\n const newColumn = this.getNewColumn(tgtNotation, tgtSeparator);\n // assign the values to the empty column\n newColumn.init((idx) => {\n const helmPolymer = this.column.get(idx);\n return this.convertHelmToFastaSeparator(helmPolymer, tgtNotation, tgtSeparator, tgtGapSymbol);\n // we cannot use isDna() or isRna() because source helm columns can\n // contain DNA, RNA and PT in different cells, so the corresponding\n // tags cannot be set for the whole column\n });\n // TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR\n const splitter = getSplitterForColumn(newColumn);\n const stats = getStats(newColumn, 5, splitter);\n const aligned = stats.sameLength ? 'SEQ.MSA' : 'SEQ';\n newColumn.setTag(\"aligned\" /* TAGS.aligned */, aligned);\n return newColumn;\n }\n convertHelmToSeparator() {\n // TODO: implementatioreturn this.getNewColumn();\n return this.getNewColumn(\"separator\" /* NOTATION.SEPARATOR */);\n }\n /** Dispatcher method for notation conversion\n *\n * @param {NOTATION} tgtNotation Notation we want to convert to\n * @param {string | null} tgtSeparator Possible separator\n * @return {DG.Column} Converted column\n */\n convert(tgtNotation, tgtSeparator = null) {\n // possible exceptions\n if (this.notation === tgtNotation)\n throw new Error('tgt notation is invalid');\n if (this.toSeparator(tgtNotation) && tgtSeparator === null)\n throw new Error('tgt separator is not specified');\n if (this.isFasta() && this.toSeparator(tgtNotation) && tgtSeparator !== null)\n return this.convertFastaToSeparator(tgtSeparator);\n else if ((this.isFasta() || this.isSeparator()) && this.toHelm(tgtNotation))\n return this.convertToHelm();\n else if (this.isSeparator() && this.toFasta(tgtNotation))\n return this.convertSeparatorToFasta();\n else if (this.isHelm() && this.toFasta(tgtNotation)) // the case of HELM\n return this.convertHelm(tgtNotation);\n else if (this.isHelm() && this.toSeparator(tgtNotation))\n return this.convertHelm(tgtNotation, tgtSeparator);\n else\n throw new Error('Not supported conversion ' +\n `from source notation '${this.notation}' to target notation '${tgtNotation}'.`);\n }\n constructor(col) {\n super(col);\n this._splitter = null;\n }\n}\n//# sourceMappingURL=notation-converter.js.map","/* Do not change these import lines to match external modules in webpack configuration */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {WebEditorMonomer, RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from './constants';\nimport {HelmWebEditor} from './helm-web-editor';\nimport {HelmCellRenderer} from './cell-renderer';\nimport {IMonomerLib, Monomer} from '@datagrok-libraries/bio/src/types';\nimport {NotationConverter} from '@datagrok-libraries/bio/src/utils/notation-converter';\nimport {findMonomers} from './utils';\nimport {errorToConsole} from '@datagrok-libraries/utils/src/to-console';\nimport {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\n\nexport const _package = new DG.Package();\nlet monomerLib: IMonomerLib | null = null;\n\n//tags: init\nexport async function initHelm(): Promise<void> {\n return Promise.all([new Promise((resolve, reject) => {\n // @ts-ignore\n dojo.ready(function() { resolve(null); });\n }), await grok.functions.call('Bio:getBioLib')]).then(([_, lib]: [void, IMonomerLib]) => {\n monomerLib = lib;\n rewriteLibraries(); // initHelm()\n monomerLib.onChanged.subscribe((_) => {\n try {\n rewriteLibraries(); // initHelm()\n\n const polymerTypeList: string[] = monomerLib.getPolymerTypes();\n const msgStr: string = 'Monomer lib updated:<br />' + (\n polymerTypeList.length == 0 ? 'empty' : polymerTypeList.map((polymerType) => {\n return `${polymerType} ${monomerLib.getMonomerSymbolsByType(polymerType).length}`;\n }).join('<br />'));\n\n grok.shell.info(msgStr);\n } catch (err: any) {\n const errMsg = errorToConsole(err);\n console.error('Helm: initHelm monomerLib.onChanged() error:\\n' + errMsg);\n // throw err; // Prevent disabling event handler\n }\n });\n });\n}\n\nfunction rewriteLibraries() {\n org.helm.webeditor.Monomers.clear();\n monomerLib.getPolymerTypes().forEach((polymerType) => {\n const monomerSymbols = monomerLib.getMonomerSymbolsByType(polymerType);\n monomerSymbols.forEach((monomerSymbol) => {\n let isBroken = false;\n const monomer: Monomer = monomerLib.getMonomer(polymerType, monomerSymbol);\n const webEditorMonomer: WebEditorMonomer = {\n id: monomerSymbol,\n m: monomer.molfile,\n n: monomer.name,\n na: monomer.naturalAnalog,\n rs: monomer.rgroups.length,\n type: monomer.polymerType,\n mt: monomer.monomerType,\n at: {}\n };\n\n if (monomer.rgroups.length > 0) {\n webEditorMonomer.rs = monomer.rgroups.length;\n const at = {};\n monomer.rgroups.forEach((it) => {\n at[it[RGROUP_LABEL]] = it[RGROUP_CAP_GROUP_NAME];\n });\n webEditorMonomer.at = at;\n } else if (monomer[SMILES] != null) {\n webEditorMonomer.rs = Object.keys(getRS(monomer[SMILES].toString())).length;\n webEditorMonomer.at = getRS(monomer[SMILES].toString());\n } else {\n isBroken = true;\n }\n\n if (!isBroken)\n org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);\n });\n });\n\n // Obsolete\n const grid: DG.Grid = grok.shell.tv.grid;\n if (grid) grid.invalidate();\n}\n\n//name: helmCellRenderer\n//tags: cellRenderer\n//meta.cellType: helm\n//meta.columnTags: units=helm\n//output: grid_cell_renderer result\nexport function helmCellRenderer(): HelmCellRenderer {\n return new HelmCellRenderer();\n}\n\nfunction checkMonomersAndOpenWebEditor(cell?: DG.Cell, value?: string, units?: string) {\n const cellValue = typeof units === 'undefined' ? cell.value : value;\n const monomers = findMonomers(cellValue);\n if (monomers.size == 0) {\n webEditor(cell, value, units);\n } else {\n grok.shell.warning(`Monomers ${Array.from(monomers).join(', ')} are absent! <br/>` +\n `Please, upload the monomer library! <br/>` +\n `<a href=\"https://datagrok.ai/help/domains/bio/macromolecules\" target=\"_blank\">Learn more</a>`);\n }\n}\n\n//tags: cellEditor\n//description: Macromolecule\n//input: grid_cell cell\n//meta.columnTags: quality=Macromolecule, units=helm\nexport function editMoleculeCell(cell: DG.GridCell): void {\n checkMonomersAndOpenWebEditor(cell.cell, undefined, undefined);\n}\n\n//name: Open Helm Web Editor\n//description: Adds editor\n//meta.action: Open Helm Web Editor\n//input: string mol { semType: Macromolecule }\nexport function openEditor(mol: string): void {\n const df = grok.shell.tv.grid.dataFrame;\n const col = df.columns.bySemType('Macromolecule');\n const colUnits = col.getTag(DG.TAGS.UNITS);\n if (colUnits === NOTATION.HELM)\n checkMonomersAndOpenWebEditor(df.currentCell, undefined, undefined);\n const converter = new NotationConverter(col);\n const resStr = converter.convertStringToHelm(mol, '/');\n checkMonomersAndOpenWebEditor(df.currentCell, resStr, col.getTag(DG.TAGS.UNITS));\n}\n\n//name: Properties\n//tags: panel, widgets\n//input: string helmString {semType: Macromolecule}\n//output: widget result\nexport async function propertiesPanel(helmString: string) {\n const grid = grok.shell.tv.grid;\n const parent = grid.root.parentElement;\n const host = ui.div([]);\n parent.appendChild(host);\n const editor = new JSDraw2.Editor(host, {viewonly: true});\n host.style.width = '0px';\n host.style.height = '0px';\n editor.setHelm(helmString);\n const formula = editor.getFormula(true);\n const molWeight = Math.round(editor.getMolWeight() * 100) / 100;\n const coef = Math.round(editor.getExtinctionCoefficient(true) * 100) / 100;\n parent.lastChild.remove();\n return new DG.Widget(\n ui.tableFromMap({\n 'formula': formula.replace(/<sub>/g, '').replace(/<\\/sub>/g, ''),\n 'molecular weight': molWeight,\n 'extinction coefficient': coef,\n })\n );\n}\n\nfunction webEditor(cell?: DG.Cell, value?: string, units?: string) {\n const view = ui.div();\n const df = grok.shell.tv.grid.dataFrame;\n const converter = new NotationConverter(df.columns.bySemType('Macromolecule'));\n org.helm.webeditor.MolViewer.molscale = 0.8;\n const app = new scil.helm.App(view, {\n showabout: false,\n mexfontsize: '90%',\n mexrnapinontab: true,\n topmargin: 20,\n mexmonomerstab: true,\n sequenceviewonly: false,\n mexfavoritefirst: true,\n mexfilter: true\n });\n const sizes = app.calculateSizes();\n app.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);\n let s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};\n //@ts-ignore\n scil.apply(app.sequence.style, s);\n //@ts-ignore\n scil.apply(app.notation.style, s);\n s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + app.toolbarheight) + 'px'};\n //@ts-ignore\n scil.apply(app.properties.parent.style, s);\n app.structureview.resize(sizes.rightwidth, sizes.bottomheight + app.toolbarheight);\n app.mex.resize(sizes.topheight - 80);\n setTimeout(() => {\n if (typeof units === 'undefined')\n app.canvas.helm.setSequence(cell.value, 'HELM');\n else\n app.canvas.helm.setSequence(value, 'HELM');\n }, 200);\n //@ts-ignore\n ui.dialog({showHeader: false, showFooter: true})\n .add(view)\n .onOK(() => {\n const helmValue = app.canvas.getHelm(true).replace(/<\\/span>/g, '')\n .replace(/<span style='background:#bbf;'>/g, '');\n if (typeof units === 'undefined') {\n cell.value = helmValue;\n } else {\n const convertedRes = converter.convertHelmToFastaSeparator(helmValue, units);\n cell.value = convertedRes;\n }\n }).show({modal: true, fullScreen: true});\n}\n\nfunction getRS(smiles: string) {\n const newS = smiles.match(/(?<=\\[)[^\\][]*(?=])/gm);\n const res = {};\n let el = '';\n let digit;\n for (let i = 0; i < newS.length; i++) {\n if (newS[i] != null) {\n if (/\\d/.test(newS[i])) {\n digit = newS[i][newS[i].length - 1];\n newS[i] = newS[i].replace(/[0-9]/g, '');\n for (let j = 0; j < newS[i].length; j++) {\n if (newS[i][j] != ':')\n el += newS[i][j];\n }\n res['R' + digit] = el;\n el = '';\n }\n }\n }\n return res;\n}\n\n//name: getMolfiles\n//input: column col {semType: Macromolecule}\n//output: column res\nexport function getMolfiles(col: DG.Column): DG.Column {\n const grid = grok.shell.tv.grid;\n const parent = grid.root.parentElement;\n const res = DG.Column.string('mols', col.length);\n const host = ui.div([]);\n parent.appendChild(host);\n const editor = new JSDraw2.Editor(host, {viewonly: true});\n host.style.width = '0px';\n host.style.height = '0px';\n res.init((i) => {\n editor.setHelm(col.get(i));\n const mol = editor.getMolfile();\n return mol;\n });\n parent.lastChild.remove();\n return res;\n}\n\n//name: helmWebEditor\n//output: object\nexport function helmWebEditor(): HelmWebEditor {\n return new HelmWebEditor();\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","grok","ui","DG","HelmWebEditor","constructor","w","h","this","host","style","width","height","editor","JSDraw2","Editor","viewonly","resizeEditor","setSize","createWebEditor","editorView","org","helm","webeditor","MolViewer","molscale","webEditor","scil","App","showabout","mexfontsize","mexrnapinontab","topmargin","mexmonomerstab","sequenceviewonly","mexfavoritefirst","mexfilter","sizes","calculateSizes","canvas","resize","rightwidth","topheight","s","bottomheight","apply","sequence","notation","toolbarheight","properties","parent","structureview","mex","setTimeout","setSequence","editorDiv","getParts","subParts","allParts","k","length","indexOfMonomer","indexOf","helmBeforeMonomer","slice","push","substring","parseHelm","split","monomers","Utils","isNullOrEmpty","seqs","i","p","detachAnnotation","str","ss","monomer","startsWith","includes","element","residue","endsWith","lastIndexOf","firstPiece","thirdPiece","elements","el","findMonomers","helmString","types","keys","monomerTypeList","monomerNames","Monomers","getMonomerSet","forEach","id","splitString","Set","filter","val","sep","ret","frag","parentheses","bracket","braces","quote","c","c2","_detachAppendix","tag","r","repeat","endswith","replace","RegExp","m","wu","CandidateType","name","alphabet","cutoff","CandidateSimType","candidate","freq","similarity","super","monomerRe","fasta","peptide","dna","rna","peq","Uint32Array","defaultArgs","gapOpen","gapExtend","scoringMatrix","alphabetIndexes","MmDistanceFunctionsNames","mmDistanceFunctions","HAMMING","seq1","seq2","diff","Math","abs","result","min","LEVENSHTEIN","b","tmp","n","lst","pv","mv","sc","charCodeAt","eq","xv","myers_32","mhc","phc","hsize","ceil","vsize","j","start","vlen","pb","mb","xh","ph","mh","score","myers_x","distance","NEEDLEMANN_WUNSCH","args","assign","matrix","Array","fill","verticalGaps","horizontalGaps","prevRow","currRow","diagonal","top","left","max","static","col","semType","getTag","Error","setTag","setTags","splitterAsFasta","separator","getSplitterWithSeparator","splitterAsHelm","splitter","units","stats","getStats","some","aligned","sameLength","candidates","gapSymbol","candidatesSims","map","sim","delete","freqA","alphabetA","has","freqV","alphabetV","v1","v2","prod","vectorDotProduct","vectorLength","getAlphabetSimilarity","alphabetName","maxSim","cs","find","detectAlphabet","alphabetSize","alphabetIsMultichar","toString","_units","column","_column","_notation","defaultGapSymbol","_defaultGapSymbol","_a","undefined","isFasta","isSeparator","helmCompatible","getAlphabetSize","alphabetSizeStr","parseInt","getSplitterForColumn","console","warn","getAlphabetIsMultichar","isHelm","isRna","isDna","isPeptide","isMsa","toUpperCase","isHelmCompatible","getNotation","toLowerCase","getNewColumn","targetNotation","len","newColName","dataFrame","columns","getUnusedName","newColumn","srcAligned","srcAlphabet","srcAlphabetSize","srcAlphabetIsMultichar","templateCol","unitsStringIsValid","getDistanceFunctionName","getDistanceFunction","checkHelmCompatibility","thisArg","_arguments","generator","tags","peptides","funcList","package","prepare","getOutputParamValue","P","Promise","resolve","reject","fulfilled","step","next","e","rejected","done","then","getMonomerLibHelper","getBioLib","getMonomerSymbolsByType","peptidesSet","splitterFunc","row","categories","_defaultGapSymbolsDict","FASTA","HELM","SEPARATOR","setUnitsToFastaColumn","setUnitsToSeparatorColumn","setUnitsToHelmColumn","Float32Array","v","sqrSum","sqrt","dt","simplified","PaletteType","palette","cp","objList","colour","ind","colourPalette","_palette","undefinedColor","Lesk","lesk","makePalette","GrokGroups","grokGroups","RasMol","rasMol","resM","aaSynonyms","Aminoacids","scheme","isInner","inner","outer","char","isNaN","_b","_c","chemPaletteInstance","getPalette","outerMonomer","innerMonomer","getInnerOuter","amino","AAFullNames","SemType","SemTypeMultipleAlignment","Names","AASmiles","AASmilesTruncated","Nucleotides","UnknownColorPalette","concat","values","pI","hash","hashCode","color","dgColor","g","distToBlack","pow","correctColor","seqCol","minLength","firstLength","seq","mSeq","matchAll","ma","toArray","limit","buildPalette","helmRe","helmPp1Re","lastIndex","ea","exec","inSeq","mm","pp1M","longMonomerPartRe","DrawStyle","printLeftOrCentered","x","y","pivot","transparencyRate","last","drawStyle","classic","maxWord","wordIdx","gridCell","referenceSequence","maxLengthOfMonomer","textAlign","colorPart","grayPart","MSA","colorCode","compareWithCurrent","highlightDifference","cell","temp","currentMonomer","shortAminoMatch","match","needAddDots","shortAmino","monomerToShortFunction","textSize","measureText","maxColorTextSize","colorTextSize","dy","fontBoundingBoxAscent","fontBoundingBoxDescent","draw","dx1","dx2","drawColor","fillStyle","globalAlpha","fillText","dx","errorToConsole","err","String","stack","message","HelmCellRenderer","cellType","defaultWidth","defaultHeight","onMouseMove","maxLengthWordsSum","maxIndex","argsX","offsetX","gridColumn","bounds","right","found","mid","floor","tooltipMessage","childNodes","errMsg","error","render","cellStyle","grid","gridRow","size","window","devicePixelRatio","save","beginPath","rect","clip","font","textBaseline","x1","maxLengthWords","maxLengthWordSum","restore","setAttribute","skin","NotationConverter","_splitter","toFasta","toSeparator","toHelm","convertFastaToSeparator","fastaGapSymbol","init","idx","fastaPolymer","fastaMonomersArray","join","getHelmWrappers","prefix","convertToHelmHelper","sourcePolymer","sourceGapSymbol","leftWrapper","rightWrapper","postfix","convertStringToHelm","convertToHelm","convertSeparatorToFasta","separatorPolymer","separatorItemsArray","item","convertHelmToFastaSeparator","helmPolymer","tgtNotation","tgtSeparator","tgtGapSymbol","helmWrappersRe","isNucleotide","helmItemsArray","tgtMonomersArray","convertHelm","convertHelmToSeparator","convert","_package","monomerLib","initHelm","all","dojo","ready","_","lib","rewriteLibraries","onChanged","subscribe","polymerTypeList","getPolymerTypes","msgStr","polymerType","clear","monomerSymbol","isBroken","getMonomer","webEditorMonomer","molfile","na","naturalAnalog","rs","rgroups","type","mt","monomerType","at","it","getRS","addOneMonomer","invalidate","helmCellRenderer","checkMonomersAndOpenWebEditor","view","df","converter","bySemType","app","showHeader","showFooter","add","onOK","helmValue","getHelm","convertedRes","show","modal","fullScreen","from","editMoleculeCell","openEditor","mol","currentCell","resStr","propertiesPanel","root","parentElement","appendChild","setHelm","formula","getFormula","molWeight","round","getMolWeight","coef","getExtinctionCoefficient","lastChild","remove","smiles","newS","res","digit","test","getMolfiles","getMolfile","helmWebEditor"],"sourceRoot":""}