@datagrok/sequence-translator 0.0.9 → 0.0.12

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.
@@ -0,0 +1,2387 @@
1
+ var sequencetranslator_test;
2
+ /******/ (() => { // webpackBootstrap
3
+ /******/ "use strict";
4
+ /******/ var __webpack_modules__ = ({
5
+
6
+ /***/ "./node_modules/@datagrok-libraries/utils/src/test.js":
7
+ /*!************************************************************!*\
8
+ !*** ./node_modules/@datagrok-libraries/utils/src/test.js ***!
9
+ \************************************************************/
10
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
11
+
12
+ __webpack_require__.r(__webpack_exports__);
13
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
14
+ /* harmony export */ "tests": () => (/* binding */ tests),
15
+ /* harmony export */ "currentCategory": () => (/* binding */ currentCategory),
16
+ /* harmony export */ "assure": () => (/* binding */ assure),
17
+ /* harmony export */ "Test": () => (/* binding */ Test),
18
+ /* harmony export */ "test": () => (/* binding */ test),
19
+ /* harmony export */ "assertNoError": () => (/* binding */ assertNoError),
20
+ /* harmony export */ "expect": () => (/* binding */ expect),
21
+ /* harmony export */ "expectFloat": () => (/* binding */ expectFloat),
22
+ /* harmony export */ "category": () => (/* binding */ category),
23
+ /* harmony export */ "before": () => (/* binding */ before),
24
+ /* harmony export */ "after": () => (/* binding */ after),
25
+ /* harmony export */ "runTests": () => (/* binding */ runTests),
26
+ /* harmony export */ "delay": () => (/* binding */ delay)
27
+ /* harmony export */ });
28
+ /* harmony import */ var datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/grok */ "datagrok-api/grok");
29
+ /* harmony import */ var datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__);
30
+ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
31
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
32
+ return new (P || (P = Promise))(function (resolve, reject) {
33
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
34
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
35
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
36
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
37
+ });
38
+ };
39
+
40
+ let tests = {};
41
+ let currentCategory;
42
+ var assure;
43
+ (function (assure) {
44
+ function notNull(value, name) {
45
+ if (value == null)
46
+ throw `${name == null ? 'Value' : name} not defined`;
47
+ }
48
+ assure.notNull = notNull;
49
+ })(assure || (assure = {}));
50
+ class Test {
51
+ constructor(category, name, test, options) {
52
+ var _a, _b;
53
+ this.category = category;
54
+ this.name = name;
55
+ options !== null && options !== void 0 ? options : (options = {});
56
+ (_a = options.timeout) !== null && _a !== void 0 ? _a : (options.timeout = 30000);
57
+ (_b = options.unhandledExceptionTimeout) !== null && _b !== void 0 ? _b : (options.unhandledExceptionTimeout = 2000);
58
+ this.options = options;
59
+ this.test = () => __awaiter(this, void 0, void 0, function* () {
60
+ return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
61
+ let result = '';
62
+ try {
63
+ datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.lastError = '';
64
+ result = yield test();
65
+ }
66
+ catch (e) {
67
+ reject(e);
68
+ }
69
+ if (!(yield assertNoError(options.unhandledExceptionTimeout)))
70
+ reject(`Unhandled exception during test: ${datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.lastError}`);
71
+ resolve(result);
72
+ }));
73
+ });
74
+ }
75
+ }
76
+ function test(name, test, options) {
77
+ if (tests[currentCategory] == undefined)
78
+ tests[currentCategory] = {};
79
+ if (tests[currentCategory].tests == undefined)
80
+ tests[currentCategory].tests = [];
81
+ tests[currentCategory].tests.push(new Test(currentCategory, name, test, options));
82
+ }
83
+ /** Awaits for a while checking the error status of the platform */
84
+ function assertNoError(ms) {
85
+ return __awaiter(this, void 0, void 0, function* () {
86
+ for (let i = 0; i < ms / 500; ++i) {
87
+ yield delay(500);
88
+ if (datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.lastError.length !== 0)
89
+ return false;
90
+ }
91
+ return true;
92
+ });
93
+ }
94
+ /** Tests two objects for equality, throws an exception if they are not equal. */
95
+ function expect(actual, expected) {
96
+ if (actual !== expected)
97
+ throw `Expected "${expected}", got "${actual}"`;
98
+ }
99
+ function expectFloat(actual, expected, tolerance = 0.001) {
100
+ const areEqual = Math.abs(actual - expected) < 0.001;
101
+ if (!areEqual)
102
+ throw `Expected ${expected}, got ${actual} (tolerance = ${tolerance})`;
103
+ }
104
+ /** Defines a test suite. */
105
+ function category(category, tests) {
106
+ currentCategory = category;
107
+ tests();
108
+ }
109
+ /** Defines a function to be executed before the tests in this category are executed. */
110
+ function before(before) {
111
+ if (tests[currentCategory] == undefined)
112
+ tests[currentCategory] = {};
113
+ tests[currentCategory].before = before;
114
+ }
115
+ /** Defines a function to be executed after the tests in this category are executed. */
116
+ function after(after) {
117
+ if (tests[currentCategory] == undefined)
118
+ tests[currentCategory] = {};
119
+ tests[currentCategory].after = after;
120
+ }
121
+ function runTests(options) {
122
+ var _a;
123
+ return __awaiter(this, void 0, void 0, function* () {
124
+ let results = [];
125
+ for (const [key, value] of Object.entries(tests)) {
126
+ if ((options === null || options === void 0 ? void 0 : options.category) != undefined) {
127
+ if (!key.toLowerCase().startsWith(options === null || options === void 0 ? void 0 : options.category.toLowerCase()))
128
+ continue;
129
+ }
130
+ try {
131
+ if (value.before)
132
+ yield value.before();
133
+ }
134
+ catch (x) {
135
+ value.beforeStatus = x.toString();
136
+ }
137
+ let t = (_a = value.tests) !== null && _a !== void 0 ? _a : [];
138
+ let res = [];
139
+ for (let i = 0; i < t.length; i++) {
140
+ res.push(yield execTest(t[i], options === null || options === void 0 ? void 0 : options.test));
141
+ }
142
+ let data = (yield Promise.all(res)).filter((d) => d.result != 'skipped');
143
+ try {
144
+ if (value.after)
145
+ yield value.after();
146
+ }
147
+ catch (x) {
148
+ value.afterStatus = x.toString();
149
+ }
150
+ if (value.afterStatus)
151
+ data.push({ category: key, name: 'init', result: value.afterStatus, success: false });
152
+ if (value.beforeStatus)
153
+ data.push({ category: key, name: 'init', result: value.beforeStatus, success: false });
154
+ results.push(...data);
155
+ }
156
+ return results;
157
+ });
158
+ }
159
+ function execTest(t, predicate) {
160
+ var _a;
161
+ return __awaiter(this, void 0, void 0, function* () {
162
+ let r;
163
+ try {
164
+ if (predicate != undefined && (!t.name.toLowerCase().startsWith(predicate.toLowerCase())))
165
+ r = { success: true, result: 'skipped' };
166
+ else
167
+ r = { success: true, result: (_a = yield t.test()) !== null && _a !== void 0 ? _a : 'OK' };
168
+ }
169
+ catch (x) {
170
+ r = { success: false, result: x.toString() };
171
+ }
172
+ r.category = t.category;
173
+ r.name = t.name;
174
+ return r;
175
+ });
176
+ }
177
+ function delay(ms) {
178
+ return __awaiter(this, void 0, void 0, function* () {
179
+ yield new Promise(r => setTimeout(r, ms));
180
+ });
181
+ }
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUUxQyxNQUFNLENBQUMsSUFBSSxLQUFLLEdBQThJLEVBQUUsQ0FBQztBQUVqSyxNQUFNLENBQUMsSUFBSSxlQUF1QixDQUFDO0FBRW5DLE1BQU0sS0FBVyxNQUFNLENBTXRCO0FBTkQsV0FBaUIsTUFBTTtJQUVyQixTQUFnQixPQUFPLENBQUMsS0FBVSxFQUFFLElBQWE7UUFDL0MsSUFBSSxLQUFLLElBQUksSUFBSTtZQUNmLE1BQU0sR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDO0lBQ3pELENBQUM7SUFIZSxjQUFPLFVBR3RCLENBQUE7QUFDSCxDQUFDLEVBTmdCLE1BQU0sS0FBTixNQUFNLFFBTXRCO0FBT0QsTUFBTSxPQUFPLElBQUk7SUFNZixZQUFZLFFBQWdCLEVBQUUsSUFBWSxFQUFFLElBQXdCLEVBQUUsT0FBcUI7O1FBQ3pGLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxJQUFQLE9BQU8sR0FBSyxFQUFFLEVBQUM7UUFDZixNQUFBLE9BQU8sQ0FBQyxPQUFPLG9DQUFmLE9BQU8sQ0FBQyxPQUFPLEdBQUssS0FBSyxFQUFDO1FBQzFCLE1BQUEsT0FBTyxDQUFDLHlCQUF5QixvQ0FBakMsT0FBTyxDQUFDLHlCQUF5QixHQUFLLElBQUksRUFBQztRQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQXVCLEVBQUU7WUFDbkMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFPLE9BQU8s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QUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsQ0FBQzs7Z0JBRXZDLENBQUMsR0FBRyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQUEsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLG1DQUFJLElBQUksRUFBQyxDQUFDO1NBQ3ZEO1FBQUMsT0FBTyxDQUFNLEVBQUU7WUFDZixDQUFDLEdBQUcsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUMsQ0FBQztTQUM1QztRQUNELENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN4QixDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDaEIsT0FBTyxDQUFDLENBQUM7O0NBQ1Y7QUFFRCxNQUFNLFVBQWdCLEtBQUssQ0FBQyxFQUFVOztRQUNwQyxNQUFPLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSBcImRhdGFncm9rLWFwaS9ncm9rXCI7XG5cbmV4cG9ydCBsZXQgdGVzdHM6IHtba2V5OiBzdHJpbmddOiB7dGVzdHM/OiBUZXN0W10sIGJlZm9yZT86ICgpID0+IFByb21pc2U8dm9pZD4sIGFmdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPiwgYmVmb3JlU3RhdHVzPzogc3RyaW5nLCBhZnRlclN0YXR1cz86IHN0cmluZ319ID0ge307XG5cbmV4cG9ydCBsZXQgY3VycmVudENhdGVnb3J5OiBzdHJpbmc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgYXNzdXJlIHtcblxuICBleHBvcnQgZnVuY3Rpb24gbm90TnVsbCh2YWx1ZTogYW55LCBuYW1lPzogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICB0aHJvdyBgJHtuYW1lID09IG51bGwgPyAnVmFsdWUnIDogbmFtZX0gbm90IGRlZmluZWRgO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdE9wdGlvbnMge1xuICB0aW1lb3V0PyA6IG51bWJlcjtcbiAgdW5oYW5kbGVkRXhjZXB0aW9uVGltZW91dD8gOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0IHtcbiAgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBUZXN0T3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihjYXRlZ29yeTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHRlc3Q6ICgpID0+IFByb21pc2U8YW55Piwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSB7XG4gICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgb3B0aW9ucy50aW1lb3V0ID8/PSAzMDAwMDtcbiAgICBvcHRpb25zLnVuaGFuZGxlZEV4Y2VwdGlvblRpbWVvdXQgPz89IDIwMDA7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnRlc3QgPSBhc3luYyAoKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBncm9rLnNoZWxsLmxhc3RFcnJvciA9ICcnO1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRlc3QoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGF3YWl0IGFzc2VydE5vRXJyb3Iob3B0aW9ucyEudW5oYW5kbGVkRXhjZXB0aW9uVGltZW91dCEpKSlcbiAgICAgICAgICByZWplY3QoYFVuaGFuZGxlZCBleGNlcHRpb24gZHVyaW5nIHRlc3Q6ICR7Z3Jvay5zaGVsbC5sYXN0RXJyb3J9YCk7XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3QobmFtZTogc3RyaW5nLCB0ZXN0OiAoKSA9PiBQcm9taXNlPGFueT4sIG9wdGlvbnM/OiBUZXN0T3B0aW9ucyk6IHZvaWQge1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyA9PSB1bmRlZmluZWQpXG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyA9IFtdO1xuICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLnRlc3RzIS5wdXNoKG5ldyBUZXN0KGN1cnJlbnRDYXRlZ29yeSwgbmFtZSwgdGVzdCwgb3B0aW9ucykpO1xufVxuXG4vKiogQXdhaXRzIGZvciBhIHdoaWxlIGNoZWNraW5nIHRoZSBlcnJvciBzdGF0dXMgb2YgdGhlIHBsYXRmb3JtICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0Tm9FcnJvcihtczogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbXMgLyA1MDA7ICsraSkge1xuICAgIGF3YWl0IGRlbGF5KDUwMCk7XG4gICAgaWYgKGdyb2suc2hlbGwubGFzdEVycm9yLmxlbmd0aCAhPT0gMClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFRlc3RzIHR3byBvYmplY3RzIGZvciBlcXVhbGl0eSwgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGV5IGFyZSBub3QgZXF1YWwuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0KGFjdHVhbDogYW55LCBleHBlY3RlZDogYW55KTogdm9pZCB7XG4gIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKVxuICAgIHRocm93IGBFeHBlY3RlZCBcIiR7ZXhwZWN0ZWR9XCIsIGdvdCBcIiR7YWN0dWFsfVwiYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEZsb2F0KGFjdHVhbDogbnVtYmVyLCBleHBlY3RlZDogbnVtYmVyLCB0b2xlcmFuY2UgPSAwLjAwMSk6IHZvaWQge1xuICBjb25zdCBhcmVFcXVhbCA9IE1hdGguYWJzKGFjdHVhbCAtIGV4cGVjdGVkKSA8IDAuMDAxO1xuICBpZiAoIWFyZUVxdWFsKVxuICAgIHRocm93IGBFeHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfSAodG9sZXJhbmNlID0gJHt0b2xlcmFuY2V9KWA7XG59XG5cbi8qKiBEZWZpbmVzIGEgdGVzdCBzdWl0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nLCB0ZXN0czogKCkgPT4gdm9pZCk6IHZvaWQge1xuICBjdXJyZW50Q2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgdGVzdHMoKTtcbn1cblxuLyoqIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZShiZWZvcmU6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5iZWZvcmUgPSBiZWZvcmU7XG59XG5cbi8qKiBEZWZpbmVzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyKGFmdGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID0ge307XG4gIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYWZ0ZXIgPSBhZnRlcjtcbn1cblxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuVGVzdHMob3B0aW9ucz86IHtjYXRlZ29yeT86IHN0cmluZywgdGVzdD86IHN0cmluZ30pIHtcbiAgbGV0IHJlc3VsdHM6IHsgY2F0ZWdvcnk/OiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3VsdDogc3RyaW5nfVtdID0gW107XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgaWYgKG9wdGlvbnM/LmNhdGVnb3J5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG9wdGlvbnM/LmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5iZWZvcmUpXG4gICAgICAgIGF3YWl0IHZhbHVlLmJlZm9yZSgpO1xuICAgIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgICAgdmFsdWUuYmVmb3JlU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBsZXQgdCA9IHZhbHVlLnRlc3RzID8/IFtdO1xuICAgIGxldCByZXMgPSBbXTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2goYXdhaXQgZXhlY1Rlc3QodFtpXSwgb3B0aW9ucz8udGVzdCkpO1xuICAgIH1cblxuICAgIGxldCBkYXRhID0gKGF3YWl0IFByb21pc2UuYWxsKHJlcykpLmZpbHRlcigoZCkgPT4gZC5yZXN1bHQgIT0gJ3NraXBwZWQnKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHZhbHVlLmFmdGVyKVxuICAgICAgICBhd2FpdCB2YWx1ZS5hZnRlcigpO1xuICAgIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgICAgdmFsdWUuYWZ0ZXJTdGF0dXMgPSB4LnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5hZnRlclN0YXR1cylcbiAgICAgIGRhdGEucHVzaCh7Y2F0ZWdvcnk6IGtleSwgbmFtZTogJ2luaXQnLCByZXN1bHQ6IHZhbHVlLmFmdGVyU3RhdHVzLCBzdWNjZXNzOiBmYWxzZX0pO1xuICAgIGlmICh2YWx1ZS5iZWZvcmVTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlfSk7XG4gICAgcmVzdWx0cy5wdXNoKC4uLmRhdGEpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWNUZXN0KHQ6IFRlc3QsIHByZWRpY2F0ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gIGxldCByOiB7IGNhdGVnb3J5Pzogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBzdWNjZXNzOiBib29sZWFuLCByZXN1bHQ6IHN0cmluZyB9O1xuICB0cnkge1xuICAgIGlmIChwcmVkaWNhdGUgIT0gdW5kZWZpbmVkICYmICghdC5uYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChwcmVkaWNhdGUudG9Mb3dlckNhc2UoKSkpKVxuICAgICAgciA9IHtzdWNjZXNzOiB0cnVlLCByZXN1bHQ6ICdza2lwcGVkJ307XG4gICAgZWxzZVxuICAgICAgciA9IHtzdWNjZXNzOiB0cnVlLCByZXN1bHQ6IGF3YWl0IHQudGVzdCgpID8/ICdPSyd9O1xuICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICByID0ge3N1Y2Nlc3M6IGZhbHNlLCByZXN1bHQ6IHgudG9TdHJpbmcoKX07XG4gIH1cbiAgci5jYXRlZ29yeSA9IHQuY2F0ZWdvcnk7XG4gIHIubmFtZSA9IHQubmFtZTtcbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxheShtczogbnVtYmVyKSB7XG4gIGF3YWl0ICBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgbXMpKTtcbn1cbiJdfQ==
183
+
184
+ /***/ }),
185
+
186
+ /***/ "./src/structures-works/converters.ts":
187
+ /*!********************************************!*\
188
+ !*** ./src/structures-works/converters.ts ***!
189
+ \********************************************/
190
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
191
+
192
+ __webpack_require__.r(__webpack_exports__);
193
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
194
+ /* harmony export */ "asoGapmersNucleotidesToBioSpring": () => (/* binding */ asoGapmersNucleotidesToBioSpring),
195
+ /* harmony export */ "asoGapmersNucleotidesToGcrs": () => (/* binding */ asoGapmersNucleotidesToGcrs),
196
+ /* harmony export */ "asoGapmersBioSpringToNucleotides": () => (/* binding */ asoGapmersBioSpringToNucleotides),
197
+ /* harmony export */ "asoGapmersBioSpringToGcrs": () => (/* binding */ asoGapmersBioSpringToGcrs),
198
+ /* harmony export */ "asoGapmersGcrsToBioSpring": () => (/* binding */ asoGapmersGcrsToBioSpring),
199
+ /* harmony export */ "asoGapmersGcrsToNucleotides": () => (/* binding */ asoGapmersGcrsToNucleotides),
200
+ /* harmony export */ "siRnaBioSpringToNucleotides": () => (/* binding */ siRnaBioSpringToNucleotides),
201
+ /* harmony export */ "siRnaBioSpringToAxolabs": () => (/* binding */ siRnaBioSpringToAxolabs),
202
+ /* harmony export */ "siRnaBioSpringToGcrs": () => (/* binding */ siRnaBioSpringToGcrs),
203
+ /* harmony export */ "siRnaAxolabsToGcrs": () => (/* binding */ siRnaAxolabsToGcrs),
204
+ /* harmony export */ "siRnaAxolabsToBioSpring": () => (/* binding */ siRnaAxolabsToBioSpring),
205
+ /* harmony export */ "siRnaAxolabsToNucleotides": () => (/* binding */ siRnaAxolabsToNucleotides),
206
+ /* harmony export */ "siRnaGcrsToNucleotides": () => (/* binding */ siRnaGcrsToNucleotides),
207
+ /* harmony export */ "siRnaGcrsToBioSpring": () => (/* binding */ siRnaGcrsToBioSpring),
208
+ /* harmony export */ "siRnaGcrsToAxolabs": () => (/* binding */ siRnaGcrsToAxolabs),
209
+ /* harmony export */ "siRnaNucleotideToBioSpringSenseStrand": () => (/* binding */ siRnaNucleotideToBioSpringSenseStrand),
210
+ /* harmony export */ "siRnaNucleotidesToGcrs": () => (/* binding */ siRnaNucleotidesToGcrs),
211
+ /* harmony export */ "siRnaNucleotideToAxolabsSenseStrand": () => (/* binding */ siRnaNucleotideToAxolabsSenseStrand),
212
+ /* harmony export */ "siRnaNucleotideToAxolabsAntisenseStrand": () => (/* binding */ siRnaNucleotideToAxolabsAntisenseStrand),
213
+ /* harmony export */ "gcrsToNucleotides": () => (/* binding */ gcrsToNucleotides),
214
+ /* harmony export */ "gcrsToMermade12": () => (/* binding */ gcrsToMermade12)
215
+ /* harmony export */ });
216
+ //name: asoGapmersNucleotidesToBioSpring
217
+ //input: string nucleotides {semType: DNA nucleotides}
218
+ //output: string result {semType: BioSpring / Gapmers}
219
+ function asoGapmersNucleotidesToBioSpring(nucleotides) {
220
+ let count = -1;
221
+ const objForEdges = {
222
+ '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'T': '5*', 'A': '6*', 'C': '7*', 'G': '8*'
223
+ };
224
+ const objForCenter = {
225
+ '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'T': 'T*', 'A': 'A*', 'C': '9*', 'G': 'G*'
226
+ };
227
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|A|T|C|G)/g, function (x) {
228
+ count++;
229
+ return (count > 4 && count < 15) ? objForCenter[x] : objForEdges[x];
230
+ }).slice(0, (nucleotides.endsWith('(invabasic)') || nucleotides.endsWith('(GalNAc-2-JNJ)')) ?
231
+ nucleotides.length : 2 * count + 1);
232
+ }
233
+ //name: asoGapmersNucleotidesToGcrs
234
+ //input: string nucleotides {semType: DNA nucleotides}
235
+ //output: string result {semType: GCRS / Gapmers}
236
+ function asoGapmersNucleotidesToGcrs(nucleotides) {
237
+ let count = -1;
238
+ const objForEdges = {
239
+ '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'T': 'moeUnps',
240
+ 'A': 'moeAnps', 'C': 'moe5mCnps', 'G': 'moeGnps'
241
+ };
242
+ const objForCenter = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
243
+ 'C': '5mCps', 'A': 'Aps', 'T': 'Tps', 'G': 'Gps' };
244
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|A|T|C|G)/g, function (x) {
245
+ count++;
246
+ if (count < 5)
247
+ return (count == 4) ? objForEdges[x].slice(0, -3) + 'ps' : objForEdges[x];
248
+ if (count < 15)
249
+ return (count == 14) ? objForCenter[x].slice(0, -2) + 'nps' : objForCenter[x];
250
+ return objForEdges[x];
251
+ }).slice(0, (nucleotides.endsWith('(invabasic)') || nucleotides.endsWith('(GalNAc-2-JNJ)')) ?
252
+ nucleotides.length : -3);
253
+ }
254
+ //name: asoGapmersBioSpringToNucleotides
255
+ //input: string nucleotides {semType: BioSpring / Gapmers}
256
+ //output: string result {semType: DNA nucleotides}
257
+ function asoGapmersBioSpringToNucleotides(nucleotides) {
258
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
259
+ '*': '', '5': 'T', '6': 'A', '7': 'C', '8': 'G', '9': 'C' };
260
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|\*|5|6|7|8|9)/g, function (x) { return obj[x]; });
261
+ }
262
+ //name: asoGapmersBioSpringToGcrs
263
+ //input: string nucleotides {semType: BioSpring / Gapmers}
264
+ //output: string result {semType: GCRS / Gapmers}
265
+ function asoGapmersBioSpringToGcrs(nucleotides) {
266
+ let count = -1;
267
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
268
+ '5*': 'moeUnps', '6*': 'moeAnps', '7*': 'moe5mCnps', '8*': 'moeGnps', '9*': '5mCps', 'A*': 'Aps', 'T*': 'Tps',
269
+ 'G*': 'Gps', 'C*': 'Cps', '5': 'moeU', '6': 'moeA', '7': 'moe5mC', '8': 'moeG',
270
+ };
271
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|5\*|6\*|7\*|8\*|9\*|A\*|T\*|G\*|C\*|5|6|7|8)/g, function (x) {
272
+ count++;
273
+ return (count == 4) ? obj[x].slice(0, -3) + 'ps' : (count == 14) ? obj[x].slice(0, -2) + 'nps' : obj[x];
274
+ });
275
+ }
276
+ //name: asoGapmersGcrsToBioSpring
277
+ //input: string nucleotides {semType: GCRS / Gapmers}
278
+ //output: string result {semType: BioSpring / Gapmers}
279
+ function asoGapmersGcrsToBioSpring(nucleotides) {
280
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
281
+ 'moeT': '5', 'moeA': '6', 'moe5mC': '7', 'moeG': '8', 'moeU': '5', '5mC': '9', 'nps': '*', 'ps': '*', 'U': 'T',
282
+ };
283
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|moeT|moeA|moe5mC|moeG|moeU|5mC|nps|ps|U)/g, function (x) { return obj[x]; });
284
+ }
285
+ //name: asoGapmersGcrsToNucleotides
286
+ //input: string nucleotides {semType: GCRS / Gapmers}
287
+ //output: string result {semType: DNA nucleotides}
288
+ function asoGapmersGcrsToNucleotides(nucleotides) {
289
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
290
+ 'moe': '', '5m': '', 'n': '', 'ps': '', 'U': 'T' };
291
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|moe|5m|n|ps|U)/g, function (x) { return obj[x]; });
292
+ }
293
+ //name: siRnaBioSpringToNucleotides
294
+ //input: string nucleotides {semType: BioSpring / siRNA}
295
+ //output: string result {semType: RNA nucleotides}
296
+ function siRnaBioSpringToNucleotides(nucleotides) {
297
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
298
+ '1': 'U', '2': 'A', '3': 'C', '4': 'G', '5': 'U', '6': 'A', '7': 'C', '8': 'G', '*': '' };
299
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|1|2|3|4|5|6|7|8|\*)/g, function (x) { return obj[x]; });
300
+ }
301
+ //name: siRnaBioSpringToAxolabs
302
+ //input: string nucleotides {semType: BioSpring / siRNA}
303
+ //output: string result {semType: Axolabs / siRNA}
304
+ function siRnaBioSpringToAxolabs(nucleotides) {
305
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
306
+ '1': 'Uf', '2': 'Af', '3': 'Cf', '4': 'Gf', '5': 'u', '6': 'a', '7': 'c', '8': 'g', '*': 's' };
307
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|1|2|3|4|5|6|7|8|\*)/g, function (x) { return obj[x]; });
308
+ }
309
+ //name: siRnaBioSpringToGcrs
310
+ //input: string nucleotides {semType: BioSpring / siRNA}
311
+ //output: string result {semType: GCRS}
312
+ function siRnaBioSpringToGcrs(nucleotides) {
313
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
314
+ '1': 'fU', '2': 'fA', '3': 'fC', '4': 'fG', '5': 'mU', '6': 'mA', '7': 'mC', '8': 'mG', '*': 'ps' };
315
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|1|2|3|4|5|6|7|8|\*)/g, function (x) { return obj[x]; });
316
+ }
317
+ //name: siRnaAxolabsToGcrs
318
+ //input: string nucleotides {semType: Axolabs / siRNA}
319
+ //output: string result {semType: GCRS}
320
+ function siRnaAxolabsToGcrs(nucleotides) {
321
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
322
+ 'Uf': 'fU', 'Af': 'fA', 'Cf': 'fC', 'Gf': 'fG', 'u': 'mU', 'a': 'mA', 'c': 'mC', 'g': 'mG', 's': 'ps',
323
+ };
324
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|Uf|Af|Cf|Gf|u|a|c|g|s)/g, function (x) { return obj[x]; });
325
+ }
326
+ //name: siRnaAxolabsToBioSpring
327
+ //input: string nucleotides {semType: Axolabs / siRNA}
328
+ //output: string result {semType: BioSpring / siRNA}
329
+ function siRnaAxolabsToBioSpring(nucleotides) {
330
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
331
+ 'Uf': '1', 'Af': '2', 'Cf': '3', 'Gf': '4', 'u': '5', 'a': '6', 'c': '7', 'g': '8', 's': '*',
332
+ };
333
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|Uf|Af|Cf|Gf|u|a|c|g|s)/g, function (x) { return obj[x]; });
334
+ }
335
+ //name: siRnaAxolabsToNucleotides
336
+ //input: string nucleotides {semType: Axolabs / siRNA}
337
+ //output: string result {semType: RNA nucleotides}
338
+ function siRnaAxolabsToNucleotides(nucleotides) {
339
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
340
+ 'Uf': 'U', 'Af': 'A', 'Cf': 'C', 'Gf': 'G', 'u': 'U', 'a': 'A', 'c': 'C', 'g': 'G', 's': '',
341
+ };
342
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|Uf|Af|Cf|Gf|u|a|c|g|s)/g, function (x) { return obj[x]; });
343
+ }
344
+ //name: siRnaGcrsToNucleotides
345
+ //input: string nucleotides {semType: GCRS}
346
+ //output: string result {semType: RNA nucleotides}
347
+ function siRnaGcrsToNucleotides(nucleotides) {
348
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
349
+ 'fU': 'U', 'fA': 'A', 'fC': 'C', 'fG': 'G', 'mU': 'U', 'mA': 'A', 'mC': 'C', 'mG': 'G', 'ps': '',
350
+ };
351
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|fU|fA|fC|fG|mU|mA|mC|mG|ps)/g, function (x) { return obj[x]; });
352
+ }
353
+ //name: siRnaGcrsToBioSpring
354
+ //input: string nucleotides {semType: GCRS}
355
+ //output: string result {semType: BioSpring / siRNA}
356
+ function siRnaGcrsToBioSpring(nucleotides) {
357
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
358
+ 'fU': '1', 'fA': '2', 'fC': '3', 'fG': '4', 'mU': '5', 'mA': '6', 'mC': '7', 'mG': '8', 'ps': '*',
359
+ };
360
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|fU|fA|fC|fG|mU|mA|mC|mG|ps)/g, function (x) { return obj[x]; });
361
+ }
362
+ //name: siRnaGcrsToAxolabs
363
+ //input: string nucleotides {semType: GCRS}
364
+ //output: string result {semType: Axolabs / siRNA}
365
+ function siRnaGcrsToAxolabs(nucleotides) {
366
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
367
+ 'fU': 'Uf', 'fA': 'Af', 'fC': 'Cf', 'fG': 'Gf', 'mU': 'u', 'mA': 'a', 'mC': 'c', 'mG': 'g', 'ps': 's',
368
+ };
369
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|fU|fA|fC|fG|mU|mA|mC|mG|ps)/g, function (x) { return obj[x]; });
370
+ }
371
+ //name: siRnaNucleotideToBioSpringSenseStrand
372
+ //input: string nucleotides {semType: RNA nucleotides}
373
+ //output: string result {semType: BioSpring / siRNA}
374
+ function siRnaNucleotideToBioSpringSenseStrand(nucleotides) {
375
+ let count = -1;
376
+ const objForLeftEdge = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
377
+ 'A': '6*', 'U': '5*', 'G': '8*', 'C': '7*' };
378
+ const objForRightEdge = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
379
+ 'A': '*6', 'U': '*5', 'G': '*8', 'C': '*7' };
380
+ const objForOddIndices = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
381
+ 'A': '6', 'U': '5', 'G': '8', 'C': '7' };
382
+ const objForEvenIndices = { '(invabasic)': '(invabasic)',
383
+ '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': '2', 'U': '1', 'G': '4', 'C': '3' };
384
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|A|U|G|C)/g, function (x) {
385
+ count++;
386
+ if (count < 2)
387
+ return objForLeftEdge[x];
388
+ if (count > nucleotides.length - 3)
389
+ return objForRightEdge[x];
390
+ return (count % 2 == 0) ? objForEvenIndices[x] : objForOddIndices[x];
391
+ });
392
+ }
393
+ //name: siRnaNucleotidesToGcrs
394
+ //input: string nucleotides {semType: RNA nucleotides}
395
+ //output: string result {semType: GCRS}
396
+ function siRnaNucleotidesToGcrs(nucleotides) {
397
+ let count = -1;
398
+ const objForLeftEdge = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
399
+ 'A': 'mAps', 'U': 'mUps', 'G': 'mGps', 'C': 'mCps' };
400
+ const objForRightEdge = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
401
+ 'A': 'psmA', 'U': 'psmU', 'G': 'psmG', 'C': 'psmC' };
402
+ const objForEvenIndices = { '(invabasic)': '(invabasic)',
403
+ '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': 'fA', 'U': 'fU', 'G': 'fG', 'C': 'fC' };
404
+ const objForOddIndices = { '(invabasic)': '(invabasic)',
405
+ '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': 'mA', 'U': 'mU', 'G': 'mG', 'C': 'mC' };
406
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|A|U|G|C)/g, function (x) {
407
+ count++;
408
+ if (count < 2)
409
+ return objForLeftEdge[x];
410
+ if (count > nucleotides.length - 3)
411
+ return objForRightEdge[x];
412
+ return (count % 2 == 0) ? objForEvenIndices[x] : objForOddIndices[x];
413
+ });
414
+ }
415
+ //name: siRnaNucleotideToAxolabsSenseStrand
416
+ //input: string nucleotides {semType: RNA nucleotides}
417
+ //output: string result {semType: Axolabs}
418
+ function siRnaNucleotideToAxolabsSenseStrand(nucleotides) {
419
+ let count = -1;
420
+ const objForLeftEdge = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
421
+ 'A': 'as', 'U': 'us', 'G': 'gs', 'C': 'cs' };
422
+ const objForSomeIndices = { '(invabasic)': '(invabasic)',
423
+ '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': 'Af', 'U': 'Uf', 'G': 'Gf', 'C': 'Cf' };
424
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
425
+ 'A': 'a', 'U': 'u', 'G': 'g', 'C': 'c' };
426
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|A|U|G|C)/g, function (x) {
427
+ count++;
428
+ if (count < 2)
429
+ return objForLeftEdge[x];
430
+ if (count == 6 || (count > 7 && count < 11))
431
+ return objForSomeIndices[x];
432
+ if (count == nucleotides.length - 1)
433
+ return 'a';
434
+ return obj[x];
435
+ });
436
+ }
437
+ //name: siRnaNucleotideToAxolabsAntisenseStrand
438
+ //input: string nucleotides {semType: RNA nucleotides}
439
+ //output: string result {semType: Axolabs}
440
+ function siRnaNucleotideToAxolabsAntisenseStrand(nucleotides) {
441
+ let count = -1;
442
+ const objForSmallLinkages = { '(invabasic)': '(invabasic)',
443
+ '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': 'as', 'U': 'us', 'G': 'gs', 'C': 'cs' };
444
+ const objForBigLinkages = { '(invabasic)': '(invabasic)',
445
+ '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': 'Afs', 'U': 'Ufs', 'G': 'Gfs', 'C': 'Cfs' };
446
+ const objForSomeIndices = { '(invabasic)': '(invabasic)',
447
+ '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': 'Af', 'U': 'Uf', 'G': 'Gf', 'C': 'Cf' };
448
+ const obj = { '(invabasic)': '(invabasic)',
449
+ '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)', 'A': 'a', 'U': 'u', 'G': 'g', 'C': 'c' };
450
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|A|U|G|C)/g, function (x) {
451
+ count++;
452
+ if (count > 19 && count < 22)
453
+ return objForSmallLinkages[x];
454
+ if (count == 0)
455
+ return 'us';
456
+ if (count == 1)
457
+ return objForBigLinkages[x];
458
+ return (count == 5 || count == 7 || count == 8 || count == 13 || count == 15) ? objForSomeIndices[x] : obj[x];
459
+ });
460
+ }
461
+ //name: gcrsToNucleotides
462
+ //input: string nucleotides {semType: GCRS}
463
+ //output: string result {semType: RNA nucleotides}
464
+ function gcrsToNucleotides(nucleotides) {
465
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
466
+ 'mAps': 'A', 'mUps': 'U', 'mGps': 'G', 'mCps': 'C', 'fAps': 'A', 'fUps': 'U', 'fGps': 'G', 'fCps': 'C',
467
+ 'fU': 'U', 'fA': 'A', 'fC': 'C', 'fG': 'G', 'mU': 'U', 'mA': 'A', 'mC': 'C', 'mG': 'G',
468
+ };
469
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|mAps|mUps|mGps|mCps|fAps|fUps|fGps|fCps|fU|fA|fC|fG|mU|mA|mC|mG)/g, function (x) { return obj[x]; });
470
+ }
471
+ //name: gcrsToMermade12
472
+ //input: string nucleotides {semType: GCRS}
473
+ //output: string result {semType: Mermade 12 / siRNA}
474
+ function gcrsToMermade12(nucleotides) {
475
+ const obj = { '(invabasic)': '(invabasic)', '(GalNAc-2-JNJ)': '(GalNAc-2-JNJ)',
476
+ 'mAps': 'e', 'mUps': 'h', 'mGps': 'g', 'mCps': 'f', 'fAps': 'i', 'fUps': 'l', 'fGps': 'k', 'fCps': 'j', 'fU': 'L',
477
+ 'fA': 'I', 'fC': 'J', 'fG': 'K', 'mU': 'H', 'mA': 'E', 'mC': 'F', 'mG': 'G',
478
+ };
479
+ return nucleotides.replace(/(\(invabasic\)|\(GalNAc-2-JNJ\)|mAps|mUps|mGps|mCps|fAps|fUps|fGps|fCps|fU|fA|fC|fG|mU|mA|mC|mG)/g, function (x) { return obj[x]; });
480
+ }
481
+
482
+
483
+ /***/ }),
484
+
485
+ /***/ "./src/structures-works/from-monomers.ts":
486
+ /*!***********************************************!*\
487
+ !*** ./src/structures-works/from-monomers.ts ***!
488
+ \***********************************************/
489
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
490
+
491
+ __webpack_require__.r(__webpack_exports__);
492
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
493
+ /* harmony export */ "sequenceToMolV3000": () => (/* binding */ sequenceToMolV3000),
494
+ /* harmony export */ "sequenceToSmiles": () => (/* binding */ sequenceToSmiles)
495
+ /* harmony export */ });
496
+ /* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./map */ "./src/structures-works/map.ts");
497
+ /* harmony import */ var _sequence_codes_tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sequence-codes-tools */ "./src/structures-works/sequence-codes-tools.ts");
498
+ /* harmony import */ var _mol_transformations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mol-transformations */ "./src/structures-works/mol-transformations.ts");
499
+
500
+
501
+
502
+ function sequenceToMolV3000(sequence, inverted = false, oclRender = false) {
503
+ const obj = getObjectWithCodesAndSmiles(sequence);
504
+ let codes = sortByStringLengthInDescendingOrder(Object.keys(obj));
505
+ let i = 0;
506
+ const smilesCodes = [];
507
+ const codesList = [];
508
+ const links = ['s', 'ps', '*'];
509
+ const includesStandardLinkAlready = ['e', 'h', /*'g',*/ 'f', 'i', 'l', 'k', 'j'];
510
+ const dropdowns = Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS);
511
+ codes = codes.concat(dropdowns);
512
+ while (i < sequence.length) {
513
+ const code = codes.find((s) => s == sequence.slice(i, i + s.length));
514
+ i += code.length;
515
+ inverted ? codesList.unshift(code) : codesList.push(code);
516
+ }
517
+ for (let i = 0; i < codesList.length; i++) {
518
+ if (dropdowns.includes(codesList[i])) {
519
+ smilesCodes.push((i >= codesList.length / 2) ?
520
+ _map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS[codesList[i]].right : _map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS[codesList[i]].left);
521
+ smilesCodes.push(_map__WEBPACK_IMPORTED_MODULE_0__.stadardPhosphateLinkSmiles);
522
+ }
523
+ else {
524
+ if (links.includes(codesList[i]) ||
525
+ includesStandardLinkAlready.includes(codesList[i]) ||
526
+ (i < codesList.length - 1 && links.includes(codesList[i + 1])))
527
+ smilesCodes.push(obj[codesList[i]]);
528
+ else {
529
+ smilesCodes.push(obj[codesList[i]]);
530
+ smilesCodes.push(_map__WEBPACK_IMPORTED_MODULE_0__.stadardPhosphateLinkSmiles);
531
+ }
532
+ }
533
+ }
534
+ return (0,_mol_transformations__WEBPACK_IMPORTED_MODULE_2__.getNucleotidesMol)(smilesCodes, oclRender);
535
+ }
536
+ function sequenceToSmiles(sequence, inverted = false) {
537
+ const obj = getObjectWithCodesAndSmiles(sequence);
538
+ let codes = sortByStringLengthInDescendingOrder(Object.keys(obj));
539
+ let i = 0;
540
+ let smiles = '';
541
+ const codesList = [];
542
+ const links = ['s', 'ps', '*'];
543
+ const includesStandardLinkAlready = ['e', 'h', /*'g',*/ 'f', 'i', 'l', 'k', 'j'];
544
+ const dropdowns = Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS);
545
+ codes = codes.concat(dropdowns);
546
+ while (i < sequence.length) {
547
+ const code = codes.find((s) => s == sequence.slice(i, i + s.length));
548
+ i += code.length;
549
+ inverted ? codesList.unshift(code) : codesList.push(code);
550
+ }
551
+ for (let i = 0; i < codesList.length; i++) {
552
+ if (dropdowns.includes(codesList[i])) {
553
+ smiles += (i >= codesList.length / 2) ?
554
+ _map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS[codesList[i]].right + _map__WEBPACK_IMPORTED_MODULE_0__.stadardPhosphateLinkSmiles :
555
+ _map__WEBPACK_IMPORTED_MODULE_0__.MODIFICATIONS[codesList[i]].left + _map__WEBPACK_IMPORTED_MODULE_0__.stadardPhosphateLinkSmiles;
556
+ }
557
+ else {
558
+ if (links.includes(codesList[i]) ||
559
+ includesStandardLinkAlready.includes(codesList[i]) ||
560
+ (i < codesList.length - 1 && links.includes(codesList[i + 1])))
561
+ smiles += obj[codesList[i]];
562
+ else
563
+ smiles += obj[codesList[i]] + _map__WEBPACK_IMPORTED_MODULE_0__.stadardPhosphateLinkSmiles;
564
+ }
565
+ }
566
+ smiles = smiles.replace(/OO/g, 'O');
567
+ return ((links.includes(codesList[codesList.length - 1]) &&
568
+ codesList.length > 1 &&
569
+ !includesStandardLinkAlready.includes(codesList[codesList.length - 2])) ||
570
+ dropdowns.includes(codesList[codesList.length - 1]) ||
571
+ includesStandardLinkAlready.includes(codesList[codesList.length - 1])) ?
572
+ smiles :
573
+ smiles.slice(0, smiles.length - _map__WEBPACK_IMPORTED_MODULE_0__.stadardPhosphateLinkSmiles.length + 1);
574
+ }
575
+ function getObjectWithCodesAndSmiles(sequence) {
576
+ const obj = {};
577
+ for (const synthesizer of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map)) {
578
+ for (const technology of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer])) {
579
+ for (const code of Object.keys(_map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer][technology]))
580
+ obj[code] = _map__WEBPACK_IMPORTED_MODULE_0__.map[synthesizer][technology][code].SMILES;
581
+ }
582
+ }
583
+ // TODO: create object based from synthesizer type to avoid key(codes) duplicates
584
+ const output = (0,_sequence_codes_tools__WEBPACK_IMPORTED_MODULE_1__.isValidSequence)(sequence);
585
+ if (output.synthesizer == _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.MERMADE_12)
586
+ obj['g'] = _map__WEBPACK_IMPORTED_MODULE_0__.map[_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.MERMADE_12][_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA]['g'].SMILES;
587
+ else if (output.synthesizer == _map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.AXOLABS)
588
+ obj['g'] = _map__WEBPACK_IMPORTED_MODULE_0__.map[_map__WEBPACK_IMPORTED_MODULE_0__.SYNTHESIZERS.AXOLABS][_map__WEBPACK_IMPORTED_MODULE_0__.TECHNOLOGIES.SI_RNA]['g'].SMILES;
589
+ return obj;
590
+ }
591
+ function sortByStringLengthInDescendingOrder(array) {
592
+ return array.sort(function (a, b) { return b.length - a.length; });
593
+ }
594
+
595
+
596
+ /***/ }),
597
+
598
+ /***/ "./src/structures-works/map.ts":
599
+ /*!*************************************!*\
600
+ !*** ./src/structures-works/map.ts ***!
601
+ \*************************************/
602
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
603
+
604
+ __webpack_require__.r(__webpack_exports__);
605
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
606
+ /* harmony export */ "SYNTHESIZERS": () => (/* binding */ SYNTHESIZERS),
607
+ /* harmony export */ "TECHNOLOGIES": () => (/* binding */ TECHNOLOGIES),
608
+ /* harmony export */ "COL_NAMES": () => (/* binding */ COL_NAMES),
609
+ /* harmony export */ "MODIFICATIONS": () => (/* binding */ MODIFICATIONS),
610
+ /* harmony export */ "stadardPhosphateLinkSmiles": () => (/* binding */ stadardPhosphateLinkSmiles),
611
+ /* harmony export */ "map": () => (/* binding */ map)
612
+ /* harmony export */ });
613
+ const SYNTHESIZERS = {
614
+ RAW_NUCLEOTIDES: 'Raw Nucleotides',
615
+ BIOSPRING: 'BioSpring Codes',
616
+ GCRS: 'Janssen GCRS Codes',
617
+ AXOLABS: 'Axolabs Codes',
618
+ MERMADE_12: 'Mermade 12',
619
+ };
620
+ const TECHNOLOGIES = {
621
+ DNA: 'DNA',
622
+ RNA: 'RNA',
623
+ ASO_GAPMERS: 'For ASO Gapmers',
624
+ SI_RNA: 'For 2\'-OMe and 2\'-F modified siRNA',
625
+ };
626
+ const COL_NAMES = {
627
+ CHEMISTRY: 'Chemistry',
628
+ NUMBER: 'Number',
629
+ TYPE: 'Type',
630
+ CHEMISTRY_NAME: 'Chemistry Name',
631
+ INTERNAL_COMPOUND_ID: 'Internal compound ID',
632
+ IDP: 'IDP',
633
+ SEQUENCE: 'Sequence',
634
+ COMPOUND_NAME: 'Compound Name',
635
+ COMPOUND_COMMENTS: 'Compound Comments',
636
+ SALT: 'Salt',
637
+ EQUIVALENTS: 'Equivalents',
638
+ PURITY: 'Purity',
639
+ CPD_MW: 'Cpd MW',
640
+ SALT_MASS: 'Salt mass',
641
+ BATCH_MW: 'Batch MW',
642
+ SOURCE: 'Source',
643
+ ICD: 'ICD',
644
+ OWNER: 'Owner',
645
+ };
646
+ // interface CODES {
647
+ // }
648
+ const MODIFICATIONS = {
649
+ '(invabasic)': {
650
+ molecularWeight: 118.13,
651
+ left: 'O[C@@H]1C[C@@H]O[C@H]1CO',
652
+ right: 'O[C@@H]1C[C@@H]O[C@H]1CO',
653
+ },
654
+ '(GalNAc-2-JNJ)': {
655
+ molecularWeight: 1273.3,
656
+ left: 'C(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
657
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
658
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)NC(=O)CCCC(=O)NCC(O)CO',
659
+ right: 'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
660
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
661
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)',
662
+ },
663
+ };
664
+ const stadardPhosphateLinkSmiles = 'OP(=O)(O)O';
665
+ const map = {
666
+ 'Raw Nucleotides': {
667
+ 'DNA': {
668
+ 'A': {
669
+ 'name': 'Adenine',
670
+ 'weight': 313.21,
671
+ 'normalized': 'dA',
672
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1O',
673
+ },
674
+ 'T': {
675
+ 'name': 'Tyrosine',
676
+ 'weight': 304.2,
677
+ 'normalized': 'dT',
678
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1O',
679
+ },
680
+ 'G': {
681
+ 'name': 'Guanine',
682
+ 'weight': 329.21,
683
+ 'normalized': 'dG',
684
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)C[C@@H]1O',
685
+ },
686
+ 'C': {
687
+ 'name': 'Cytosine',
688
+ 'weight': 289.18,
689
+ 'normalized': 'dC',
690
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1O',
691
+ },
692
+ },
693
+ 'RNA': {
694
+ 'A': {
695
+ 'name': 'Adenine',
696
+ 'weight': 313.21,
697
+ 'normalized': 'dA',
698
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1O',
699
+ },
700
+ 'U': {
701
+ 'name': 'Uracil',
702
+ 'weight': 306.17,
703
+ 'normalized': 'rU',
704
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](O)[C@@H]1O',
705
+ },
706
+ 'G': {
707
+ 'name': 'Guanine',
708
+ 'weight': 329.21,
709
+ 'normalized': 'dG',
710
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)C[C@@H]1O',
711
+ },
712
+ 'C': {
713
+ 'name': 'Cytosine',
714
+ 'weight': 289.18,
715
+ 'normalized': 'dC',
716
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1O',
717
+ },
718
+ },
719
+ },
720
+ 'BioSpring Codes': {
721
+ 'For ASO Gapmers': {
722
+ '5': {
723
+ 'name': '2\'MOE-5Me-rU',
724
+ 'weight': 378.27,
725
+ 'normalized': 'rU',
726
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))[C@H](OCCOC)[C@@H]1O',
727
+ },
728
+ '6': {
729
+ 'name': '2\'MOE-rA',
730
+ 'weight': 387.29,
731
+ 'normalized': 'rA',
732
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OCCOC)[C@@H]1O',
733
+ },
734
+ '7': {
735
+ 'name': '2\'MOE-5Me-rC',
736
+ 'weight': 377.29,
737
+ 'normalized': 'rC',
738
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(N)=NC2(=O))[C@H](OCCOC)[C@@H]1O',
739
+ },
740
+ '8': {
741
+ 'name': '2\'MOE-rG',
742
+ 'weight': 403.28,
743
+ 'normalized': 'rG',
744
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OCCOC)[C@@H]1O',
745
+ },
746
+ '9': {
747
+ 'name': '5-Methyl-dC',
748
+ 'weight': 303.21,
749
+ 'normalized': 'dC',
750
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(N)=NC2(=O))C[C@@H]1O',
751
+ },
752
+ '*': {
753
+ 'name': 'ps linkage',
754
+ 'weight': 16.07,
755
+ 'normalized': '',
756
+ 'SMILES': 'OP(=O)(S)O',
757
+ },
758
+ 'A': {
759
+ 'name': 'Adenine',
760
+ 'weight': 313.21,
761
+ 'normalized': 'dA',
762
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1O',
763
+ },
764
+ 'C': {
765
+ 'name': 'Cytosine',
766
+ 'weight': 289.18,
767
+ 'normalized': 'dC',
768
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1O',
769
+ },
770
+ 'G': {
771
+ 'name': 'Guanine',
772
+ 'weight': 329.21,
773
+ 'normalized': 'dG',
774
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)C[C@@H]1O',
775
+ },
776
+ 'T': {
777
+ 'name': 'Tyrosine',
778
+ 'weight': 304.2,
779
+ 'normalized': 'dT',
780
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1O',
781
+ },
782
+ },
783
+ 'For 2\'-OMe and 2\'-F modified siRNA': {
784
+ '1': {
785
+ 'name': '2\'-fluoro-U',
786
+ 'weight': 308.16,
787
+ 'normalized': 'rU',
788
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1O',
789
+ },
790
+ '2': {
791
+ 'name': '2\'-fluoro-A',
792
+ 'weight': 331.2,
793
+ 'normalized': 'rA',
794
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1O',
795
+ },
796
+ '3': {
797
+ 'name': '2\'-fluoro-C',
798
+ 'weight': 307.18,
799
+ 'normalized': 'rC',
800
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1O',
801
+ },
802
+ '4': {
803
+ 'name': '2\'-fluoro-G',
804
+ 'weight': 347.19,
805
+ 'normalized': 'rG',
806
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1O',
807
+ },
808
+ '5': {
809
+ 'name': '2\'OMe-rU',
810
+ 'weight': 320.2,
811
+ 'normalized': 'rU',
812
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1O',
813
+ },
814
+ '6': {
815
+ 'name': '2\'OMe-rA',
816
+ 'weight': 343.24,
817
+ 'normalized': 'rA',
818
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O',
819
+ },
820
+ '7': {
821
+ 'name': '2\'OMe-rC',
822
+ 'weight': 319.21,
823
+ 'normalized': 'rC',
824
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1O',
825
+ },
826
+ '8': {
827
+ 'name': '2\'OMe-rG',
828
+ 'weight': 359.24,
829
+ 'normalized': 'rG',
830
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1O',
831
+ },
832
+ '*': {
833
+ 'name': 'ps linkage',
834
+ 'weight': 16.07,
835
+ 'normalized': '',
836
+ 'SMILES': 'OP(=O)(S)O',
837
+ },
838
+ },
839
+ },
840
+ 'Axolabs Codes': {
841
+ 'For 2\'-OMe and 2\'-F modified siRNA': {
842
+ 'Uf': {
843
+ 'name': '2\'-fluoro-U',
844
+ 'weight': 308.16,
845
+ 'normalized': 'rU',
846
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1O',
847
+ },
848
+ 'Af': {
849
+ 'name': '2\'-fluoro-A',
850
+ 'weight': 331.2,
851
+ 'normalized': 'rA',
852
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1O',
853
+ },
854
+ 'Cf': {
855
+ 'name': '2\'-fluoro-C',
856
+ 'weight': 307.18,
857
+ 'normalized': 'rC',
858
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1O',
859
+ },
860
+ 'Gf': {
861
+ 'name': '2\'-fluoro-G',
862
+ 'weight': 347.19,
863
+ 'normalized': 'rG',
864
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1O',
865
+ },
866
+ 'u': {
867
+ 'name': '2\'OMe-rU',
868
+ 'weight': 320.2,
869
+ 'normalized': 'rU',
870
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1O',
871
+ },
872
+ 'a': {
873
+ 'name': '2\'OMe-rA',
874
+ 'weight': 343.24,
875
+ 'normalized': 'rA',
876
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O',
877
+ },
878
+ 'c': {
879
+ 'name': '2\'OMe-rC',
880
+ 'weight': 319.21,
881
+ 'normalized': 'rC',
882
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1O',
883
+ },
884
+ 'g': {
885
+ 'name': '2\'OMe-rG',
886
+ 'weight': 359.,
887
+ 'normalized': 'rG',
888
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1O',
889
+ },
890
+ 's': {
891
+ 'name': 'ps linkage',
892
+ 'weight': 16.07,
893
+ 'normalized': '',
894
+ 'SMILES': 'OP(=O)(S)O',
895
+ },
896
+ },
897
+ },
898
+ 'Janssen GCRS Codes': {
899
+ 'For ASO Gapmers': {
900
+ 'moeT': {
901
+ 'name': '2\'MOE-5Me-rU',
902
+ 'weight': 378.27,
903
+ 'normalized': 'rU',
904
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))[C@H](OCCOC)[C@@H]1O',
905
+ },
906
+ 'moeA': {
907
+ 'name': '2\'MOE-rA',
908
+ 'weight': 387.29,
909
+ 'normalized': 'rA',
910
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OCCOC)[C@@H]1O',
911
+ },
912
+ 'moe5mC': {
913
+ 'name': '2\'MOE-5Me-rC',
914
+ 'weight': 377.29,
915
+ 'normalized': 'rC',
916
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(N)=NC2(=O))[C@H](OCCOC)[C@@H]1O',
917
+ },
918
+ '(5m)moeC': {
919
+ 'name': '2\'MOE-5Me-rC',
920
+ 'weight': 377.29,
921
+ 'normalized': 'rC',
922
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(N)=NC2(=O))[C@H](OCCOC)[C@@H]1O',
923
+ },
924
+ 'moeG': {
925
+ 'name': '2\'MOE-rG',
926
+ 'weight': 403.28,
927
+ 'normalized': 'rG',
928
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OCCOC)[C@@H]1O',
929
+ },
930
+ '5mC': {
931
+ 'name': '5-Methyl-dC',
932
+ 'weight': 303.28,
933
+ 'normalized': 'dC',
934
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(N)=NC2(=O))C[C@@H]1O',
935
+ },
936
+ '(5m)C': {
937
+ 'name': '5-Methyl-dC',
938
+ 'weight': 303.28,
939
+ 'normalized': 'dC',
940
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(N)=NC2(=O))C[C@@H]1O',
941
+ },
942
+ 'ps': {
943
+ 'name': 'ps linkage',
944
+ 'weight': 16.07,
945
+ 'normalized': '',
946
+ 'SMILES': 'OP(=O)(S)O',
947
+ },
948
+ 'A': {
949
+ 'name': 'Adenine',
950
+ 'weight': 313.21,
951
+ 'normalized': 'dA',
952
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1O',
953
+ },
954
+ 'dA': {
955
+ 'name': 'Adenine',
956
+ 'weight': 313.21,
957
+ 'normalized': 'dA',
958
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1O',
959
+ },
960
+ 'C': {
961
+ 'name': 'Cytosine',
962
+ 'weight': 289.18,
963
+ 'normalized': 'dC',
964
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1O',
965
+ },
966
+ 'dC': {
967
+ 'name': 'Cytosine',
968
+ 'weight': 289.18,
969
+ 'normalized': 'dC',
970
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1O',
971
+ },
972
+ 'G': {
973
+ 'name': 'Guanine',
974
+ 'weight': 329.21,
975
+ 'normalized': 'dG',
976
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)C[C@@H]1O',
977
+ },
978
+ 'dG': {
979
+ 'name': 'Guanine',
980
+ 'weight': 329.21,
981
+ 'normalized': 'dG',
982
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)C[C@@H]1O',
983
+ },
984
+ 'T': {
985
+ 'name': 'Tyrosine',
986
+ 'weight': 304.2,
987
+ 'normalized': 'dT',
988
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1O',
989
+ },
990
+ 'dT': {
991
+ 'name': 'Tyrosine',
992
+ 'weight': 304.2,
993
+ 'normalized': 'dT',
994
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1O',
995
+ },
996
+ 'rA': {
997
+ 'name': 'Adenine',
998
+ 'weight': 329.21,
999
+ 'normalized': 'rA',
1000
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](O)[C@@H]1O',
1001
+ },
1002
+ 'rC': {
1003
+ 'name': 'Cytosine',
1004
+ 'weight': 305.18,
1005
+ 'normalized': 'rC',
1006
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](O)[C@@H]1O',
1007
+ },
1008
+ 'rG': {
1009
+ 'name': 'Guanine',
1010
+ 'weight': 345.21,
1011
+ 'normalized': 'rG',
1012
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](O)[C@@H]1O',
1013
+ },
1014
+ 'rU': {
1015
+ 'name': 'Uracil',
1016
+ 'weight': 306.17,
1017
+ 'normalized': 'rU',
1018
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](O)[C@@H]1O',
1019
+ },
1020
+ },
1021
+ 'For 2\'-OMe and 2\'-F modified siRNA': {
1022
+ 'fU': {
1023
+ 'name': '2\'-fluoro-U',
1024
+ 'weight': 308.16,
1025
+ 'normalized': 'rU',
1026
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1O',
1027
+ },
1028
+ 'fA': {
1029
+ 'name': '2\'-fluoro-A',
1030
+ 'weight': 331.2,
1031
+ 'normalized': 'rA',
1032
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1O',
1033
+ },
1034
+ 'fC': {
1035
+ 'name': '2\'-fluoro-C',
1036
+ 'weight': 307.18,
1037
+ 'normalized': 'rC',
1038
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1O',
1039
+ },
1040
+ 'fG': {
1041
+ 'name': '2\'-fluoro-G',
1042
+ 'weight': 347.19,
1043
+ 'normalized': 'rG',
1044
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1O',
1045
+ },
1046
+ 'mU': {
1047
+ 'name': '2\'OMe-rU',
1048
+ 'weight': 320.2,
1049
+ 'normalized': 'rU',
1050
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1O',
1051
+ },
1052
+ 'mA': {
1053
+ 'name': '2\'OMe-rA',
1054
+ 'weight': 343.24,
1055
+ 'normalized': 'rA',
1056
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O',
1057
+ },
1058
+ 'mC': {
1059
+ 'name': '2\'OMe-rC',
1060
+ 'weight': 319.21,
1061
+ 'normalized': 'rC',
1062
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1O',
1063
+ },
1064
+ 'mG': {
1065
+ 'name': '2\'OMe-rG',
1066
+ 'weight': 359.24,
1067
+ 'normalized': 'rG',
1068
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1O',
1069
+ },
1070
+ },
1071
+ },
1072
+ 'Mermade 12': {
1073
+ 'For 2\'-OMe and 2\'-F modified siRNA': {
1074
+ 'e': {
1075
+ 'name': '2\'OMe-rA-ps',
1076
+ 'weight': 359.31,
1077
+ 'normalized': 'rA',
1078
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)O',
1079
+ },
1080
+ 'h': {
1081
+ 'name': '2\'OMe-rU-ps',
1082
+ 'weight': 336.27,
1083
+ 'normalized': 'rU',
1084
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)O',
1085
+ },
1086
+ 'g': {
1087
+ 'name': '2\'OMe-rG-ps',
1088
+ 'weight': 375.31,
1089
+ 'normalized': 'rG',
1090
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)O',
1091
+ },
1092
+ 'f': {
1093
+ 'name': '2\'OMe-rC-ps',
1094
+ 'weight': 335.28,
1095
+ 'normalized': 'rC',
1096
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)O',
1097
+ },
1098
+ 'i': {
1099
+ 'name': '2\'-fluoro-A-ps',
1100
+ 'weight': 347.27,
1101
+ 'normalized': 'rA',
1102
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(S)O',
1103
+ },
1104
+ 'l': {
1105
+ 'name': '2\'-fluoro-U-ps',
1106
+ 'weight': 324.23,
1107
+ 'normalized': 'rU',
1108
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(S)O',
1109
+ },
1110
+ 'k': {
1111
+ 'name': '2\'-fluoro-G-ps',
1112
+ 'weight': 363.26,
1113
+ 'normalized': 'rG',
1114
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(S)O',
1115
+ },
1116
+ 'j': {
1117
+ 'name': '2\'-fluoro-C-ps',
1118
+ 'weight': 323.25,
1119
+ 'normalized': 'rC',
1120
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(S)O',
1121
+ },
1122
+ 'L': {
1123
+ 'name': '2\'-fluoro-U',
1124
+ 'weight': 308.16,
1125
+ 'normalized': 'rU',
1126
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1O',
1127
+ },
1128
+ 'I': {
1129
+ 'name': '2\'-fluoro-A',
1130
+ 'weight': 331.2,
1131
+ 'normalized': 'rA',
1132
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1O',
1133
+ },
1134
+ 'J': {
1135
+ 'name': '2\'-fluoro-C',
1136
+ 'weight': 307.18,
1137
+ 'normalized': 'rC',
1138
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1O',
1139
+ },
1140
+ 'K': {
1141
+ 'name': '2\'-fluoro-G',
1142
+ 'weight': 347.19,
1143
+ 'normalized': 'rG',
1144
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1O',
1145
+ },
1146
+ 'H': {
1147
+ 'name': '2\'OMe-rU',
1148
+ 'weight': 320.2,
1149
+ 'normalized': 'rU',
1150
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1O',
1151
+ },
1152
+ 'E': {
1153
+ 'name': '2\'OMe-rA',
1154
+ 'weight': 343.24,
1155
+ 'normalized': 'rA',
1156
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O',
1157
+ },
1158
+ 'F': {
1159
+ 'name': '2\'OMe-rC',
1160
+ 'weight': 319.21,
1161
+ 'normalized': 'rC',
1162
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1O',
1163
+ },
1164
+ 'G': {
1165
+ 'name': '2\'OMe-rG',
1166
+ 'weight': 359.24,
1167
+ 'normalized': 'rG',
1168
+ 'SMILES': 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1O',
1169
+ },
1170
+ },
1171
+ },
1172
+ };
1173
+
1174
+
1175
+ /***/ }),
1176
+
1177
+ /***/ "./src/structures-works/mol-transformations.ts":
1178
+ /*!*****************************************************!*\
1179
+ !*** ./src/structures-works/mol-transformations.ts ***!
1180
+ \*****************************************************/
1181
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1182
+
1183
+ __webpack_require__.r(__webpack_exports__);
1184
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1185
+ /* harmony export */ "getNucleotidesMol": () => (/* binding */ getNucleotidesMol),
1186
+ /* harmony export */ "linkV3000": () => (/* binding */ linkV3000)
1187
+ /* harmony export */ });
1188
+ /* harmony import */ var openchemlib_full_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! openchemlib/full.js */ "openchemlib/full.js");
1189
+ /* harmony import */ var openchemlib_full_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(openchemlib_full_js__WEBPACK_IMPORTED_MODULE_0__);
1190
+
1191
+ const PHOSHATE = `
1192
+ Datagrok monomer library Nucleotides
1193
+
1194
+ 0 0 0 0 0 0 0 V3000
1195
+ M V30 BEGIN CTAB
1196
+ M V30 COUNTS 5 4 0 0 0
1197
+ M V30 BEGIN ATOM
1198
+ M V30 1 O -1.5 0 0 0
1199
+ M V30 2 P 0 0 0 0
1200
+ M V30 3 O 0 1 0 0
1201
+ M V30 4 O 0 -1 0 0
1202
+ M V30 5 O 1.5 0 0 0
1203
+ M V30 END ATOM
1204
+ M V30 BEGIN BOND
1205
+ M V30 1 1 1 2
1206
+ M V30 2 2 2 3
1207
+ M V30 3 1 2 4
1208
+ M V30 4 1 2 5
1209
+ M V30 END BOND
1210
+ M V30 END CTAB
1211
+ M V30 BEGIN COLLECTION
1212
+ M V30 END COLLECTION
1213
+ M END`;
1214
+ const THIOPHOSHATE = `
1215
+ Datagrok monomer library Nucleotides
1216
+
1217
+ 0 0 0 0 0 0 0 V3000
1218
+ M V30 BEGIN CTAB
1219
+ M V30 COUNTS 5 4 0 0 0
1220
+ M V30 BEGIN ATOM
1221
+ M V30 1 O -1.5 0 0 0
1222
+ M V30 2 P 0 0 0 0
1223
+ M V30 3 O 0 1 0 0
1224
+ M V30 4 S 0 -1 0 0
1225
+ M V30 5 O 1.5 0 0 0
1226
+ M V30 END ATOM
1227
+ M V30 BEGIN BOND
1228
+ M V30 1 1 1 2
1229
+ M V30 2 2 2 3
1230
+ M V30 3 1 2 4
1231
+ M V30 4 1 2 5
1232
+ M V30 END BOND
1233
+ M V30 END CTAB
1234
+ M V30 BEGIN COLLECTION
1235
+ M V30 END COLLECTION
1236
+ M END`;
1237
+ const INVABASIC = `
1238
+ Datagrok monomer library Nucleotides
1239
+
1240
+ 0 0 0 0 0 0 0 V3000
1241
+ M V30 BEGIN CTAB
1242
+ M V30 COUNTS 8 8 0 0 0
1243
+ M V30 BEGIN ATOM
1244
+ M V30 1 O 1.0934 -2.1636 0 0
1245
+ M V30 2 C 1.8365 -1.4945 0 0 CFG=2
1246
+ M V30 3 C 2.8147 -1.7024 0 0
1247
+ M V30 4 C 3.3147 -0.8364 0 0 VAL=3
1248
+ M V30 5 O 2.6455 -0.0932 0 0
1249
+ M V30 6 C 1.732 -0.5 0 0 CFG=1
1250
+ M V30 7 C 0.866 0 0 0
1251
+ M V30 8 O 0.866 1 0 0
1252
+ M V30 END ATOM
1253
+ M V30 BEGIN BOND
1254
+ M V30 1 1 2 1 CFG=1
1255
+ M V30 2 1 2 3
1256
+ M V30 3 1 3 4
1257
+ M V30 4 1 4 5
1258
+ M V30 5 1 6 5
1259
+ M V30 6 1 2 6
1260
+ M V30 7 1 6 7 CFG=3
1261
+ M V30 8 1 7 8
1262
+ M V30 END BOND
1263
+ M V30 BEGIN COLLECTION
1264
+ M V30 MDLV30/STEABS ATOMS=(2 2 6)
1265
+ M V30 END COLLECTION
1266
+ M V30 END CTAB
1267
+ M END`;
1268
+ function getNucleotidesMol(smilesCodes, oclRender = false) {
1269
+ const molBlocks = [];
1270
+ for (let i = 0; i < smilesCodes.length - 1; i++) {
1271
+ smilesCodes[i] == 'OP(=O)(O)O' ? molBlocks.push(PHOSHATE) :
1272
+ smilesCodes[i] == 'OP(=O)(S)O' ? molBlocks.push(THIOPHOSHATE) :
1273
+ smilesCodes[i] == 'O[C@@H]1C[C@@H]O[C@H]1CO' ? molBlocks.push(rotateNucleotidesV3000(INVABASIC)) :
1274
+ molBlocks.push(rotateNucleotidesV3000(smilesCodes[i]));
1275
+ }
1276
+ return linkV3000(molBlocks, false, oclRender);
1277
+ }
1278
+ function linkV3000(molBlocks, twoMolecules = false, oclRender = false) {
1279
+ let macroMolBlock = '\nDatagrok macromolecule handler\n\n';
1280
+ macroMolBlock += ' 0 0 0 0 0 0 999 V3000\n';
1281
+ macroMolBlock += 'M V30 BEGIN CTAB\n';
1282
+ let atomBlock = '';
1283
+ let bondBlock = '';
1284
+ let collectionBlock = '';
1285
+ const collection = [];
1286
+ let natom = 0;
1287
+ let nbond = 0;
1288
+ let sequenceShift = 0;
1289
+ let xShift = 0;
1290
+ if (twoMolecules && molBlocks.length > 1)
1291
+ molBlocks[1] = invertNucleotidesV3000(molBlocks[1]);
1292
+ for (let i = 0; i < molBlocks.length; i++) {
1293
+ molBlocks[i] = molBlocks[i].replaceAll('(-\nM V30 ', '(')
1294
+ .replaceAll('-\nM V30 ', '').replaceAll(' )', ')');
1295
+ const numbers = extractAtomsBondsNumbersV3000(molBlocks[i]);
1296
+ const coordinates = extractAtomDataV3000(molBlocks[i]);
1297
+ let indexAtoms = molBlocks[i].indexOf('M V30 BEGIN ATOM'); // V3000 index for atoms coordinates
1298
+ indexAtoms = molBlocks[i].indexOf('\n', indexAtoms);
1299
+ let index = indexAtoms;
1300
+ let indexEnd = indexAtoms;
1301
+ for (let j = 0; j < numbers.natom; j++) {
1302
+ if (coordinates.atomIndex[j] != 1 || i == 0 || twoMolecules) {
1303
+ //rewrite atom number
1304
+ index = molBlocks[i].indexOf('V30', index) + 4;
1305
+ indexEnd = molBlocks[i].indexOf(' ', index);
1306
+ const atomNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + natom;
1307
+ molBlocks[i] = molBlocks[i].slice(0, index) + atomNumber + molBlocks[i].slice(indexEnd);
1308
+ //rewrite coordinates
1309
+ index = molBlocks[i].indexOf(' ', index) + 1;
1310
+ index = molBlocks[i].indexOf(' ', index) + 1;
1311
+ indexEnd = molBlocks[i].indexOf(' ', index);
1312
+ const totalShift = xShift - coordinates.x[0];
1313
+ let coordinate = Math.round(10000 * (parseFloat(molBlocks[i].substring(index, indexEnd)) + totalShift)) / 10000;
1314
+ molBlocks[i] = molBlocks[i].slice(0, index) + coordinate + molBlocks[i].slice(indexEnd);
1315
+ index = molBlocks[i].indexOf(' ', index) + 1;
1316
+ indexEnd = molBlocks[i].indexOf(' ', index);
1317
+ coordinate = Math.round(10000 * (parseFloat(molBlocks[i].substring(index, indexEnd)) + sequenceShift)) / 10000;
1318
+ molBlocks[i] = molBlocks[i].slice(0, index) + coordinate + molBlocks[i].slice(indexEnd);
1319
+ index = molBlocks[i].indexOf('\n', index) + 1;
1320
+ }
1321
+ else {
1322
+ index = molBlocks[i].indexOf('M V30', index) - 1;
1323
+ indexEnd = molBlocks[i].indexOf('\n', index + 1);
1324
+ molBlocks[i] = molBlocks[i].slice(0, index) + molBlocks[i].slice(indexEnd);
1325
+ }
1326
+ }
1327
+ const indexAtomsEnd = molBlocks[i].indexOf('M V30 END ATOM');
1328
+ atomBlock += molBlocks[i].substring(indexAtoms + 1, indexAtomsEnd);
1329
+ let indexBonds = molBlocks[i].indexOf('M V30 BEGIN BOND'); // V3000 index for bonds
1330
+ indexBonds = molBlocks[i].indexOf('\n', indexBonds);
1331
+ index = indexBonds;
1332
+ indexEnd = indexBonds;
1333
+ for (let j = 0; j < numbers.nbond; j++) {
1334
+ //rewrite bond number
1335
+ index = molBlocks[i].indexOf('V30', index) + 4;
1336
+ indexEnd = molBlocks[i].indexOf(' ', index);
1337
+ const bondNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + nbond;
1338
+ molBlocks[i] = molBlocks[i].slice(0, index) + bondNumber + molBlocks[i].slice(indexEnd);
1339
+ //rewrite atom pair in bond
1340
+ index = molBlocks[i].indexOf(' ', index) + 1;
1341
+ index = molBlocks[i].indexOf(' ', index) + 1;
1342
+ indexEnd = molBlocks[i].indexOf(' ', index);
1343
+ let atomNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + natom;
1344
+ molBlocks[i] = molBlocks[i].slice(0, index) + atomNumber + molBlocks[i].slice(indexEnd);
1345
+ index = molBlocks[i].indexOf(' ', index) + 1;
1346
+ indexEnd = Math.min(molBlocks[i].indexOf('\n', index), molBlocks[i].indexOf(' ', index));
1347
+ atomNumber = parseInt(molBlocks[i].substring(index, indexEnd)) + natom;
1348
+ molBlocks[i] = molBlocks[i].slice(0, index) + atomNumber + molBlocks[i].slice(indexEnd);
1349
+ index = molBlocks[i].indexOf('\n', index) + 1;
1350
+ }
1351
+ const indexBondEnd = molBlocks[i].indexOf('M V30 END BOND');
1352
+ bondBlock += molBlocks[i].substring(indexBonds + 1, indexBondEnd);
1353
+ let indexCollection = molBlocks[i].indexOf('M V30 MDLV30/STEABS ATOMS=('); // V3000 index for collections
1354
+ while (indexCollection != -1) {
1355
+ indexCollection += 28;
1356
+ const collectionEnd = molBlocks[i].indexOf(')', indexCollection);
1357
+ const collectionEntries = molBlocks[i].substring(indexCollection, collectionEnd).split(' ').slice(1);
1358
+ collectionEntries.forEach((e) => {
1359
+ collection.push(parseInt(e) + natom);
1360
+ });
1361
+ indexCollection = collectionEnd;
1362
+ indexCollection = molBlocks[i].indexOf('M V30 MDLV30/STEABS ATOMS=(', indexCollection);
1363
+ }
1364
+ natom += twoMolecules ? numbers.natom : numbers.natom - 1;
1365
+ nbond += numbers.nbond;
1366
+ xShift += twoMolecules ? 0 : coordinates.x[numbers.natom - 1] - coordinates.x[0];
1367
+ sequenceShift += twoMolecules ? -7 : 0;
1368
+ }
1369
+ const entries = 4;
1370
+ const collNumber = Math.ceil(collection.length / entries);
1371
+ if (oclRender) {
1372
+ collectionBlock += 'M V30 MDLV30/STEABS ATOMS=(' + collection.length;
1373
+ for (let j = 0; j < collection.length; j++)
1374
+ collectionBlock += ' ' + collection[j];
1375
+ collectionBlock += ')\n';
1376
+ }
1377
+ else {
1378
+ collectionBlock += 'M V30 MDLV30/STEABS ATOMS=(' + collection.length + ' -\n';
1379
+ for (let i = 0; i < collNumber; i++) {
1380
+ collectionBlock += 'M V30 ';
1381
+ const entriesCurrent = i + 1 == collNumber ? collection.length - (collNumber - 1) * entries : entries;
1382
+ for (let j = 0; j < entriesCurrent; j++) {
1383
+ collectionBlock += (j + 1 == entriesCurrent) ?
1384
+ (i == collNumber - 1 ? collection[entries * i + j] + ')\n' : collection[entries * i + j] + ' -\n') :
1385
+ collection[entries * i + j] + ' ';
1386
+ }
1387
+ }
1388
+ }
1389
+ //generate file
1390
+ twoMolecules ? natom : natom++;
1391
+ macroMolBlock += 'M V30 COUNTS ' + natom + ' ' + nbond + ' 0 0 0\n';
1392
+ macroMolBlock += 'M V30 BEGIN ATOM\n';
1393
+ macroMolBlock += atomBlock;
1394
+ macroMolBlock += 'M V30 END ATOM\n';
1395
+ macroMolBlock += 'M V30 BEGIN BOND\n';
1396
+ macroMolBlock += bondBlock;
1397
+ macroMolBlock += 'M V30 END BOND\n';
1398
+ macroMolBlock += 'M V30 BEGIN COLLECTION\n';
1399
+ macroMolBlock += collectionBlock;
1400
+ macroMolBlock += 'M V30 END COLLECTION\n';
1401
+ macroMolBlock += 'M V30 END CTAB\n';
1402
+ macroMolBlock += 'M END\n';
1403
+ return macroMolBlock;
1404
+ }
1405
+ function rotateNucleotidesV3000(molecule) {
1406
+ let molBlock = molecule.includes('M END') ? molecule : openchemlib_full_js__WEBPACK_IMPORTED_MODULE_0__.Molecule.fromSmiles(molecule).toMolfileV3();
1407
+ const coordinates = extractAtomDataV3000(molBlock);
1408
+ const natom = coordinates.atomIndex.length;
1409
+ const indexFivePrime = coordinates.atomIndex.indexOf(1);
1410
+ const indexThreePrime = coordinates.atomIndex.indexOf(natom);
1411
+ //fix 5 prime if inadequate
1412
+ if (natom > 8)
1413
+ fix5Prime(coordinates, indexFivePrime, indexThreePrime);
1414
+ const xCenter = (coordinates.x[indexThreePrime] + coordinates.x[indexFivePrime]) / 2;
1415
+ const yCenter = (coordinates.y[indexThreePrime] + coordinates.y[indexFivePrime]) / 2;
1416
+ //place to center
1417
+ for (let i = 0; i < natom; i++) {
1418
+ coordinates.x[i] -= xCenter;
1419
+ coordinates.y[i] -= yCenter;
1420
+ }
1421
+ let angle = 0;
1422
+ if (coordinates.x[indexFivePrime] == 0)
1423
+ angle = coordinates.y[indexFivePrime] > coordinates.y[indexThreePrime] ? Math.PI / 2 : 3 * Math.PI / 2;
1424
+ else if (coordinates.y[indexFivePrime] == 0)
1425
+ angle = coordinates.x[indexFivePrime] > coordinates.x[indexThreePrime] ? Math.PI : 0;
1426
+ else {
1427
+ const derivative = coordinates.y[indexFivePrime] / coordinates.x[indexFivePrime];
1428
+ angle = derivative > 0 ? Math.PI - Math.atan(derivative) : Math.atan(derivative);
1429
+ }
1430
+ const cos = Math.cos(angle);
1431
+ const sin = Math.sin(angle);
1432
+ for (let i = 0; i < natom; i++) {
1433
+ const xAdd = coordinates.x[i];
1434
+ coordinates.x[i] = xAdd * cos - coordinates.y[i] * sin;
1435
+ coordinates.y[i] = xAdd * sin + coordinates.y[i] * cos;
1436
+ }
1437
+ //place to right
1438
+ const xShift = coordinates.x[indexFivePrime];
1439
+ for (let i = 0; i < natom; i++)
1440
+ coordinates.x[i] -= xShift;
1441
+ //rewrite molBlock
1442
+ let index = molBlock.indexOf('M V30 BEGIN ATOM'); // V3000 index for atoms coordinates
1443
+ index = molBlock.indexOf('\n', index);
1444
+ let indexEnd = index;
1445
+ for (let i = 0; i < natom; i++) {
1446
+ index = molBlock.indexOf('V30', index) + 4;
1447
+ index = molBlock.indexOf(' ', index) + 1;
1448
+ index = molBlock.indexOf(' ', index) + 1;
1449
+ indexEnd = molBlock.indexOf(' ', index) + 1;
1450
+ indexEnd = molBlock.indexOf(' ', indexEnd);
1451
+ molBlock = molBlock.slice(0, index) +
1452
+ coordinates.x[i] + ' ' + coordinates.y[i] +
1453
+ molBlock.slice(indexEnd);
1454
+ index = molBlock.indexOf('\n', index) + 1;
1455
+ }
1456
+ return molBlock;
1457
+ }
1458
+ function invertNucleotidesV3000(molecule) {
1459
+ let molBlock = molecule.includes('M END') ? molecule : openchemlib_full_js__WEBPACK_IMPORTED_MODULE_0__.Molecule.fromSmiles(molecule).toMolfileV3();
1460
+ const coordinates = extractAtomDataV3000(molBlock);
1461
+ const natom = coordinates.atomIndex.length;
1462
+ const xCenter = (Math.max(...coordinates.x) + Math.min(...coordinates.x)) / 2;
1463
+ const yCenter = (Math.max(...coordinates.y) + Math.min(...coordinates.y)) / 2;
1464
+ //place to center
1465
+ for (let i = 0; i < natom; i++) {
1466
+ coordinates.x[i] -= xCenter;
1467
+ coordinates.y[i] -= yCenter;
1468
+ }
1469
+ const angle = Math.PI;
1470
+ const cos = Math.cos(angle);
1471
+ const sin = Math.sin(angle);
1472
+ for (let i = 0; i < natom; i++) {
1473
+ const xAdd = coordinates.x[i];
1474
+ coordinates.x[i] = xAdd * cos - coordinates.y[i] * sin;
1475
+ coordinates.y[i] = xAdd * sin + coordinates.y[i] * cos;
1476
+ }
1477
+ //place back
1478
+ const yShift = Math.max(...coordinates.y);
1479
+ for (let i = 0; i < natom; i++) {
1480
+ coordinates.x[i] += xCenter;
1481
+ coordinates.y[i] -= yShift;
1482
+ }
1483
+ //rewrite molBlock
1484
+ let index = molBlock.indexOf('M V30 BEGIN ATOM'); // V3000 index for atoms coordinates
1485
+ index = molBlock.indexOf('\n', index);
1486
+ let indexEnd = index;
1487
+ for (let i = 0; i < natom; i++) {
1488
+ index = molBlock.indexOf('V30', index) + 4;
1489
+ index = molBlock.indexOf(' ', index) + 1;
1490
+ index = molBlock.indexOf(' ', index) + 1;
1491
+ indexEnd = molBlock.indexOf(' ', index) + 1;
1492
+ indexEnd = molBlock.indexOf(' ', indexEnd);
1493
+ molBlock = molBlock.slice(0, index) +
1494
+ coordinates.x[i] + ' ' + coordinates.y[i] +
1495
+ molBlock.slice(indexEnd);
1496
+ index = molBlock.indexOf('\n', index) + 1;
1497
+ }
1498
+ return molBlock;
1499
+ }
1500
+ function fix5Prime(coordinates, indexFivePrime, indexThreePrime) {
1501
+ const indexFivePrimeNeighbour = indexFivePrime + 1;
1502
+ const xShift = coordinates.x[indexFivePrimeNeighbour];
1503
+ const yShift = coordinates.y[indexFivePrimeNeighbour];
1504
+ const base3PrimeX = coordinates.x[indexThreePrime] - xShift;
1505
+ const base3PrimeY = coordinates.y[indexThreePrime] - yShift;
1506
+ const base5PrimeX = coordinates.x[indexFivePrime] - xShift;
1507
+ const base5PrimeY = coordinates.y[indexFivePrime] - yShift;
1508
+ const rotated5PrimeX = base5PrimeX * Math.cos(Math.PI * 2 / 3) - base5PrimeY * Math.sin(Math.PI * 2 / 3);
1509
+ const rotated5PrimeY = base5PrimeX * Math.sin(Math.PI * 2 / 3) + base5PrimeY * Math.cos(Math.PI * 2 / 3);
1510
+ const dx = base5PrimeX - base3PrimeX;
1511
+ const dy = base5PrimeY - base3PrimeY;
1512
+ const dxRotated = rotated5PrimeX - base3PrimeX;
1513
+ const dyRotated = rotated5PrimeY - base3PrimeY;
1514
+ if (Math.sqrt(dyRotated * dyRotated + dxRotated * dxRotated) >= Math.sqrt(dy * dy + dx * dx)) {
1515
+ coordinates.x[indexFivePrime] = rotated5PrimeX + xShift;
1516
+ coordinates.y[indexFivePrime] = rotated5PrimeY + yShift;
1517
+ }
1518
+ }
1519
+ function extractAtomsBondsNumbersV3000(molBlock) {
1520
+ molBlock = molBlock.replaceAll('\r', ''); //equalize old and new sdf standards
1521
+ let index = molBlock.indexOf('COUNTS') + 7; // V3000 index for atoms and bonds number
1522
+ let indexEnd = molBlock.indexOf(' ', index);
1523
+ const atomsNumber = parseInt(molBlock.substring(index, indexEnd));
1524
+ index = indexEnd + 1;
1525
+ indexEnd = molBlock.indexOf(' ', index);
1526
+ const bondsNumber = parseInt(molBlock.substring(index, indexEnd));
1527
+ return { natom: atomsNumber, nbond: bondsNumber };
1528
+ }
1529
+ function extractAtomDataV3000(molBlock) {
1530
+ const numbers = extractAtomsBondsNumbersV3000(molBlock);
1531
+ let index = molBlock.indexOf('M V30 BEGIN ATOM'); // V3000 index for atoms coordinates
1532
+ index = molBlock.indexOf('\n', index);
1533
+ let indexEnd = index;
1534
+ const indexes = Array(numbers.natom);
1535
+ const types = Array(numbers.natom);
1536
+ const x = Array(numbers.natom);
1537
+ const y = Array(numbers.natom);
1538
+ for (let i = 0; i < numbers.natom; i++) {
1539
+ index = molBlock.indexOf('V30', index) + 4;
1540
+ indexEnd = molBlock.indexOf(' ', index);
1541
+ indexes[i] = parseInt(molBlock.substring(index, indexEnd));
1542
+ index = indexEnd + 1;
1543
+ indexEnd = molBlock.indexOf(' ', index);
1544
+ types[i] = molBlock.substring(index, indexEnd);
1545
+ index = indexEnd + 1;
1546
+ indexEnd = molBlock.indexOf(' ', index);
1547
+ x[i] = parseFloat(molBlock.substring(index, indexEnd));
1548
+ index = indexEnd + 1;
1549
+ indexEnd = molBlock.indexOf(' ', index);
1550
+ y[i] = parseFloat(molBlock.substring(index, indexEnd));
1551
+ index = molBlock.indexOf('\n', index) + 1;
1552
+ }
1553
+ return { atomIndex: indexes, atomType: types, x: x, y: y };
1554
+ }
1555
+
1556
+
1557
+ /***/ }),
1558
+
1559
+ /***/ "./src/structures-works/sequence-codes-tools.ts":
1560
+ /*!******************************************************!*\
1561
+ !*** ./src/structures-works/sequence-codes-tools.ts ***!
1562
+ \******************************************************/
1563
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1564
+
1565
+ __webpack_require__.r(__webpack_exports__);
1566
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1567
+ /* harmony export */ "undefinedInputSequence": () => (/* binding */ undefinedInputSequence),
1568
+ /* harmony export */ "isValidSequence": () => (/* binding */ isValidSequence),
1569
+ /* harmony export */ "convertSequence": () => (/* binding */ convertSequence)
1570
+ /* harmony export */ });
1571
+ /* harmony import */ var datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/grok */ "datagrok-api/grok");
1572
+ /* harmony import */ var datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__);
1573
+ /* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! datagrok-api/ui */ "datagrok-api/ui");
1574
+ /* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__);
1575
+ /* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./map */ "./src/structures-works/map.ts");
1576
+ /* harmony import */ var _converters__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./converters */ "./src/structures-works/converters.ts");
1577
+
1578
+
1579
+ // import * as DG from 'datagrok-api/dg';
1580
+
1581
+
1582
+ const noTranslationTableAvailable = 'No translation table available';
1583
+ const undefinedInputSequence = 'Type of input sequence is undefined';
1584
+ function isValidSequence(sequence) {
1585
+ let possibleSynthesizers = getListOfPossibleSynthesizersByFirstMatchedCode(sequence);
1586
+ if (possibleSynthesizers.length > 1) {
1587
+ const synthesizer = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('Choose synthesizer from list: ', possibleSynthesizers[0], possibleSynthesizers);
1588
+ datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.dialog('Choose Synthesizer')
1589
+ .add(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.panel([synthesizer.root], { style: { fontWeight: 'bold' } }))
1590
+ .onOK(() => possibleSynthesizers = [synthesizer.value])
1591
+ .onCancel(() => {
1592
+ possibleSynthesizers = [possibleSynthesizers[0]];
1593
+ datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.warning('Input sequence is expected to be in format ' + possibleSynthesizers[0]);
1594
+ })
1595
+ .show();
1596
+ }
1597
+ else if (possibleSynthesizers.length == 0)
1598
+ return { indexOfFirstNotValidChar: 0, synthesizer: null, technology: null };
1599
+ let outputIndex = 0;
1600
+ const firstUniqueCharacters = ['r', 'd'];
1601
+ const nucleotides = ['A', 'U', 'T', 'C', 'G'];
1602
+ possibleSynthesizers.forEach((synthesizer) => {
1603
+ const codes = getAllCodesOfSynthesizer(synthesizer);
1604
+ while (outputIndex < sequence.length) {
1605
+ const matchedCode = codes.find((c) => c == sequence.slice(outputIndex, outputIndex + c.length));
1606
+ if (matchedCode == null)
1607
+ break;
1608
+ if ( // for mistake pattern 'rAA'
1609
+ outputIndex > 1 &&
1610
+ nucleotides.includes(sequence[outputIndex]) &&
1611
+ firstUniqueCharacters.includes(sequence[outputIndex - 2]))
1612
+ break;
1613
+ if ( // for mistake pattern 'ArA'
1614
+ firstUniqueCharacters.includes(sequence[outputIndex + 1]) &&
1615
+ nucleotides.includes(sequence[outputIndex])) {
1616
+ outputIndex++;
1617
+ break;
1618
+ }
1619
+ outputIndex += matchedCode.length;
1620
+ }
1621
+ });
1622
+ const indexOfFirstNotValidChar = (outputIndex == sequence.length) ? -1 : outputIndex;
1623
+ if (indexOfFirstNotValidChar != -1) {
1624
+ return {
1625
+ indexOfFirstNotValidChar: indexOfFirstNotValidChar,
1626
+ synthesizer: possibleSynthesizers[0],
1627
+ technology: null,
1628
+ };
1629
+ }
1630
+ let possibleTechnologies = getListOfPossibleTechnologiesByFirstMatchedCode(sequence, possibleSynthesizers[0]);
1631
+ if (possibleTechnologies.length > 1) {
1632
+ const technology = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.choiceInput('Choose technology from list: ', possibleTechnologies[0], possibleTechnologies);
1633
+ datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.dialog('Choose Technology')
1634
+ .add(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.panel([technology.root], { style: { fontWeight: 'bold' } }))
1635
+ .onOK(() => possibleTechnologies = [technology.value])
1636
+ .onCancel(() => {
1637
+ possibleTechnologies = [possibleTechnologies[0]];
1638
+ datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.warning('Input sequence is expected to be in format ' + possibleTechnologies[0]);
1639
+ })
1640
+ .show();
1641
+ }
1642
+ else if (possibleTechnologies.length == 0)
1643
+ return { indexOfFirstNotValidChar: 0, synthesizer: null, technology: null };
1644
+ outputIndex = 0;
1645
+ possibleTechnologies.forEach((technology) => {
1646
+ const codes = Object.keys(_map__WEBPACK_IMPORTED_MODULE_2__.map[possibleSynthesizers[0]][technology]);
1647
+ while (outputIndex < sequence.length) {
1648
+ const matchedCode = codes.find((c) => c == sequence.slice(outputIndex, outputIndex + c.length));
1649
+ if (matchedCode == null)
1650
+ break;
1651
+ if ( // for mistake pattern 'rAA'
1652
+ outputIndex > 1 &&
1653
+ nucleotides.includes(sequence[outputIndex]) &&
1654
+ firstUniqueCharacters.includes(sequence[outputIndex - 2]))
1655
+ break;
1656
+ if ( // for mistake pattern 'ArA'
1657
+ firstUniqueCharacters.includes(sequence[outputIndex + 1]) &&
1658
+ nucleotides.includes(sequence[outputIndex])) {
1659
+ outputIndex++;
1660
+ break;
1661
+ }
1662
+ outputIndex += matchedCode.length;
1663
+ }
1664
+ });
1665
+ return {
1666
+ indexOfFirstNotValidChar: indexOfFirstNotValidChar,
1667
+ synthesizer: possibleSynthesizers[0],
1668
+ technology: possibleTechnologies[outputIndex],
1669
+ };
1670
+ }
1671
+ function getAllCodesOfSynthesizer(synthesizer) {
1672
+ let codes = [];
1673
+ for (const technology of Object.keys(_map__WEBPACK_IMPORTED_MODULE_2__.map[synthesizer]))
1674
+ codes = codes.concat(Object.keys(_map__WEBPACK_IMPORTED_MODULE_2__.map[synthesizer][technology]));
1675
+ return codes.concat(Object.keys(_map__WEBPACK_IMPORTED_MODULE_2__.MODIFICATIONS));
1676
+ }
1677
+ function getListOfPossibleSynthesizersByFirstMatchedCode(sequence) {
1678
+ const synthesizers = [];
1679
+ Object.keys(_map__WEBPACK_IMPORTED_MODULE_2__.map).forEach((synthesizer) => {
1680
+ const codes = getAllCodesOfSynthesizer(synthesizer);
1681
+ //TODO: get first non-dropdown code when there are two modifications
1682
+ let start = 0;
1683
+ for (let i = 0; i < sequence.length; i++) {
1684
+ if (sequence[i] == ')' && i != sequence.length - 1) {
1685
+ start = i + 1;
1686
+ break;
1687
+ }
1688
+ }
1689
+ if (codes.some((s) => s == sequence.slice(start, start + s.length)))
1690
+ synthesizers.push(synthesizer);
1691
+ });
1692
+ return synthesizers;
1693
+ }
1694
+ function getListOfPossibleTechnologiesByFirstMatchedCode(sequence, synthesizer) {
1695
+ const technologies = [];
1696
+ Object.keys(_map__WEBPACK_IMPORTED_MODULE_2__.map[synthesizer]).forEach((technology) => {
1697
+ const codes = Object.keys(_map__WEBPACK_IMPORTED_MODULE_2__.map[synthesizer][technology]).concat(Object.keys(_map__WEBPACK_IMPORTED_MODULE_2__.MODIFICATIONS));
1698
+ if (codes.some((s) => s == sequence.slice(0, s.length)))
1699
+ technologies.push(technology);
1700
+ });
1701
+ return technologies;
1702
+ }
1703
+ function convertSequence(sequence, output) {
1704
+ if (output.indexOfFirstNotValidChar != -1) {
1705
+ return {
1706
+ // type: '',
1707
+ indexOfFirstNotValidChar: JSON.stringify(output),
1708
+ Error: undefinedInputSequence,
1709
+ };
1710
+ }
1711
+ if (output.synthesizer == _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.RAW_NUCLEOTIDES && output.technology == _map__WEBPACK_IMPORTED_MODULE_2__.TECHNOLOGIES.DNA) {
1712
+ return {
1713
+ type: _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.RAW_NUCLEOTIDES + ' ' + _map__WEBPACK_IMPORTED_MODULE_2__.TECHNOLOGIES.DNA,
1714
+ Nucleotides: sequence,
1715
+ BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.asoGapmersNucleotidesToBioSpring)(sequence),
1716
+ GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.asoGapmersNucleotidesToGcrs)(sequence),
1717
+ };
1718
+ }
1719
+ if (output.synthesizer == _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.BIOSPRING && output.technology == _map__WEBPACK_IMPORTED_MODULE_2__.TECHNOLOGIES.ASO_GAPMERS) {
1720
+ return {
1721
+ type: _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.BIOSPRING + ' ' + _map__WEBPACK_IMPORTED_MODULE_2__.TECHNOLOGIES.ASO_GAPMERS,
1722
+ Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.asoGapmersBioSpringToNucleotides)(sequence),
1723
+ BioSpring: sequence,
1724
+ GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.asoGapmersBioSpringToGcrs)(sequence),
1725
+ };
1726
+ }
1727
+ if (output.synthesizer == _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.GCRS && output.technology == _map__WEBPACK_IMPORTED_MODULE_2__.TECHNOLOGIES.ASO_GAPMERS) {
1728
+ return {
1729
+ type: _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.GCRS + ' ' + _map__WEBPACK_IMPORTED_MODULE_2__.TECHNOLOGIES.ASO_GAPMERS,
1730
+ Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.asoGapmersGcrsToNucleotides)(sequence),
1731
+ BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.asoGapmersGcrsToBioSpring)(sequence),
1732
+ Mermade12: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.gcrsToMermade12)(sequence),
1733
+ GCRS: sequence,
1734
+ };
1735
+ }
1736
+ if (output.synthesizer == _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.RAW_NUCLEOTIDES && output.technology == _map__WEBPACK_IMPORTED_MODULE_2__.TECHNOLOGIES.RNA) {
1737
+ return {
1738
+ type: _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.RAW_NUCLEOTIDES + ' ' + _map__WEBPACK_IMPORTED_MODULE_2__.TECHNOLOGIES.RNA,
1739
+ Nucleotides: sequence,
1740
+ BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.siRnaNucleotideToBioSpringSenseStrand)(sequence),
1741
+ Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.siRnaNucleotideToAxolabsSenseStrand)(sequence),
1742
+ GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.siRnaNucleotidesToGcrs)(sequence),
1743
+ };
1744
+ }
1745
+ if (output.synthesizer == _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.BIOSPRING && output.technology == _map__WEBPACK_IMPORTED_MODULE_2__.TECHNOLOGIES.SI_RNA) {
1746
+ return {
1747
+ type: _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.BIOSPRING + ' ' + _map__WEBPACK_IMPORTED_MODULE_2__.TECHNOLOGIES.SI_RNA,
1748
+ Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.siRnaBioSpringToNucleotides)(sequence),
1749
+ BioSpring: sequence,
1750
+ Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.siRnaBioSpringToAxolabs)(sequence),
1751
+ GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.siRnaBioSpringToGcrs)(sequence),
1752
+ };
1753
+ }
1754
+ if (output.synthesizer == _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS && output.technology == _map__WEBPACK_IMPORTED_MODULE_2__.TECHNOLOGIES.SI_RNA) {
1755
+ return {
1756
+ type: _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.AXOLABS + ' ' + _map__WEBPACK_IMPORTED_MODULE_2__.TECHNOLOGIES.SI_RNA,
1757
+ Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.siRnaAxolabsToNucleotides)(sequence),
1758
+ BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.siRnaAxolabsToBioSpring)(sequence),
1759
+ Axolabs: sequence,
1760
+ GCRS: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.siRnaAxolabsToGcrs)(sequence),
1761
+ };
1762
+ }
1763
+ if (output.synthesizer == _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.GCRS && output.technology == _map__WEBPACK_IMPORTED_MODULE_2__.TECHNOLOGIES.SI_RNA) {
1764
+ return {
1765
+ type: _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.GCRS + ' ' + _map__WEBPACK_IMPORTED_MODULE_2__.TECHNOLOGIES.SI_RNA,
1766
+ Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.siRnaGcrsToNucleotides)(sequence),
1767
+ BioSpring: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.siRnaGcrsToBioSpring)(sequence),
1768
+ Axolabs: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.siRnaGcrsToAxolabs)(sequence),
1769
+ MM12: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.gcrsToMermade12)(sequence),
1770
+ GCRS: sequence,
1771
+ };
1772
+ }
1773
+ if (output.synthesizer == _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.GCRS) {
1774
+ return {
1775
+ type: _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.GCRS,
1776
+ Nucleotides: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.gcrsToNucleotides)(sequence),
1777
+ GCRS: sequence,
1778
+ Mermade12: (0,_converters__WEBPACK_IMPORTED_MODULE_3__.gcrsToMermade12)(sequence),
1779
+ };
1780
+ }
1781
+ if (output.synthesizer == _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.MERMADE_12) {
1782
+ return {
1783
+ type: _map__WEBPACK_IMPORTED_MODULE_2__.SYNTHESIZERS.MERMADE_12,
1784
+ Nucleotides: noTranslationTableAvailable,
1785
+ GCRS: noTranslationTableAvailable,
1786
+ Mermade12: sequence,
1787
+ };
1788
+ }
1789
+ return {
1790
+ type: undefinedInputSequence,
1791
+ Nucleotides: undefinedInputSequence,
1792
+ };
1793
+ }
1794
+
1795
+
1796
+ /***/ }),
1797
+
1798
+ /***/ "./src/tests/smiles-tests.ts":
1799
+ /*!***********************************!*\
1800
+ !*** ./src/tests/smiles-tests.ts ***!
1801
+ \***********************************/
1802
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1803
+
1804
+ __webpack_require__.r(__webpack_exports__);
1805
+ /* harmony import */ var _datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @datagrok-libraries/utils/src/test */ "./node_modules/@datagrok-libraries/utils/src/test.js");
1806
+ /* harmony import */ var _structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../structures-works/from-monomers */ "./src/structures-works/from-monomers.ts");
1807
+ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
1808
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1809
+ return new (P || (P = Promise))(function (resolve, reject) {
1810
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
1811
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
1812
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
1813
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
1814
+ });
1815
+ };
1816
+
1817
+
1818
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.category)('sequence-translator', () => {
1819
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('AGGTCCTCTTGACTTAGGCC', () => __awaiter(void 0, void 0, void 0, function* () {
1820
+ const expected = 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1OP(=O)(O)' +
1821
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1822
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1823
+ 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1OP(=O)(O)' +
1824
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1OP(=O)(O)' +
1825
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1OP(=O)(O)' +
1826
+ 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1OP(=O)(O)' +
1827
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1OP(=O)(O)' +
1828
+ 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1OP(=O)(O)' +
1829
+ 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1OP(=O)(O)' +
1830
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1831
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1OP(=O)(O)' +
1832
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1OP(=O)(O)' +
1833
+ 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1OP(=O)(O)' +
1834
+ 'OC[C@H]1O[C@@H](N2C=C(C)C(=O)NC2(=O))C[C@@H]1OP(=O)(O)' +
1835
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)C[C@@H]1OP(=O)(O)' +
1836
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1837
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1838
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1OP(=O)(O)OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))C[C@@H]1O';
1839
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('AGGTCCTCTTGACTTAGGCC'), expected);
1840
+ }));
1841
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('invabasic/galnac1', () => __awaiter(void 0, void 0, void 0, function* () {
1842
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
1843
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1844
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1845
+ 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
1846
+ 'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
1847
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
1848
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
1849
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sgg(invabasic)(GalNAc-2-JNJ)'), expected);
1850
+ }));
1851
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('invabasic/galnac2', () => __awaiter(void 0, void 0, void 0, function* () {
1852
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
1853
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
1854
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1855
+ 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
1856
+ 'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
1857
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
1858
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
1859
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sgsg(invabasic)(GalNAc-2-JNJ)'), expected);
1860
+ }));
1861
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('invabasic/galnac3', () => __awaiter(void 0, void 0, void 0, function* () {
1862
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
1863
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1864
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
1865
+ 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
1866
+ 'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
1867
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
1868
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
1869
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sggs(invabasic)(GalNAc-2-JNJ)'), expected);
1870
+ }));
1871
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('invabasic/galnac4', () => __awaiter(void 0, void 0, void 0, function* () {
1872
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
1873
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1874
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1875
+ 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
1876
+ 'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
1877
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
1878
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
1879
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sgg(invabasic)s(GalNAc-2-JNJ)'), expected);
1880
+ }));
1881
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('usCfCfUfGfAf', () => __awaiter(void 0, void 0, void 0, function* () {
1882
+ const expected = 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
1883
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
1884
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
1885
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
1886
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
1887
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1O';
1888
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('usCfCfUfGfAf'), expected);
1889
+ }));
1890
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('usAfsusgsgsg', () => __awaiter(void 0, void 0, void 0, function* () {
1891
+ const expected = 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
1892
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(S)' +
1893
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
1894
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
1895
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
1896
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1O';
1897
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('usAfsusgsgsg'), expected);
1898
+ }));
1899
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('UfUfUfsCfsuacg', () => __awaiter(void 0, void 0, void 0, function* () {
1900
+ const expected = 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
1901
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
1902
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(S)' +
1903
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(S)' +
1904
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1905
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1906
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1907
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1O';
1908
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('UfUfUfsCfsuacg'), expected);
1909
+ }));
1910
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('susususauasu', () => __awaiter(void 0, void 0, void 0, function* () {
1911
+ const expected = 'OP(=O)(S)OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
1912
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
1913
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
1914
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1915
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1916
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
1917
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1O';
1918
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('susususauasu'), expected);
1919
+ }));
1920
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('CfGfCfsGfsCf', () => __awaiter(void 0, void 0, void 0, function* () {
1921
+ const expected = 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
1922
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
1923
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(S)' +
1924
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(S)' +
1925
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1O';
1926
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('CfGfCfsGfsCf'), expected);
1927
+ }));
1928
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('acacacsacsac', () => __awaiter(void 0, void 0, void 0, function* () {
1929
+ const expected = 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1930
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1931
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1932
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1933
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1934
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
1935
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1936
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
1937
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1938
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1O';
1939
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('acacacsacsac'), expected);
1940
+ }));
1941
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('cccgggusug', () => __awaiter(void 0, void 0, void 0, function* () {
1942
+ const expected = 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1943
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1944
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1945
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1946
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1947
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1948
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
1949
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1950
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1O';
1951
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('cccgggusug'), expected);
1952
+ }));
1953
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('UfAfCfGfGfCfAfUf', () => __awaiter(void 0, void 0, void 0, function* () {
1954
+ const expected = 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
1955
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
1956
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
1957
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
1958
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
1959
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
1960
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
1961
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1O';
1962
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('UfAfCfGfGfCfAfUf'), expected);
1963
+ }));
1964
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)sucuCfuUf', () => __awaiter(void 0, void 0, void 0, function* () {
1965
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
1966
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1967
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1968
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1969
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
1970
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1971
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1O';
1972
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sucuCfuUf'), expected);
1973
+ }));
1974
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)sAfgcugUf', () => __awaiter(void 0, void 0, void 0, function* () {
1975
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
1976
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
1977
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1978
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1979
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1980
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
1981
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1O';
1982
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sAfgcugUf'), expected);
1983
+ }));
1984
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)cuCfuUfsc', () => __awaiter(void 0, void 0, void 0, function* () {
1985
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
1986
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1987
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1988
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
1989
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1990
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(S)' +
1991
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1O';
1992
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)cuCfuUfsc'), expected);
1993
+ }));
1994
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)scususu(GalNAc-2-JNJ)', () => __awaiter(void 0, void 0, void 0, function* () {
1995
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
1996
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
1997
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
1998
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
1999
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2000
+ 'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
2001
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
2002
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
2003
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)scususu(GalNAc-2-JNJ)'), expected);
2004
+ }));
2005
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)usAfsucuCfuUfAfgcugUfgCfacususu', () => __awaiter(void 0, void 0, void 0, function* () {
2006
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
2007
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
2008
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(S)' +
2009
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2010
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2011
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2012
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2013
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2014
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2015
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
2016
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2017
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2018
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2019
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2020
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2021
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2022
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2023
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2024
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2025
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
2026
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
2027
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1O';
2028
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)usAfsucuCfuUfAfgcugUfgCfacususu'), expected);
2029
+ }));
2030
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)asacgGfuGfCfAfacucuauuca', () => __awaiter(void 0, void 0, void 0, function* () {
2031
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
2032
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
2033
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2034
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2035
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2036
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
2037
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2038
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
2039
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2040
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
2041
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2042
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2043
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2044
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2045
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2046
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2047
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2048
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2049
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2050
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O';
2051
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)asacgGfuGfCfAfacucuauuca'), expected);
2052
+ }));
2053
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)scsgguGfcAfAfCfucuauucuga', () => __awaiter(void 0, void 0, void 0, function* () {
2054
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
2055
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
2056
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2057
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2058
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2059
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
2060
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2061
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
2062
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
2063
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2064
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2065
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2066
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2067
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2068
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2069
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2070
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2071
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2072
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2073
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O';
2074
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)scsgguGfcAfAfCfucuauucuga'), expected);
2075
+ }));
2076
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)scsaacUfcUfAfUfucuggacuua', () => __awaiter(void 0, void 0, void 0, function* () {
2077
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
2078
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
2079
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2080
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2081
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2082
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2083
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2084
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2085
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
2086
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2087
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2088
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2089
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2090
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2091
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2092
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2093
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2094
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2095
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2096
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O';
2097
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)scsaacUfcUfAfUfucuggacuua'), expected);
2098
+ }));
2099
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)sasacuCfuAfUfUfcuggacuuua', () => __awaiter(void 0, void 0, void 0, function* () {
2100
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
2101
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
2102
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2103
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2104
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2105
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2106
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2107
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
2108
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2109
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2110
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2111
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2112
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2113
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2114
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2115
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2116
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2117
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2118
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2119
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1O';
2120
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sasacuCfuAfUfUfcuggacuuua'), expected);
2121
+ }));
2122
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)usAfscug(invabasic)(GalNAc-2-JNJ)', () => __awaiter(void 0, void 0, void 0, function* () {
2123
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
2124
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
2125
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(S)' +
2126
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2127
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2128
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2129
+ 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
2130
+ 'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
2131
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
2132
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
2133
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)usAfscug(invabasic)(GalNAc-2-JNJ)'), expected);
2134
+ }));
2135
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)sasuaaCfcUf(GalNAc-2-JNJ)', () => __awaiter(void 0, void 0, void 0, function* () {
2136
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
2137
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
2138
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2139
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2140
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2141
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2142
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2143
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2144
+ 'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
2145
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
2146
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
2147
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sasuaaCfcUf(GalNAc-2-JNJ)'), expected);
2148
+ }));
2149
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)sasuaaCfcUfCfUfuguaguuaua(GalNAc-2-JNJ)', () => __awaiter(void 0, void 0, void 0, function* () {
2150
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
2151
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(S)' +
2152
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2153
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2154
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2155
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2156
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2157
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2158
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2159
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2160
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2161
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2162
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2163
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2164
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2165
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2166
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2167
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2168
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2169
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2170
+ 'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
2171
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
2172
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
2173
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)sasuaaCfcUfCfUfuguaguuaua(GalNAc-2-JNJ)'), expected);
2174
+ }));
2175
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)scsaucacguUfGfCfagccgucuua(invabasic)(GalNAc-2-JNJ)', () => __awaiter(void 0, void 0, void 0, function* () {
2176
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
2177
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
2178
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2179
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2180
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2181
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2182
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2183
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2184
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2185
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2186
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](F)[C@@H]1OP(=O)(O)' +
2187
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2188
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2189
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2190
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2191
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2192
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2193
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2194
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2195
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2196
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2197
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2198
+ 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(O)' +
2199
+ 'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
2200
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
2201
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
2202
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)scsaucacguUfGfCfagccgucuua(invabasic)(GalNAc-2-JNJ)'), expected);
2203
+ }));
2204
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('(invabasic)susguuUfgCfCfUfacaucuacua(GalNAc-2-JNJ)', () => __awaiter(void 0, void 0, void 0, function* () {
2205
+ const expected = 'O[C@@H]1C[C@@H]O[C@H]1COP(=O)(S)' +
2206
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(S)' +
2207
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2208
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2209
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2210
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2211
+ 'OC[C@H]1O[C@@H](N2C3N=C(N)NC(=O)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2212
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2213
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2214
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](F)[C@@H]1OP(=O)(O)' +
2215
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2216
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2217
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2218
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2219
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2220
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2221
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2222
+ 'OC[C@H]1O[C@@H](N2C=CC(N)=NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2223
+ 'OC[C@H]1O[C@@H](N2C=CC(=O)NC2(=O))[C@H](OC)[C@@H]1OP(=O)(O)' +
2224
+ 'OC[C@H]1O[C@@H](N2C3N=CN=C(N)C=3N=C2)[C@H](OC)[C@@H]1OP(=O)(O)' +
2225
+ 'OCC(O)CNC(=O)CCCC(=O)NC(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
2226
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)' +
2227
+ '(COCCC(=O)NCCCNC(=O)CCCCOC2OC(CO)C(O)C(O)C2NC(=O)C)';
2228
+ (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)((0,_structures_works_from_monomers__WEBPACK_IMPORTED_MODULE_1__.sequenceToSmiles)('(invabasic)susguuUfgCfCfUfacaucuacua(GalNAc-2-JNJ)'), expected);
2229
+ }));
2230
+ });
2231
+
2232
+
2233
+ /***/ }),
2234
+
2235
+ /***/ "datagrok-api/dg":
2236
+ /*!*********************!*\
2237
+ !*** external "DG" ***!
2238
+ \*********************/
2239
+ /***/ ((module) => {
2240
+
2241
+ module.exports = DG;
2242
+
2243
+ /***/ }),
2244
+
2245
+ /***/ "openchemlib/full.js":
2246
+ /*!**********************!*\
2247
+ !*** external "OCL" ***!
2248
+ \**********************/
2249
+ /***/ ((module) => {
2250
+
2251
+ module.exports = OCL;
2252
+
2253
+ /***/ }),
2254
+
2255
+ /***/ "datagrok-api/grok":
2256
+ /*!***********************!*\
2257
+ !*** external "grok" ***!
2258
+ \***********************/
2259
+ /***/ ((module) => {
2260
+
2261
+ module.exports = grok;
2262
+
2263
+ /***/ }),
2264
+
2265
+ /***/ "datagrok-api/ui":
2266
+ /*!*********************!*\
2267
+ !*** external "ui" ***!
2268
+ \*********************/
2269
+ /***/ ((module) => {
2270
+
2271
+ module.exports = ui;
2272
+
2273
+ /***/ })
2274
+
2275
+ /******/ });
2276
+ /************************************************************************/
2277
+ /******/ // The module cache
2278
+ /******/ var __webpack_module_cache__ = {};
2279
+ /******/
2280
+ /******/ // The require function
2281
+ /******/ function __webpack_require__(moduleId) {
2282
+ /******/ // Check if module is in cache
2283
+ /******/ var cachedModule = __webpack_module_cache__[moduleId];
2284
+ /******/ if (cachedModule !== undefined) {
2285
+ /******/ return cachedModule.exports;
2286
+ /******/ }
2287
+ /******/ // Create a new module (and put it into the cache)
2288
+ /******/ var module = __webpack_module_cache__[moduleId] = {
2289
+ /******/ // no module.id needed
2290
+ /******/ // no module.loaded needed
2291
+ /******/ exports: {}
2292
+ /******/ };
2293
+ /******/
2294
+ /******/ // Execute the module function
2295
+ /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
2296
+ /******/
2297
+ /******/ // Return the exports of the module
2298
+ /******/ return module.exports;
2299
+ /******/ }
2300
+ /******/
2301
+ /************************************************************************/
2302
+ /******/ /* webpack/runtime/compat get default export */
2303
+ /******/ (() => {
2304
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
2305
+ /******/ __webpack_require__.n = (module) => {
2306
+ /******/ var getter = module && module.__esModule ?
2307
+ /******/ () => (module['default']) :
2308
+ /******/ () => (module);
2309
+ /******/ __webpack_require__.d(getter, { a: getter });
2310
+ /******/ return getter;
2311
+ /******/ };
2312
+ /******/ })();
2313
+ /******/
2314
+ /******/ /* webpack/runtime/define property getters */
2315
+ /******/ (() => {
2316
+ /******/ // define getter functions for harmony exports
2317
+ /******/ __webpack_require__.d = (exports, definition) => {
2318
+ /******/ for(var key in definition) {
2319
+ /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
2320
+ /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
2321
+ /******/ }
2322
+ /******/ }
2323
+ /******/ };
2324
+ /******/ })();
2325
+ /******/
2326
+ /******/ /* webpack/runtime/hasOwnProperty shorthand */
2327
+ /******/ (() => {
2328
+ /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
2329
+ /******/ })();
2330
+ /******/
2331
+ /******/ /* webpack/runtime/make namespace object */
2332
+ /******/ (() => {
2333
+ /******/ // define __esModule on exports
2334
+ /******/ __webpack_require__.r = (exports) => {
2335
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
2336
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2337
+ /******/ }
2338
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
2339
+ /******/ };
2340
+ /******/ })();
2341
+ /******/
2342
+ /************************************************************************/
2343
+ var __webpack_exports__ = {};
2344
+ // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
2345
+ (() => {
2346
+ /*!*****************************!*\
2347
+ !*** ./src/package-test.ts ***!
2348
+ \*****************************/
2349
+ __webpack_require__.r(__webpack_exports__);
2350
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2351
+ /* harmony export */ "_package": () => (/* binding */ _package),
2352
+ /* harmony export */ "tests": () => (/* reexport safe */ _datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_1__.tests),
2353
+ /* harmony export */ "test": () => (/* binding */ test)
2354
+ /* harmony export */ });
2355
+ /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
2356
+ /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__);
2357
+ /* harmony import */ var _datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @datagrok-libraries/utils/src/test */ "./node_modules/@datagrok-libraries/utils/src/test.js");
2358
+ /* harmony import */ var _tests_smiles_tests__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tests/smiles-tests */ "./src/tests/smiles-tests.ts");
2359
+ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
2360
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2361
+ return new (P || (P = Promise))(function (resolve, reject) {
2362
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
2363
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
2364
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
2365
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
2366
+ });
2367
+ };
2368
+
2369
+
2370
+
2371
+ const _package = new datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Package();
2372
+
2373
+ //name: test
2374
+ //output: dataframe result
2375
+ function test() {
2376
+ return __awaiter(this, void 0, void 0, function* () {
2377
+ const data = yield (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_1__.runTests)();
2378
+ return datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.DataFrame.fromObjects(data);
2379
+ });
2380
+ }
2381
+
2382
+ })();
2383
+
2384
+ sequencetranslator_test = __webpack_exports__;
2385
+ /******/ })()
2386
+ ;
2387
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ0E7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9pQjJDO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0Esb0JBQW9CLDRCQUE0QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDTCxDQUFDOzs7Ozs7Ozs7OztBQ3ZhRDs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7QUNBQTs7Ozs7O1VDQUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7Ozs7V0N0QkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGlDQUFpQyxXQUFXO1dBQzVDO1dBQ0E7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTkEsaUJBQWlCLFNBQUksSUFBSSxTQUFJO0FBQzdCLDRCQUE0QiwrREFBK0QsaUJBQWlCO0FBQzVHO0FBQ0Esb0NBQW9DLE1BQU0sK0JBQStCLFlBQVk7QUFDckYsbUNBQW1DLE1BQU0sbUNBQW1DLFlBQVk7QUFDeEYsZ0NBQWdDO0FBQ2hDO0FBQ0EsS0FBSztBQUNMO0FBQ3NDO0FBQytCO0FBQ3ZDO0FBQ3ZCLHFCQUFxQixvREFBVTtBQUNyQjtBQUNqQjtBQUNBO0FBQ087QUFDUDtBQUNBLDJCQUEyQiw0RUFBUTtBQUNuQyxlQUFlLGtFQUF3QjtBQUN2QyxLQUFLO0FBQ0wiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdGVzdC5qcyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvLi9zcmMvc3RydWN0dXJlcy13b3Jrcy9jb252ZXJ0ZXJzLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL2Zyb20tbW9ub21lcnMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3MvbWFwLnRzIiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci8uL3NyYy9zdHJ1Y3R1cmVzLXdvcmtzL21vbC10cmFuc2Zvcm1hdGlvbnMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3N0cnVjdHVyZXMtd29ya3Mvc2VxdWVuY2UtY29kZXMtdG9vbHMudHMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3Rlc3RzL3NtaWxlcy10ZXN0cy50cyIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvZXh0ZXJuYWwgdmFyIFwiREdcIiIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvZXh0ZXJuYWwgdmFyIFwiT0NMXCIiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL2V4dGVybmFsIHZhciBcImdyb2tcIiIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3IvZXh0ZXJuYWwgdmFyIFwidWlcIiIsIndlYnBhY2s6Ly9zZXF1ZW5jZXRyYW5zbGF0b3Ivd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL3NlcXVlbmNldHJhbnNsYXRvci93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vc2VxdWVuY2V0cmFuc2xhdG9yLy4vc3JjL3BhY2thZ2UtdGVzdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCAqIGFzIGdyb2sgZnJvbSBcImRhdGFncm9rLWFwaS9ncm9rXCI7XG5leHBvcnQgbGV0IHRlc3RzID0ge307XG5leHBvcnQgbGV0IGN1cnJlbnRDYXRlZ29yeTtcbmV4cG9ydCB2YXIgYXNzdXJlO1xuKGZ1bmN0aW9uIChhc3N1cmUpIHtcbiAgICBmdW5jdGlvbiBub3ROdWxsKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgYCR7bmFtZSA9PSBudWxsID8gJ1ZhbHVlJyA6IG5hbWV9IG5vdCBkZWZpbmVkYDtcbiAgICB9XG4gICAgYXNzdXJlLm5vdE51bGwgPSBub3ROdWxsO1xufSkoYXNzdXJlIHx8IChhc3N1cmUgPSB7fSkpO1xuZXhwb3J0IGNsYXNzIFRlc3Qge1xuICAgIGNvbnN0cnVjdG9yKGNhdGVnb3J5LCBuYW1lLCB0ZXN0LCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgPyBvcHRpb25zIDogKG9wdGlvbnMgPSB7fSk7XG4gICAgICAgIChfYSA9IG9wdGlvbnMudGltZW91dCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogKG9wdGlvbnMudGltZW91dCA9IDMwMDAwKTtcbiAgICAgICAgKF9iID0gb3B0aW9ucy51bmhhbmRsZWRFeGNlcHRpb25UaW1lb3V0KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAob3B0aW9ucy51bmhhbmRsZWRFeGNlcHRpb25UaW1lb3V0ID0gMjAwMCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMudGVzdCA9ICgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGdyb2suc2hlbGwubGFzdEVycm9yID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHlpZWxkIHRlc3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoISh5aWVsZCBhc3NlcnROb0Vycm9yKG9wdGlvbnMudW5oYW5kbGVkRXhjZXB0aW9uVGltZW91dCkpKVxuICAgICAgICAgICAgICAgICAgICByZWplY3QoYFVuaGFuZGxlZCBleGNlcHRpb24gZHVyaW5nIHRlc3Q6ICR7Z3Jvay5zaGVsbC5sYXN0RXJyb3J9YCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gdGVzdChuYW1lLCB0ZXN0LCBvcHRpb25zKSB7XG4gICAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgICAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID0ge307XG4gICAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPT0gdW5kZWZpbmVkKVxuICAgICAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLnRlc3RzID0gW107XG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cy5wdXNoKG5ldyBUZXN0KGN1cnJlbnRDYXRlZ29yeSwgbmFtZSwgdGVzdCwgb3B0aW9ucykpO1xufVxuLyoqIEF3YWl0cyBmb3IgYSB3aGlsZSBjaGVja2luZyB0aGUgZXJyb3Igc3RhdHVzIG9mIHRoZSBwbGF0Zm9ybSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vRXJyb3IobXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1zIC8gNTAwOyArK2kpIHtcbiAgICAgICAgICAgIHlpZWxkIGRlbGF5KDUwMCk7XG4gICAgICAgICAgICBpZiAoZ3Jvay5zaGVsbC5sYXN0RXJyb3IubGVuZ3RoICE9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbn1cbi8qKiBUZXN0cyB0d28gb2JqZWN0cyBmb3IgZXF1YWxpdHksIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhleSBhcmUgbm90IGVxdWFsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdChhY3R1YWwsIGV4cGVjdGVkKSB7XG4gICAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpXG4gICAgICAgIHRocm93IGBFeHBlY3RlZCBcIiR7ZXhwZWN0ZWR9XCIsIGdvdCBcIiR7YWN0dWFsfVwiYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RGbG9hdChhY3R1YWwsIGV4cGVjdGVkLCB0b2xlcmFuY2UgPSAwLjAwMSkge1xuICAgIGNvbnN0IGFyZUVxdWFsID0gTWF0aC5hYnMoYWN0dWFsIC0gZXhwZWN0ZWQpIDwgMC4wMDE7XG4gICAgaWYgKCFhcmVFcXVhbClcbiAgICAgICAgdGhyb3cgYEV4cGVjdGVkICR7ZXhwZWN0ZWR9LCBnb3QgJHthY3R1YWx9ICh0b2xlcmFuY2UgPSAke3RvbGVyYW5jZX0pYDtcbn1cbi8qKiBEZWZpbmVzIGEgdGVzdCBzdWl0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeShjYXRlZ29yeSwgdGVzdHMpIHtcbiAgICBjdXJyZW50Q2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgICB0ZXN0cygpO1xufVxuLyoqIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZShiZWZvcmUpIHtcbiAgICBpZiAodGVzdHNbY3VycmVudENhdGVnb3J5XSA9PSB1bmRlZmluZWQpXG4gICAgICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLmJlZm9yZSA9IGJlZm9yZTtcbn1cbi8qKiBEZWZpbmVzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFmdGVyKGFmdGVyKSB7XG4gICAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgICAgICB0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID0ge307XG4gICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5hZnRlciA9IGFmdGVyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJ1blRlc3RzKG9wdGlvbnMpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgICAgICAgICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXRlZ29yeSkgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXRlZ29yeS50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5iZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHZhbHVlLmJlZm9yZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZS5iZWZvcmVTdGF0dXMgPSB4LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdCA9IChfYSA9IHZhbHVlLnRlc3RzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgICAgIGxldCByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKHlpZWxkIGV4ZWNUZXN0KHRbaV0sIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy50ZXN0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZGF0YSA9ICh5aWVsZCBQcm9taXNlLmFsbChyZXMpKS5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5hZnRlcilcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdmFsdWUuYWZ0ZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoICh4KSB7XG4gICAgICAgICAgICAgICAgdmFsdWUuYWZ0ZXJTdGF0dXMgPSB4LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICAgICAgICAgICAgZGF0YS5wdXNoKHsgY2F0ZWdvcnk6IGtleSwgbmFtZTogJ2luaXQnLCByZXN1bHQ6IHZhbHVlLmFmdGVyU3RhdHVzLCBzdWNjZXNzOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5iZWZvcmVTdGF0dXMpXG4gICAgICAgICAgICAgICAgZGF0YS5wdXNoKHsgY2F0ZWdvcnk6IGtleSwgbmFtZTogJ2luaXQnLCByZXN1bHQ6IHZhbHVlLmJlZm9yZVN0YXR1cywgc3VjY2VzczogZmFsc2UgfSk7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goLi4uZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBleGVjVGVzdCh0LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlICE9IHVuZGVmaW5lZCAmJiAoIXQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZGljYXRlLnRvTG93ZXJDYXNlKCkpKSlcbiAgICAgICAgICAgICAgICByID0geyBzdWNjZXNzOiB0cnVlLCByZXN1bHQ6ICdza2lwcGVkJyB9O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHIgPSB7IHN1Y2Nlc3M6IHRydWUsIHJlc3VsdDogKF9hID0geWllbGQgdC50ZXN0KCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICdPSycgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoeCkge1xuICAgICAgICAgICAgciA9IHsgc3VjY2VzczogZmFsc2UsIHJlc3VsdDogeC50b1N0cmluZygpIH07XG4gICAgICAgIH1cbiAgICAgICAgci5jYXRlZ29yeSA9IHQuY2F0ZWdvcnk7XG4gICAgICAgIHIubmFtZSA9IHQubmFtZTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVsYXkobXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICB5aWVsZCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgbXMpKTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWRHVnpkQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6SWpwYkluUmxjM1F1ZEhNaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWpzN096czdPenM3TzBGQlFVRXNUMEZCVHl4TFFVRkxMRWxCUVVrc1RVRkJUU3h0UWtGQmJVSXNRMEZCUXp0QlFVVXhReXhOUVVGTkxFTkJRVU1zU1VGQlNTeExRVUZMTEVkQlFUaEpMRVZCUVVVc1EwRkJRenRCUVVWcVN5eE5RVUZOTEVOQlFVTXNTVUZCU1N4bFFVRjFRaXhEUVVGRE8wRkJSVzVETEUxQlFVMHNTMEZCVnl4TlFVRk5MRU5CVFhSQ08wRkJUa1FzVjBGQmFVSXNUVUZCVFR0SlFVVnlRaXhUUVVGblFpeFBRVUZQTEVOQlFVTXNTMEZCVlN4RlFVRkZMRWxCUVdFN1VVRkRMME1zU1VGQlNTeExRVUZMTEVsQlFVa3NTVUZCU1R0WlFVTm1MRTFCUVUwc1IwRkJSeXhKUVVGSkxFbEJRVWtzU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJReXhEUVVGRExFbEJRVWtzWTBGQll5eERRVUZETzBsQlEzcEVMRU5CUVVNN1NVRklaU3hqUVVGUExGVkJSM1JDTEVOQlFVRTdRVUZEU0N4RFFVRkRMRVZCVG1kQ0xFMUJRVTBzUzBGQlRpeE5RVUZOTEZGQlRYUkNPMEZCVDBRc1RVRkJUU3hQUVVGUExFbEJRVWs3U1VGTlppeFpRVUZaTEZGQlFXZENMRVZCUVVVc1NVRkJXU3hGUVVGRkxFbEJRWGRDTEVWQlFVVXNUMEZCY1VJN08xRkJRM3BHTEVsQlFVa3NRMEZCUXl4UlFVRlJMRWRCUVVjc1VVRkJVU3hEUVVGRE8xRkJRM3BDTEVsQlFVa3NRMEZCUXl4SlFVRkpMRWRCUVVjc1NVRkJTU3hEUVVGRE8xRkJRMnBDTEU5QlFVOHNZVUZCVUN4UFFVRlBMR05CUVZBc1QwRkJUeXhKUVVGUUxFOUJRVThzUjBGQlN5eEZRVUZGTEVWQlFVTTdVVUZEWml4TlFVRkJMRTlCUVU4c1EwRkJReXhQUVVGUExHOURRVUZtTEU5QlFVOHNRMEZCUXl4UFFVRlBMRWRCUVVzc1MwRkJTeXhGUVVGRE8xRkJRekZDTEUxQlFVRXNUMEZCVHl4RFFVRkRMSGxDUVVGNVFpeHZRMEZCYWtNc1QwRkJUeXhEUVVGRExIbENRVUY1UWl4SFFVRkxMRWxCUVVrc1JVRkJRenRSUVVNelF5eEpRVUZKTEVOQlFVTXNUMEZCVHl4SFFVRkhMRTlCUVU4c1EwRkJRenRSUVVOMlFpeEpRVUZKTEVOQlFVTXNTVUZCU1N4SFFVRkhMRWRCUVhWQ0xFVkJRVVU3V1VGRGJrTXNUMEZCVHl4SlFVRkpMRTlCUVU4c1EwRkJReXhEUVVGUExFOUJRVThzUlVGQlJTeE5RVUZOTEVWQlFVVXNSVUZCUlR0blFrRkRNME1zU1VGQlNTeE5RVUZOTEVkQlFVY3NSVUZCUlN4RFFVRkRPMmRDUVVOb1FpeEpRVUZKTzI5Q1FVTkdMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zVTBGQlV5eEhRVUZITEVWQlFVVXNRMEZCUXp0dlFrRkRNVUlzVFVGQlRTeEhRVUZITEUxQlFVMHNTVUZCU1N4RlFVRkZMRU5CUVVNN2FVSkJRM1pDTzJkQ1FVRkRMRTlCUVU4c1EwRkJUU3hGUVVGRk8yOUNRVU5tTEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRwUWtGRFdEdG5Ra0ZEUkN4SlFVRkpMRU5CUVVNc1EwRkJReXhOUVVGTkxHRkJRV0VzUTBGQlF5eFBRVUZSTEVOQlFVTXNlVUpCUVRCQ0xFTkJRVU1zUTBGQlF6dHZRa0ZETjBRc1RVRkJUU3hEUVVGRExHOURRVUZ2UXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExGTkJRVk1zUlVGQlJTeERRVUZETEVOQlFVTTdaMEpCUTNKRkxFOUJRVThzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0WlFVTnNRaXhEUVVGRExFTkJRVUVzUTBGQlF5eERRVUZETzFGQlEwd3NRMEZCUXl4RFFVRkJMRU5CUVVNN1NVRkRTaXhEUVVGRE8wTkJRMFk3UVVGRlJDeE5RVUZOTEZWQlFWVXNTVUZCU1N4RFFVRkRMRWxCUVZrc1JVRkJSU3hKUVVGM1FpeEZRVUZGTEU5QlFYRkNPMGxCUTJoR0xFbEJRVWtzUzBGQlN5eERRVUZETEdWQlFXVXNRMEZCUXl4SlFVRkpMRk5CUVZNN1VVRkRja01zUzBGQlN5eERRVUZETEdWQlFXVXNRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJRenRKUVVNNVFpeEpRVUZKTEV0QlFVc3NRMEZCUXl4bFFVRmxMRU5CUVVNc1EwRkJReXhMUVVGTExFbEJRVWtzVTBGQlV6dFJRVU16UXl4TFFVRkxMRU5CUVVNc1pVRkJaU3hEUVVGRExFTkJRVU1zUzBGQlN5eEhRVUZITEVWQlFVVXNRMEZCUXp0SlFVTndReXhMUVVGTExFTkJRVU1zWlVGQlpTeERRVUZETEVOQlFVTXNTMEZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFbEJRVWtzUTBGQlF5eGxRVUZsTEVWQlFVVXNTVUZCU1N4RlFVRkZMRWxCUVVrc1JVRkJSU3hQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlEzSkdMRU5CUVVNN1FVRkZSQ3h0UlVGQmJVVTdRVUZEYmtVc1RVRkJUU3hWUVVGblFpeGhRVUZoTEVOQlFVTXNSVUZCVlRzN1VVRkROVU1zUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExFVkJRVVVzUjBGQlJ5eEhRVUZITEVWQlFVVXNSVUZCUlN4RFFVRkRMRVZCUVVVN1dVRkRha01zVFVGQlRTeExRVUZMTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1dVRkRha0lzU1VGQlNTeEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRk5CUVZNc1EwRkJReXhOUVVGTkxFdEJRVXNzUTBGQlF6dG5Ra0ZEYmtNc1QwRkJUeXhMUVVGTExFTkJRVU03VTBGRGFFSTdVVUZEUkN4UFFVRlBMRWxCUVVrc1EwRkJRenRKUVVOa0xFTkJRVU03UTBGQlFUdEJRVVZFTEdsR1FVRnBSanRCUVVOcVJpeE5RVUZOTEZWQlFWVXNUVUZCVFN4RFFVRkRMRTFCUVZjc1JVRkJSU3hSUVVGaE8wbEJReTlETEVsQlFVa3NUVUZCVFN4TFFVRkxMRkZCUVZFN1VVRkRja0lzVFVGQlRTeGhRVUZoTEZGQlFWRXNWMEZCVnl4TlFVRk5MRWRCUVVjc1EwRkJRenRCUVVOd1JDeERRVUZETzBGQlJVUXNUVUZCVFN4VlFVRlZMRmRCUVZjc1EwRkJReXhOUVVGakxFVkJRVVVzVVVGQlowSXNSVUZCUlN4VFFVRlRMRWRCUVVjc1MwRkJTenRKUVVNM1JTeE5RVUZOTEZGQlFWRXNSMEZCUnl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFMUJRVTBzUjBGQlJ5eFJRVUZSTEVOQlFVTXNSMEZCUnl4TFFVRkxMRU5CUVVNN1NVRkRja1FzU1VGQlNTeERRVUZETEZGQlFWRTdVVUZEV0N4TlFVRk5MRmxCUVZrc1VVRkJVU3hUUVVGVExFMUJRVTBzYVVKQlFXbENMRk5CUVZNc1IwRkJSeXhEUVVGRE8wRkJRek5GTEVOQlFVTTdRVUZGUkN3MFFrRkJORUk3UVVGRE5VSXNUVUZCVFN4VlFVRlZMRkZCUVZFc1EwRkJReXhSUVVGblFpeEZRVUZGTEV0QlFXbENPMGxCUXpGRUxHVkJRV1VzUjBGQlJ5eFJRVUZSTEVOQlFVTTdTVUZETTBJc1MwRkJTeXhGUVVGRkxFTkJRVU03UVVGRFZpeERRVUZETzBGQlJVUXNkMFpCUVhkR08wRkJRM2hHTEUxQlFVMHNWVUZCVlN4TlFVRk5MRU5CUVVNc1RVRkJNa0k3U1VGRGFFUXNTVUZCU1N4TFFVRkxMRU5CUVVNc1pVRkJaU3hEUVVGRExFbEJRVWtzVTBGQlV6dFJRVU55UXl4TFFVRkxMRU5CUVVNc1pVRkJaU3hEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETzBsQlF6bENMRXRCUVVzc1EwRkJReXhsUVVGbExFTkJRVU1zUTBGQlF5eE5RVUZOTEVkQlFVY3NUVUZCVFN4RFFVRkRPMEZCUTNwRExFTkJRVU03UVVGRlJDeDFSa0ZCZFVZN1FVRkRka1lzVFVGQlRTeFZRVUZWTEV0QlFVc3NRMEZCUXl4TFFVRXdRanRKUVVNNVF5eEpRVUZKTEV0QlFVc3NRMEZCUXl4bFFVRmxMRU5CUVVNc1NVRkJTU3hUUVVGVE8xRkJRM0pETEV0QlFVc3NRMEZCUXl4bFFVRmxMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03U1VGRE9VSXNTMEZCU3l4RFFVRkRMR1ZCUVdVc1EwRkJReXhEUVVGRExFdEJRVXNzUjBGQlJ5eExRVUZMTEVOQlFVTTdRVUZEZGtNc1EwRkJRenRCUVVkRUxFMUJRVTBzVlVGQlowSXNVVUZCVVN4RFFVRkRMRTlCUVRSRE96czdVVUZEZWtVc1NVRkJTU3hQUVVGUExFZEJRVFJGTEVWQlFVVXNRMEZCUXp0UlFVVXhSaXhMUVVGTExFMUJRVTBzUTBGQlF5eEhRVUZITEVWQlFVVXNTMEZCU3l4RFFVRkRMRWxCUVVrc1RVRkJUU3hEUVVGRExFOUJRVThzUTBGQlF5eExRVUZMTEVOQlFVTXNSVUZCUlR0WlFVTm9SQ3hKUVVGSkxFTkJRVUVzVDBGQlR5eGhRVUZRTEU5QlFVOHNkVUpCUVZBc1QwRkJUeXhEUVVGRkxGRkJRVkVzUzBGQlNTeFRRVUZUTEVWQlFVVTdaMEpCUTJ4RExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNWMEZCVnl4RlFVRkZMRU5CUVVNc1ZVRkJWU3hEUVVGRExFOUJRVThzWVVGQlVDeFBRVUZQTEhWQ1FVRlFMRTlCUVU4c1EwRkJSU3hSUVVGUkxFTkJRVU1zVjBGQlZ5eEZRVUZGTEVOQlFVTTdiMEpCUTJoRkxGTkJRVk03WVVGRFdqdFpRVU5FTEVsQlFVazdaMEpCUTBZc1NVRkJTU3hMUVVGTExFTkJRVU1zVFVGQlRUdHZRa0ZEWkN4TlFVRk5MRXRCUVVzc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dGhRVU40UWp0WlFVRkRMRTlCUVU4c1EwRkJUU3hGUVVGRk8yZENRVU5tTEV0QlFVc3NRMEZCUXl4WlFVRlpMRWRCUVVjc1EwRkJReXhEUVVGRExGRkJRVkVzUlVGQlJTeERRVUZETzJGQlEyNURPMWxCUTBRc1NVRkJTU3hEUVVGRExFZEJRVWNzVFVGQlFTeExRVUZMTEVOQlFVTXNTMEZCU3l4dFEwRkJTU3hGUVVGRkxFTkJRVU03V1VGRE1VSXNTVUZCU1N4SFFVRkhMRWRCUVVjc1JVRkJSU3hEUVVGRE8xbEJRMklzUzBGQlNTeEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN1owSkJRMmhETEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRTlCUVU4c1lVRkJVQ3hQUVVGUExIVkNRVUZRTEU5QlFVOHNRMEZCUlN4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRE8yRkJReTlETzFsQlJVUXNTVUZCU1N4SlFVRkpMRWRCUVVjc1EwRkJReXhOUVVGTkxFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhOUVVGTkxFbEJRVWtzVTBGQlV5eERRVUZETEVOQlFVTTdXVUZEZWtVc1NVRkJTVHRuUWtGRFJpeEpRVUZKTEV0QlFVc3NRMEZCUXl4TFFVRkxPMjlDUVVOaUxFMUJRVTBzUzBGQlN5eERRVUZETEV0QlFVc3NSVUZCUlN4RFFVRkRPMkZCUTNaQ08xbEJRVU1zVDBGQlR5eERRVUZOTEVWQlFVVTdaMEpCUTJZc1MwRkJTeXhEUVVGRExGZEJRVmNzUjBGQlJ5eERRVUZETEVOQlFVTXNVVUZCVVN4RlFVRkZMRU5CUVVNN1lVRkRiRU03V1VGRFJDeEpRVUZKTEV0QlFVc3NRMEZCUXl4WFFVRlhPMmRDUVVOdVFpeEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRVZCUVVNc1VVRkJVU3hGUVVGRkxFZEJRVWNzUlVGQlJTeEpRVUZKTEVWQlFVVXNUVUZCVFN4RlFVRkZMRTFCUVUwc1JVRkJSU3hMUVVGTExFTkJRVU1zVjBGQlZ5eEZRVUZGTEU5QlFVOHNSVUZCUlN4TFFVRkxMRVZCUVVNc1EwRkJReXhEUVVGRE8xbEJRM1JHTEVsQlFVa3NTMEZCU3l4RFFVRkRMRmxCUVZrN1owSkJRM0JDTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJReXhSUVVGUkxFVkJRVVVzUjBGQlJ5eEZRVUZGTEVsQlFVa3NSVUZCUlN4TlFVRk5MRVZCUVVVc1RVRkJUU3hGUVVGRkxFdEJRVXNzUTBGQlF5eFpRVUZaTEVWQlFVVXNUMEZCVHl4RlFVRkZMRXRCUVVzc1JVRkJReXhEUVVGRExFTkJRVU03V1VGRGRrWXNUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eERRVUZETzFOQlEzWkNPMUZCUlVRc1QwRkJUeXhQUVVGUExFTkJRVU03TzBOQlEyaENPMEZCUlVRc1UwRkJaU3hSUVVGUkxFTkJRVU1zUTBGQlR5eEZRVUZGTEZOQlFUWkNPenM3VVVGRE5VUXNTVUZCU1N4RFFVRjVSU3hEUVVGRE8xRkJRemxGTEVsQlFVazdXVUZEUml4SlFVRkpMRk5CUVZNc1NVRkJTU3hUUVVGVExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1YwRkJWeXhGUVVGRkxFTkJRVU1zVlVGQlZTeERRVUZETEZOQlFWTXNRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJReXhEUVVGRE8yZENRVU4yUml4RFFVRkRMRWRCUVVjc1JVRkJReXhQUVVGUExFVkJRVVVzU1VGQlNTeEZRVUZGTEUxQlFVMHNSVUZCUlN4VFFVRlRMRVZCUVVNc1EwRkJRenM3WjBKQlJYWkRMRU5CUVVNc1IwRkJSeXhGUVVGRExFOUJRVThzUlVGQlJTeEpRVUZKTEVWQlFVVXNUVUZCVFN4RlFVRkZMRTFCUVVFc1RVRkJUU3hEUVVGRExFTkJRVU1zU1VGQlNTeEZRVUZGTEcxRFFVRkpMRWxCUVVrc1JVRkJReXhEUVVGRE8xTkJRM1pFTzFGQlFVTXNUMEZCVHl4RFFVRk5MRVZCUVVVN1dVRkRaaXhEUVVGRExFZEJRVWNzUlVGQlF5eFBRVUZQTEVWQlFVVXNTMEZCU3l4RlFVRkZMRTFCUVUwc1JVRkJSU3hEUVVGRExFTkJRVU1zVVVGQlVTeEZRVUZGTEVWQlFVTXNRMEZCUXp0VFFVTTFRenRSUVVORUxFTkJRVU1zUTBGQlF5eFJRVUZSTEVkQlFVY3NRMEZCUXl4RFFVRkRMRkZCUVZFc1EwRkJRenRSUVVONFFpeERRVUZETEVOQlFVTXNTVUZCU1N4SFFVRkhMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU03VVVGRGFFSXNUMEZCVHl4RFFVRkRMRU5CUVVNN08wTkJRMVk3UVVGRlJDeE5RVUZOTEZWQlFXZENMRXRCUVVzc1EwRkJReXhGUVVGVk96dFJRVU53UXl4TlFVRlBMRWxCUVVrc1QwRkJUeXhEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzBsQlF6ZERMRU5CUVVNN1EwRkJRU0lzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0FxSUdGeklHZHliMnNnWm5KdmJTQmNJbVJoZEdGbmNtOXJMV0Z3YVM5bmNtOXJYQ0k3WEc1Y2JtVjRjRzl5ZENCc1pYUWdkR1Z6ZEhNNklIdGJhMlY1T2lCemRISnBibWRkT2lCN2RHVnpkSE0vT2lCVVpYTjBXMTBzSUdKbFptOXlaVDg2SUNncElEMCtJRkJ5YjIxcGMyVThkbTlwWkQ0c0lHRm1kR1Z5UHpvZ0tDa2dQVDRnVUhKdmJXbHpaVHgyYjJsa1Bpd2dZbVZtYjNKbFUzUmhkSFZ6UHpvZ2MzUnlhVzVuTENCaFpuUmxjbE4wWVhSMWN6ODZJSE4wY21sdVozMTlJRDBnZTMwN1hHNWNibVY0Y0c5eWRDQnNaWFFnWTNWeWNtVnVkRU5oZEdWbmIzSjVPaUJ6ZEhKcGJtYzdYRzVjYm1WNGNHOXlkQ0J1WVcxbGMzQmhZMlVnWVhOemRYSmxJSHRjYmx4dUlDQmxlSEJ2Y25RZ1puVnVZM1JwYjI0Z2JtOTBUblZzYkNoMllXeDFaVG9nWVc1NUxDQnVZVzFsUHpvZ2MzUnlhVzVuS1NCN1hHNGdJQ0FnYVdZZ0tIWmhiSFZsSUQwOUlHNTFiR3dwWEc0Z0lDQWdJQ0IwYUhKdmR5QmdKSHR1WVcxbElEMDlJRzUxYkd3Z1B5QW5WbUZzZFdVbklEb2dibUZ0WlgwZ2JtOTBJR1JsWm1sdVpXUmdPMXh1SUNCOVhHNTlYRzVjYm1WNGNHOXlkQ0JwYm5SbGNtWmhZMlVnVkdWemRFOXdkR2x2Ym5NZ2UxeHVJQ0IwYVcxbGIzVjBQeUE2SUc1MWJXSmxjanRjYmlBZ2RXNW9ZVzVrYkdWa1JYaGpaWEIwYVc5dVZHbHRaVzkxZEQ4Z09pQnVkVzFpWlhJN1hHNTlYRzVjYm1WNGNHOXlkQ0JqYkdGemN5QlVaWE4wSUh0Y2JpQWdkR1Z6ZERvZ0tDa2dQVDRnVUhKdmJXbHpaVHhoYm5rK08xeHVJQ0J1WVcxbE9pQnpkSEpwYm1jN1hHNGdJR05oZEdWbmIzSjVPaUJ6ZEhKcGJtYzdYRzRnSUc5d2RHbHZibk0vT2lCVVpYTjBUM0IwYVc5dWN6dGNibHh1SUNCamIyNXpkSEoxWTNSdmNpaGpZWFJsWjI5eWVUb2djM1J5YVc1bkxDQnVZVzFsT2lCemRISnBibWNzSUhSbGMzUTZJQ2dwSUQwK0lGQnliMjFwYzJVOFlXNTVQaXdnYjNCMGFXOXVjejg2SUZSbGMzUlBjSFJwYjI1ektTQjdYRzRnSUNBZ2RHaHBjeTVqWVhSbFoyOXllU0E5SUdOaGRHVm5iM0o1TzF4dUlDQWdJSFJvYVhNdWJtRnRaU0E5SUc1aGJXVTdYRzRnSUNBZ2IzQjBhVzl1Y3lBL1B6MGdlMzA3WEc0Z0lDQWdiM0IwYVc5dWN5NTBhVzFsYjNWMElEOC9QU0F6TURBd01EdGNiaUFnSUNCdmNIUnBiMjV6TG5WdWFHRnVaR3hsWkVWNFkyVndkR2x2YmxScGJXVnZkWFFnUHo4OUlESXdNREE3WEc0Z0lDQWdkR2hwY3k1dmNIUnBiMjV6SUQwZ2IzQjBhVzl1Y3p0Y2JpQWdJQ0IwYUdsekxuUmxjM1FnUFNCaGMzbHVZeUFvS1RvZ1VISnZiV2x6WlR4aGJuaytJRDArSUh0Y2JpQWdJQ0FnSUhKbGRIVnliaUJ1WlhjZ1VISnZiV2x6WlNoaGMzbHVZeUFvY21WemIyeDJaU3dnY21WcVpXTjBLU0E5UGlCN1hHNGdJQ0FnSUNBZ0lHeGxkQ0J5WlhOMWJIUWdQU0FuSnp0Y2JpQWdJQ0FnSUNBZ2RISjVJSHRjYmlBZ0lDQWdJQ0FnSUNCbmNtOXJMbk5vWld4c0xteGhjM1JGY25KdmNpQTlJQ2NuTzF4dUlDQWdJQ0FnSUNBZ0lISmxjM1ZzZENBOUlHRjNZV2wwSUhSbGMzUW9LVHRjYmlBZ0lDQWdJQ0FnZlNCallYUmphQ0FvWlRvZ1lXNTVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2NtVnFaV04wS0dVcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJR2xtSUNnaEtHRjNZV2wwSUdGemMyVnlkRTV2UlhKeWIzSW9iM0IwYVc5dWN5RXVkVzVvWVc1a2JHVmtSWGhqWlhCMGFXOXVWR2x0Wlc5MWRDRXBLU2xjYmlBZ0lDQWdJQ0FnSUNCeVpXcGxZM1FvWUZWdWFHRnVaR3hsWkNCbGVHTmxjSFJwYjI0Z1pIVnlhVzVuSUhSbGMzUTZJQ1I3WjNKdmF5NXphR1ZzYkM1c1lYTjBSWEp5YjNKOVlDazdYRzRnSUNBZ0lDQWdJSEpsYzI5c2RtVW9jbVZ6ZFd4MEtUdGNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lIMDdYRzRnSUgxY2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJSFJsYzNRb2JtRnRaVG9nYzNSeWFXNW5MQ0IwWlhOME9pQW9LU0E5UGlCUWNtOXRhWE5sUEdGdWVUNHNJRzl3ZEdsdmJuTS9PaUJVWlhOMFQzQjBhVzl1Y3lrNklIWnZhV1FnZTF4dUlDQnBaaUFvZEdWemRITmJZM1Z5Y21WdWRFTmhkR1ZuYjNKNVhTQTlQU0IxYm1SbFptbHVaV1FwWEc0Z0lDQWdkR1Z6ZEhOYlkzVnljbVZ1ZEVOaGRHVm5iM0o1WFNBOUlIdDlPMXh1SUNCcFppQW9kR1Z6ZEhOYlkzVnljbVZ1ZEVOaGRHVm5iM0o1WFM1MFpYTjBjeUE5UFNCMWJtUmxabWx1WldRcFhHNGdJQ0FnZEdWemRITmJZM1Z5Y21WdWRFTmhkR1ZuYjNKNVhTNTBaWE4wY3lBOUlGdGRPMXh1SUNCMFpYTjBjMXRqZFhKeVpXNTBRMkYwWldkdmNubGRMblJsYzNSeklTNXdkWE5vS0c1bGR5QlVaWE4wS0dOMWNuSmxiblJEWVhSbFoyOXllU3dnYm1GdFpTd2dkR1Z6ZEN3Z2IzQjBhVzl1Y3lrcE8xeHVmVnh1WEc0dktpb2dRWGRoYVhSeklHWnZjaUJoSUhkb2FXeGxJR05vWldOcmFXNW5JSFJvWlNCbGNuSnZjaUJ6ZEdGMGRYTWdiMllnZEdobElIQnNZWFJtYjNKdElDb3ZYRzVsZUhCdmNuUWdZWE41Ym1NZ1puVnVZM1JwYjI0Z1lYTnpaWEowVG05RmNuSnZjaWh0Y3pvZ2JuVnRZbVZ5S1RvZ1VISnZiV2x6WlR4aWIyOXNaV0Z1UGlCN1hHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnYlhNZ0x5QTFNREE3SUNzcmFTa2dlMXh1SUNBZ0lHRjNZV2wwSUdSbGJHRjVLRFV3TUNrN1hHNGdJQ0FnYVdZZ0tHZHliMnN1YzJobGJHd3ViR0Z6ZEVWeWNtOXlMbXhsYm1kMGFDQWhQVDBnTUNsY2JpQWdJQ0FnSUhKbGRIVnliaUJtWVd4elpUdGNiaUFnZlZ4dUlDQnlaWFIxY200Z2RISjFaVHRjYm4xY2JseHVMeW9xSUZSbGMzUnpJSFIzYnlCdlltcGxZM1J6SUdadmNpQmxjWFZoYkdsMGVTd2dkR2h5YjNkeklHRnVJR1Y0WTJWd2RHbHZiaUJwWmlCMGFHVjVJR0Z5WlNCdWIzUWdaWEYxWVd3dUlDb3ZYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaWGh3WldOMEtHRmpkSFZoYkRvZ1lXNTVMQ0JsZUhCbFkzUmxaRG9nWVc1NUtUb2dkbTlwWkNCN1hHNGdJR2xtSUNoaFkzUjFZV3dnSVQwOUlHVjRjR1ZqZEdWa0tWeHVJQ0FnSUhSb2NtOTNJR0JGZUhCbFkzUmxaQ0JjSWlSN1pYaHdaV04wWldSOVhDSXNJR2R2ZENCY0lpUjdZV04wZFdGc2ZWd2lZRHRjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHVjRjR1ZqZEVac2IyRjBLR0ZqZEhWaGJEb2diblZ0WW1WeUxDQmxlSEJsWTNSbFpEb2diblZ0WW1WeUxDQjBiMnhsY21GdVkyVWdQU0F3TGpBd01TazZJSFp2YVdRZ2UxeHVJQ0JqYjI1emRDQmhjbVZGY1hWaGJDQTlJRTFoZEdndVlXSnpLR0ZqZEhWaGJDQXRJR1Y0Y0dWamRHVmtLU0E4SURBdU1EQXhPMXh1SUNCcFppQW9JV0Z5WlVWeGRXRnNLVnh1SUNBZ0lIUm9jbTkzSUdCRmVIQmxZM1JsWkNBa2UyVjRjR1ZqZEdWa2ZTd2daMjkwSUNSN1lXTjBkV0ZzZlNBb2RHOXNaWEpoYm1ObElEMGdKSHQwYjJ4bGNtRnVZMlY5S1dBN1hHNTlYRzVjYmk4cUtpQkVaV1pwYm1WeklHRWdkR1Z6ZENCemRXbDBaUzRnS2k5Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCallYUmxaMjl5ZVNoallYUmxaMjl5ZVRvZ2MzUnlhVzVuTENCMFpYTjBjem9nS0NrZ1BUNGdkbTlwWkNrNklIWnZhV1FnZTF4dUlDQmpkWEp5Wlc1MFEyRjBaV2R2Y25rZ1BTQmpZWFJsWjI5eWVUdGNiaUFnZEdWemRITW9LVHRjYm4xY2JseHVMeW9xSUVSbFptbHVaWE1nWVNCbWRXNWpkR2x2YmlCMGJ5QmlaU0JsZUdWamRYUmxaQ0JpWldadmNtVWdkR2hsSUhSbGMzUnpJR2x1SUhSb2FYTWdZMkYwWldkdmNua2dZWEpsSUdWNFpXTjFkR1ZrTGlBcUwxeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHSmxabTl5WlNoaVpXWnZjbVU2SUNncElEMCtJRkJ5YjIxcGMyVThkbTlwWkQ0cE9pQjJiMmxrSUh0Y2JpQWdhV1lnS0hSbGMzUnpXMk4xY25KbGJuUkRZWFJsWjI5eWVWMGdQVDBnZFc1a1pXWnBibVZrS1Z4dUlDQWdJSFJsYzNSelcyTjFjbkpsYm5SRFlYUmxaMjl5ZVYwZ1BTQjdmVHRjYmlBZ2RHVnpkSE5iWTNWeWNtVnVkRU5oZEdWbmIzSjVYUzVpWldadmNtVWdQU0JpWldadmNtVTdYRzU5WEc1Y2JpOHFLaUJFWldacGJtVnpJR0VnWm5WdVkzUnBiMjRnZEc4Z1ltVWdaWGhsWTNWMFpXUWdZV1owWlhJZ2RHaGxJSFJsYzNSeklHbHVJSFJvYVhNZ1kyRjBaV2R2Y25rZ1lYSmxJR1Y0WldOMWRHVmtMaUFxTDF4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdGbWRHVnlLR0ZtZEdWeU9pQW9LU0E5UGlCUWNtOXRhWE5sUEhadmFXUStLVG9nZG05cFpDQjdYRzRnSUdsbUlDaDBaWE4wYzF0amRYSnlaVzUwUTJGMFpXZHZjbmxkSUQwOUlIVnVaR1ZtYVc1bFpDbGNiaUFnSUNCMFpYTjBjMXRqZFhKeVpXNTBRMkYwWldkdmNubGRJRDBnZTMwN1hHNGdJSFJsYzNSelcyTjFjbkpsYm5SRFlYUmxaMjl5ZVYwdVlXWjBaWElnUFNCaFpuUmxjanRjYm4xY2JseHVYRzVsZUhCdmNuUWdZWE41Ym1NZ1puVnVZM1JwYjI0Z2NuVnVWR1Z6ZEhNb2IzQjBhVzl1Y3o4NklIdGpZWFJsWjI5eWVUODZJSE4wY21sdVp5d2dkR1Z6ZEQ4NklITjBjbWx1WjMwcElIdGNiaUFnYkdWMElISmxjM1ZzZEhNNklIc2dZMkYwWldkdmNuay9PaUJ6ZEhKcGJtY3NJRzVoYldVL09pQnpkSEpwYm1jc0lITjFZMk5sYzNNNklHSnZiMnhsWVc0c0lISmxjM1ZzZERvZ2MzUnlhVzVuZlZ0ZElEMGdXMTA3WEc1Y2JpQWdabTl5SUNoamIyNXpkQ0JiYTJWNUxDQjJZV3gxWlYwZ2IyWWdUMkpxWldOMExtVnVkSEpwWlhNb2RHVnpkSE1wS1NCN1hHNGdJQ0FnYVdZZ0tHOXdkR2x2Ym5NL0xtTmhkR1ZuYjNKNUlDRTlJSFZ1WkdWbWFXNWxaQ2tnZTF4dUlDQWdJQ0FnYVdZZ0tDRnJaWGt1ZEc5TWIzZGxja05oYzJVb0tTNXpkR0Z5ZEhOWGFYUm9LRzl3ZEdsdmJuTS9MbU5oZEdWbmIzSjVMblJ2VEc5M1pYSkRZWE5sS0NrcEtWeHVJQ0FnSUNBZ0lDQmpiMjUwYVc1MVpUdGNiaUFnSUNCOVhHNGdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lHbG1JQ2gyWVd4MVpTNWlaV1p2Y21VcFhHNGdJQ0FnSUNBZ0lHRjNZV2wwSUhaaGJIVmxMbUpsWm05eVpTZ3BPMXh1SUNBZ0lIMGdZMkYwWTJnZ0tIZzZJR0Z1ZVNrZ2UxeHVJQ0FnSUNBZ2RtRnNkV1V1WW1WbWIzSmxVM1JoZEhWeklEMGdlQzUwYjFOMGNtbHVaeWdwTzF4dUlDQWdJSDFjYmlBZ0lDQnNaWFFnZENBOUlIWmhiSFZsTG5SbGMzUnpJRDgvSUZ0ZE8xeHVJQ0FnSUd4bGRDQnlaWE1nUFNCYlhUdGNiaUFnSUNCbWIzSW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2RDNXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJQ0FnY21WekxuQjFjMmdvWVhkaGFYUWdaWGhsWTFSbGMzUW9kRnRwWFN3Z2IzQjBhVzl1Y3o4dWRHVnpkQ2twTzF4dUlDQWdJSDFjYmx4dUlDQWdJR3hsZENCa1lYUmhJRDBnS0dGM1lXbDBJRkJ5YjIxcGMyVXVZV3hzS0hKbGN5a3BMbVpwYkhSbGNpZ29aQ2tnUFQ0Z1pDNXlaWE4xYkhRZ0lUMGdKM05yYVhCd1pXUW5LVHRjYmlBZ0lDQjBjbmtnZTF4dUlDQWdJQ0FnYVdZZ0tIWmhiSFZsTG1GbWRHVnlLVnh1SUNBZ0lDQWdJQ0JoZDJGcGRDQjJZV3gxWlM1aFpuUmxjaWdwTzF4dUlDQWdJSDBnWTJGMFkyZ2dLSGc2SUdGdWVTa2dlMXh1SUNBZ0lDQWdkbUZzZFdVdVlXWjBaWEpUZEdGMGRYTWdQU0I0TG5SdlUzUnlhVzVuS0NrN1hHNGdJQ0FnZlZ4dUlDQWdJR2xtSUNoMllXeDFaUzVoWm5SbGNsTjBZWFIxY3lsY2JpQWdJQ0FnSUdSaGRHRXVjSFZ6YUNoN1kyRjBaV2R2Y25rNklHdGxlU3dnYm1GdFpUb2dKMmx1YVhRbkxDQnlaWE4xYkhRNklIWmhiSFZsTG1GbWRHVnlVM1JoZEhWekxDQnpkV05qWlhOek9pQm1ZV3h6WlgwcE8xeHVJQ0FnSUdsbUlDaDJZV3gxWlM1aVpXWnZjbVZUZEdGMGRYTXBYRzRnSUNBZ0lDQmtZWFJoTG5CMWMyZ29lMk5oZEdWbmIzSjVPaUJyWlhrc0lHNWhiV1U2SUNkcGJtbDBKeXdnY21WemRXeDBPaUIyWVd4MVpTNWlaV1p2Y21WVGRHRjBkWE1zSUhOMVkyTmxjM002SUdaaGJITmxmU2s3WEc0Z0lDQWdjbVZ6ZFd4MGN5NXdkWE5vS0M0dUxtUmhkR0VwTzF4dUlDQjlYRzVjYmlBZ2NtVjBkWEp1SUhKbGMzVnNkSE03WEc1OVhHNWNibUZ6ZVc1aklHWjFibU4wYVc5dUlHVjRaV05VWlhOMEtIUTZJRlJsYzNRc0lIQnlaV1JwWTJGMFpUb2djM1J5YVc1bklId2dkVzVrWldacGJtVmtLU0I3WEc0Z0lHeGxkQ0J5T2lCN0lHTmhkR1ZuYjNKNVB6b2djM1J5YVc1bkxDQnVZVzFsUHpvZ2MzUnlhVzVuTENCemRXTmpaWE56T2lCaWIyOXNaV0Z1TENCeVpYTjFiSFE2SUhOMGNtbHVaeUI5TzF4dUlDQjBjbmtnZTF4dUlDQWdJR2xtSUNod2NtVmthV05oZEdVZ0lUMGdkVzVrWldacGJtVmtJQ1ltSUNnaGRDNXVZVzFsTG5SdlRHOTNaWEpEWVhObEtDa3VjM1JoY25SelYybDBhQ2h3Y21Wa2FXTmhkR1V1ZEc5TWIzZGxja05oYzJVb0tTa3BLVnh1SUNBZ0lDQWdjaUE5SUh0emRXTmpaWE56T2lCMGNuVmxMQ0J5WlhOMWJIUTZJQ2R6YTJsd2NHVmtKMzA3WEc0Z0lDQWdaV3h6WlZ4dUlDQWdJQ0FnY2lBOUlIdHpkV05qWlhOek9pQjBjblZsTENCeVpYTjFiSFE2SUdGM1lXbDBJSFF1ZEdWemRDZ3BJRDgvSUNkUFN5ZDlPMXh1SUNCOUlHTmhkR05vSUNoNE9pQmhibmtwSUh0Y2JpQWdJQ0J5SUQwZ2UzTjFZMk5sYzNNNklHWmhiSE5sTENCeVpYTjFiSFE2SUhndWRHOVRkSEpwYm1jb0tYMDdYRzRnSUgxY2JpQWdjaTVqWVhSbFoyOXllU0E5SUhRdVkyRjBaV2R2Y25rN1hHNGdJSEl1Ym1GdFpTQTlJSFF1Ym1GdFpUdGNiaUFnY21WMGRYSnVJSEk3WEc1OVhHNWNibVY0Y0c5eWRDQmhjM2x1WXlCbWRXNWpkR2x2YmlCa1pXeGhlU2h0Y3pvZ2JuVnRZbVZ5S1NCN1hHNGdJR0YzWVdsMElDQnVaWGNnVUhKdmJXbHpaU2h5SUQwK0lITmxkRlJwYldWdmRYUW9jaXdnYlhNcEtUdGNibjFjYmlKZGZRPT0iLCIvL25hbWU6IGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvQmlvU3ByaW5nXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEROQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBHYXBtZXJzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvQmlvU3ByaW5nKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqRm9yRWRnZXMgPSB7XG4gICAgICAgICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdUJzogJzUqJywgJ0EnOiAnNionLCAnQyc6ICc3KicsICdHJzogJzgqJ1xuICAgIH07XG4gICAgY29uc3Qgb2JqRm9yQ2VudGVyID0ge1xuICAgICAgICAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnVCc6ICdUKicsICdBJzogJ0EqJywgJ0MnOiAnOSonLCAnRyc6ICdHKidcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFR8Q3xHKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICByZXR1cm4gKGNvdW50ID4gNCAmJiBjb3VudCA8IDE1KSA/IG9iakZvckNlbnRlclt4XSA6IG9iakZvckVkZ2VzW3hdO1xuICAgIH0pLnNsaWNlKDAsIChudWNsZW90aWRlcy5lbmRzV2l0aCgnKGludmFiYXNpYyknKSB8fCBudWNsZW90aWRlcy5lbmRzV2l0aCgnKEdhbE5BYy0yLUpOSiknKSkgP1xuICAgICAgICBudWNsZW90aWRlcy5sZW5ndGggOiAyICogY291bnQgKyAxKTtcbn1cbi8vbmFtZTogYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9HY3JzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEROQSBudWNsZW90aWRlc31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBHQ1JTIC8gR2FwbWVyc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzTnVjbGVvdGlkZXNUb0djcnMobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JFZGdlcyA9IHtcbiAgICAgICAgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ1QnOiAnbW9lVW5wcycsXG4gICAgICAgICdBJzogJ21vZUFucHMnLCAnQyc6ICdtb2U1bUNucHMnLCAnRyc6ICdtb2VHbnBzJ1xuICAgIH07XG4gICAgY29uc3Qgb2JqRm9yQ2VudGVyID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQyc6ICc1bUNwcycsICdBJzogJ0FwcycsICdUJzogJ1RwcycsICdHJzogJ0dwcycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxUfEN8RykvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50IDwgNSlcbiAgICAgICAgICAgIHJldHVybiAoY291bnQgPT0gNCkgPyBvYmpGb3JFZGdlc1t4XS5zbGljZSgwLCAtMykgKyAncHMnIDogb2JqRm9yRWRnZXNbeF07XG4gICAgICAgIGlmIChjb3VudCA8IDE1KVxuICAgICAgICAgICAgcmV0dXJuIChjb3VudCA9PSAxNCkgPyBvYmpGb3JDZW50ZXJbeF0uc2xpY2UoMCwgLTIpICsgJ25wcycgOiBvYmpGb3JDZW50ZXJbeF07XG4gICAgICAgIHJldHVybiBvYmpGb3JFZGdlc1t4XTtcbiAgICB9KS5zbGljZSgwLCAobnVjbGVvdGlkZXMuZW5kc1dpdGgoJyhpbnZhYmFzaWMpJykgfHwgbnVjbGVvdGlkZXMuZW5kc1dpdGgoJyhHYWxOQWMtMi1KTkopJykpID9cbiAgICAgICAgbnVjbGVvdGlkZXMubGVuZ3RoIDogLTMpO1xufVxuLy9uYW1lOiBhc29HYXBtZXJzQmlvU3ByaW5nVG9OdWNsZW90aWRlc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBHYXBtZXJzfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEROQSBudWNsZW90aWRlc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzQmlvU3ByaW5nVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJyonOiAnJywgJzUnOiAnVCcsICc2JzogJ0EnLCAnNyc6ICdDJywgJzgnOiAnRycsICc5JzogJ0MnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfFxcKnw1fDZ8N3w4fDkpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBhc29HYXBtZXJzQmlvU3ByaW5nVG9HY3JzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEJpb1NwcmluZyAvIEdhcG1lcnN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogR0NSUyAvIEdhcG1lcnN9XG5leHBvcnQgZnVuY3Rpb24gYXNvR2FwbWVyc0Jpb1NwcmluZ1RvR2NycyhudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJzUqJzogJ21vZVVucHMnLCAnNionOiAnbW9lQW5wcycsICc3Kic6ICdtb2U1bUNucHMnLCAnOConOiAnbW9lR25wcycsICc5Kic6ICc1bUNwcycsICdBKic6ICdBcHMnLCAnVConOiAnVHBzJyxcbiAgICAgICAgJ0cqJzogJ0dwcycsICdDKic6ICdDcHMnLCAnNSc6ICdtb2VVJywgJzYnOiAnbW9lQScsICc3JzogJ21vZTVtQycsICc4JzogJ21vZUcnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfDVcXCp8NlxcKnw3XFwqfDhcXCp8OVxcKnxBXFwqfFRcXCp8R1xcKnxDXFwqfDV8Nnw3fDgpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIHJldHVybiAoY291bnQgPT0gNCkgPyBvYmpbeF0uc2xpY2UoMCwgLTMpICsgJ3BzJyA6IChjb3VudCA9PSAxNCkgPyBvYmpbeF0uc2xpY2UoMCwgLTIpICsgJ25wcycgOiBvYmpbeF07XG4gICAgfSk7XG59XG4vL25hbWU6IGFzb0dhcG1lcnNHY3JzVG9CaW9TcHJpbmdcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSUyAvIEdhcG1lcnN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQmlvU3ByaW5nIC8gR2FwbWVyc31cbmV4cG9ydCBmdW5jdGlvbiBhc29HYXBtZXJzR2Nyc1RvQmlvU3ByaW5nKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnbW9lVCc6ICc1JywgJ21vZUEnOiAnNicsICdtb2U1bUMnOiAnNycsICdtb2VHJzogJzgnLCAnbW9lVSc6ICc1JywgJzVtQyc6ICc5JywgJ25wcyc6ICcqJywgJ3BzJzogJyonLCAnVSc6ICdUJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxtb2VUfG1vZUF8bW9lNW1DfG1vZUd8bW9lVXw1bUN8bnBzfHBzfFUpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBhc29HYXBtZXJzR2Nyc1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSUyAvIEdhcG1lcnN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogRE5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIGFzb0dhcG1lcnNHY3JzVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ21vZSc6ICcnLCAnNW0nOiAnJywgJ24nOiAnJywgJ3BzJzogJycsICdVJzogJ1QnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfG1vZXw1bXxufHBzfFUpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUJpb1NwcmluZ1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQmlvU3ByaW5nIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hQmlvU3ByaW5nVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJzEnOiAnVScsICcyJzogJ0EnLCAnMyc6ICdDJywgJzQnOiAnRycsICc1JzogJ1UnLCAnNic6ICdBJywgJzcnOiAnQycsICc4JzogJ0cnLCAnKic6ICcnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfDF8MnwzfDR8NXw2fDd8OHxcXCopL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUJpb1NwcmluZ1RvQXhvbGFic1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBBeG9sYWJzIC8gc2lSTkF9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFCaW9TcHJpbmdUb0F4b2xhYnMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICcxJzogJ1VmJywgJzInOiAnQWYnLCAnMyc6ICdDZicsICc0JzogJ0dmJywgJzUnOiAndScsICc2JzogJ2EnLCAnNyc6ICdjJywgJzgnOiAnZycsICcqJzogJ3MnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfDF8MnwzfDR8NXw2fDd8OHxcXCopL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUJpb1NwcmluZ1RvR2Nyc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBHQ1JTfVxuZXhwb3J0IGZ1bmN0aW9uIHNpUm5hQmlvU3ByaW5nVG9HY3JzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnMSc6ICdmVScsICcyJzogJ2ZBJywgJzMnOiAnZkMnLCAnNCc6ICdmRycsICc1JzogJ21VJywgJzYnOiAnbUEnLCAnNyc6ICdtQycsICc4JzogJ21HJywgJyonOiAncHMnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfDF8MnwzfDR8NXw2fDd8OHxcXCopL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUF4b2xhYnNUb0djcnNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQXhvbGFicyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEdDUlN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFBeG9sYWJzVG9HY3JzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnVWYnOiAnZlUnLCAnQWYnOiAnZkEnLCAnQ2YnOiAnZkMnLCAnR2YnOiAnZkcnLCAndSc6ICdtVScsICdhJzogJ21BJywgJ2MnOiAnbUMnLCAnZyc6ICdtRycsICdzJzogJ3BzJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxVZnxBZnxDZnxHZnx1fGF8Y3xnfHMpL2csIGZ1bmN0aW9uICh4KSB7IHJldHVybiBvYmpbeF07IH0pO1xufVxuLy9uYW1lOiBzaVJuYUF4b2xhYnNUb0Jpb1NwcmluZ1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBBeG9sYWJzIC8gc2lSTkF9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQmlvU3ByaW5nIC8gc2lSTkF9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFBeG9sYWJzVG9CaW9TcHJpbmcobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdVZic6ICcxJywgJ0FmJzogJzInLCAnQ2YnOiAnMycsICdHZic6ICc0JywgJ3UnOiAnNScsICdhJzogJzYnLCAnYyc6ICc3JywgJ2cnOiAnOCcsICdzJzogJyonLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfFVmfEFmfENmfEdmfHV8YXxjfGd8cykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hQXhvbGFic1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogQXhvbGFicyAvIHNpUk5BfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IFJOQSBudWNsZW90aWRlc31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUF4b2xhYnNUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnVWYnOiAnVScsICdBZic6ICdBJywgJ0NmJzogJ0MnLCAnR2YnOiAnRycsICd1JzogJ1UnLCAnYSc6ICdBJywgJ2MnOiAnQycsICdnJzogJ0cnLCAncyc6ICcnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfFVmfEFmfENmfEdmfHV8YXxjfGd8cykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXNcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSU31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFHY3JzVG9OdWNsZW90aWRlcyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ2ZVJzogJ1UnLCAnZkEnOiAnQScsICdmQyc6ICdDJywgJ2ZHJzogJ0cnLCAnbVUnOiAnVScsICdtQSc6ICdBJywgJ21DJzogJ0MnLCAnbUcnOiAnRycsICdwcyc6ICcnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfGZVfGZBfGZDfGZHfG1VfG1BfG1DfG1HfHBzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFHY3JzVG9CaW9TcHJpbmdcbi8vaW5wdXQ6IHN0cmluZyBudWNsZW90aWRlcyB7c2VtVHlwZTogR0NSU31cbi8vb3V0cHV0OiBzdHJpbmcgcmVzdWx0IHtzZW1UeXBlOiBCaW9TcHJpbmcgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUdjcnNUb0Jpb1NwcmluZyhudWNsZW90aWRlcykge1xuICAgIGNvbnN0IG9iaiA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJywgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJyxcbiAgICAgICAgJ2ZVJzogJzEnLCAnZkEnOiAnMicsICdmQyc6ICczJywgJ2ZHJzogJzQnLCAnbVUnOiAnNScsICdtQSc6ICc2JywgJ21DJzogJzcnLCAnbUcnOiAnOCcsICdwcyc6ICcqJyxcbiAgICB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxmVXxmQXxmQ3xmR3xtVXxtQXxtQ3xtR3xwcykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IHNpUm5hR2Nyc1RvQXhvbGFic1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IEF4b2xhYnMgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYUdjcnNUb0F4b2xhYnMobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdmVSc6ICdVZicsICdmQSc6ICdBZicsICdmQyc6ICdDZicsICdmRyc6ICdHZicsICdtVSc6ICd1JywgJ21BJzogJ2EnLCAnbUMnOiAnYycsICdtRyc6ICdnJywgJ3BzJzogJ3MnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfGZVfGZBfGZDfGZHfG1VfG1BfG1DfG1HfHBzKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbi8vbmFtZTogc2lSbmFOdWNsZW90aWRlVG9CaW9TcHJpbmdTZW5zZVN0cmFuZFxuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQmlvU3ByaW5nIC8gc2lSTkF9XG5leHBvcnQgZnVuY3Rpb24gc2lSbmFOdWNsZW90aWRlVG9CaW9TcHJpbmdTZW5zZVN0cmFuZChudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvckxlZnRFZGdlID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICc2KicsICdVJzogJzUqJywgJ0cnOiAnOConLCAnQyc6ICc3KicgfTtcbiAgICBjb25zdCBvYmpGb3JSaWdodEVkZ2UgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJyo2JywgJ1UnOiAnKjUnLCAnRyc6ICcqOCcsICdDJzogJyo3JyB9O1xuICAgIGNvbnN0IG9iakZvck9kZEluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJzYnLCAnVSc6ICc1JywgJ0cnOiAnOCcsICdDJzogJzcnIH07XG4gICAgY29uc3Qgb2JqRm9yRXZlbkluZGljZXMgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJzInLCAnVSc6ICcxJywgJ0cnOiAnNCcsICdDJzogJzMnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VXxHfEMpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGlmIChjb3VudCA8IDIpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yTGVmdEVkZ2VbeF07XG4gICAgICAgIGlmIChjb3VudCA+IG51Y2xlb3RpZGVzLmxlbmd0aCAtIDMpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yUmlnaHRFZGdlW3hdO1xuICAgICAgICByZXR1cm4gKGNvdW50ICUgMiA9PSAwKSA/IG9iakZvckV2ZW5JbmRpY2VzW3hdIDogb2JqRm9yT2RkSW5kaWNlc1t4XTtcbiAgICB9KTtcbn1cbi8vbmFtZTogc2lSbmFOdWNsZW90aWRlc1RvR2Nyc1xuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogR0NSU31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYU51Y2xlb3RpZGVzVG9HY3JzKG51Y2xlb3RpZGVzKSB7XG4gICAgbGV0IGNvdW50ID0gLTE7XG4gICAgY29uc3Qgb2JqRm9yTGVmdEVkZ2UgPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdBJzogJ21BcHMnLCAnVSc6ICdtVXBzJywgJ0cnOiAnbUdwcycsICdDJzogJ21DcHMnIH07XG4gICAgY29uc3Qgb2JqRm9yUmlnaHRFZGdlID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICdwc21BJywgJ1UnOiAncHNtVScsICdHJzogJ3BzbUcnLCAnQyc6ICdwc21DJyB9O1xuICAgIGNvbnN0IG9iakZvckV2ZW5JbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdmQScsICdVJzogJ2ZVJywgJ0cnOiAnZkcnLCAnQyc6ICdmQycgfTtcbiAgICBjb25zdCBvYmpGb3JPZGRJbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdtQScsICdVJzogJ21VJywgJ0cnOiAnbUcnLCAnQyc6ICdtQycgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8QXxVfEd8QykvZywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50IDwgMilcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JMZWZ0RWRnZVt4XTtcbiAgICAgICAgaWYgKGNvdW50ID4gbnVjbGVvdGlkZXMubGVuZ3RoIC0gMylcbiAgICAgICAgICAgIHJldHVybiBvYmpGb3JSaWdodEVkZ2VbeF07XG4gICAgICAgIHJldHVybiAoY291bnQgJSAyID09IDApID8gb2JqRm9yRXZlbkluZGljZXNbeF0gOiBvYmpGb3JPZGRJbmRpY2VzW3hdO1xuICAgIH0pO1xufVxuLy9uYW1lOiBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNTZW5zZVN0cmFuZFxuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQXhvbGFic31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNTZW5zZVN0cmFuZChudWNsZW90aWRlcykge1xuICAgIGxldCBjb3VudCA9IC0xO1xuICAgIGNvbnN0IG9iakZvckxlZnRFZGdlID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICdhcycsICdVJzogJ3VzJywgJ0cnOiAnZ3MnLCAnQyc6ICdjcycgfTtcbiAgICBjb25zdCBvYmpGb3JTb21lSW5kaWNlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnQWYnLCAnVSc6ICdVZicsICdHJzogJ0dmJywgJ0MnOiAnQ2YnIH07XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnQSc6ICdhJywgJ1UnOiAndScsICdHJzogJ2cnLCAnQyc6ICdjJyB9O1xuICAgIHJldHVybiBudWNsZW90aWRlcy5yZXBsYWNlKC8oXFwoaW52YWJhc2ljXFwpfFxcKEdhbE5BYy0yLUpOSlxcKXxBfFV8R3xDKS9nLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICBjb3VudCsrO1xuICAgICAgICBpZiAoY291bnQgPCAyKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvckxlZnRFZGdlW3hdO1xuICAgICAgICBpZiAoY291bnQgPT0gNiB8fCAoY291bnQgPiA3ICYmIGNvdW50IDwgMTEpKVxuICAgICAgICAgICAgcmV0dXJuIG9iakZvclNvbWVJbmRpY2VzW3hdO1xuICAgICAgICBpZiAoY291bnQgPT0gbnVjbGVvdGlkZXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgIHJldHVybiAnYSc7XG4gICAgICAgIHJldHVybiBvYmpbeF07XG4gICAgfSk7XG59XG4vL25hbWU6IHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic0FudGlzZW5zZVN0cmFuZFxuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBSTkEgbnVjbGVvdGlkZXN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogQXhvbGFic31cbmV4cG9ydCBmdW5jdGlvbiBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNBbnRpc2Vuc2VTdHJhbmQobnVjbGVvdGlkZXMpIHtcbiAgICBsZXQgY291bnQgPSAtMTtcbiAgICBjb25zdCBvYmpGb3JTbWFsbExpbmthZ2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdhcycsICdVJzogJ3VzJywgJ0cnOiAnZ3MnLCAnQyc6ICdjcycgfTtcbiAgICBjb25zdCBvYmpGb3JCaWdMaW5rYWdlcyA9IHsgJyhpbnZhYmFzaWMpJzogJyhpbnZhYmFzaWMpJyxcbiAgICAgICAgJyhHYWxOQWMtMi1KTkopJzogJyhHYWxOQWMtMi1KTkopJywgJ0EnOiAnQWZzJywgJ1UnOiAnVWZzJywgJ0cnOiAnR2ZzJywgJ0MnOiAnQ2ZzJyB9O1xuICAgIGNvbnN0IG9iakZvclNvbWVJbmRpY2VzID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLFxuICAgICAgICAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLCAnQSc6ICdBZicsICdVJzogJ1VmJywgJ0cnOiAnR2YnLCAnQyc6ICdDZicgfTtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsXG4gICAgICAgICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsICdBJzogJ2EnLCAnVSc6ICd1JywgJ0cnOiAnZycsICdDJzogJ2MnIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfEF8VXxHfEMpL2csIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGlmIChjb3VudCA+IDE5ICYmIGNvdW50IDwgMjIpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yU21hbGxMaW5rYWdlc1t4XTtcbiAgICAgICAgaWYgKGNvdW50ID09IDApXG4gICAgICAgICAgICByZXR1cm4gJ3VzJztcbiAgICAgICAgaWYgKGNvdW50ID09IDEpXG4gICAgICAgICAgICByZXR1cm4gb2JqRm9yQmlnTGlua2FnZXNbeF07XG4gICAgICAgIHJldHVybiAoY291bnQgPT0gNSB8fCBjb3VudCA9PSA3IHx8IGNvdW50ID09IDggfHwgY291bnQgPT0gMTMgfHwgY291bnQgPT0gMTUpID8gb2JqRm9yU29tZUluZGljZXNbeF0gOiBvYmpbeF07XG4gICAgfSk7XG59XG4vL25hbWU6IGdjcnNUb051Y2xlb3RpZGVzXG4vL2lucHV0OiBzdHJpbmcgbnVjbGVvdGlkZXMge3NlbVR5cGU6IEdDUlN9XG4vL291dHB1dDogc3RyaW5nIHJlc3VsdCB7c2VtVHlwZTogUk5BIG51Y2xlb3RpZGVzfVxuZXhwb3J0IGZ1bmN0aW9uIGdjcnNUb051Y2xlb3RpZGVzKG51Y2xlb3RpZGVzKSB7XG4gICAgY29uc3Qgb2JqID0geyAnKGludmFiYXNpYyknOiAnKGludmFiYXNpYyknLCAnKEdhbE5BYy0yLUpOSiknOiAnKEdhbE5BYy0yLUpOSiknLFxuICAgICAgICAnbUFwcyc6ICdBJywgJ21VcHMnOiAnVScsICdtR3BzJzogJ0cnLCAnbUNwcyc6ICdDJywgJ2ZBcHMnOiAnQScsICdmVXBzJzogJ1UnLCAnZkdwcyc6ICdHJywgJ2ZDcHMnOiAnQycsXG4gICAgICAgICdmVSc6ICdVJywgJ2ZBJzogJ0EnLCAnZkMnOiAnQycsICdmRyc6ICdHJywgJ21VJzogJ1UnLCAnbUEnOiAnQScsICdtQyc6ICdDJywgJ21HJzogJ0cnLFxuICAgIH07XG4gICAgcmV0dXJuIG51Y2xlb3RpZGVzLnJlcGxhY2UoLyhcXChpbnZhYmFzaWNcXCl8XFwoR2FsTkFjLTItSk5KXFwpfG1BcHN8bVVwc3xtR3BzfG1DcHN8ZkFwc3xmVXBzfGZHcHN8ZkNwc3xmVXxmQXxmQ3xmR3xtVXxtQXxtQ3xtRykvZywgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIG9ialt4XTsgfSk7XG59XG4vL25hbWU6IGdjcnNUb01lcm1hZGUxMlxuLy9pbnB1dDogc3RyaW5nIG51Y2xlb3RpZGVzIHtzZW1UeXBlOiBHQ1JTfVxuLy9vdXRwdXQ6IHN0cmluZyByZXN1bHQge3NlbVR5cGU6IE1lcm1hZGUgMTIgLyBzaVJOQX1cbmV4cG9ydCBmdW5jdGlvbiBnY3JzVG9NZXJtYWRlMTIobnVjbGVvdGlkZXMpIHtcbiAgICBjb25zdCBvYmogPSB7ICcoaW52YWJhc2ljKSc6ICcoaW52YWJhc2ljKScsICcoR2FsTkFjLTItSk5KKSc6ICcoR2FsTkFjLTItSk5KKScsXG4gICAgICAgICdtQXBzJzogJ2UnLCAnbVVwcyc6ICdoJywgJ21HcHMnOiAnZycsICdtQ3BzJzogJ2YnLCAnZkFwcyc6ICdpJywgJ2ZVcHMnOiAnbCcsICdmR3BzJzogJ2snLCAnZkNwcyc6ICdqJywgJ2ZVJzogJ0wnLFxuICAgICAgICAnZkEnOiAnSScsICdmQyc6ICdKJywgJ2ZHJzogJ0snLCAnbVUnOiAnSCcsICdtQSc6ICdFJywgJ21DJzogJ0YnLCAnbUcnOiAnRycsXG4gICAgfTtcbiAgICByZXR1cm4gbnVjbGVvdGlkZXMucmVwbGFjZSgvKFxcKGludmFiYXNpY1xcKXxcXChHYWxOQWMtMi1KTkpcXCl8bUFwc3xtVXBzfG1HcHN8bUNwc3xmQXBzfGZVcHN8Zkdwc3xmQ3BzfGZVfGZBfGZDfGZHfG1VfG1BfG1DfG1HKS9nLCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gb2JqW3hdOyB9KTtcbn1cbiIsImltcG9ydCB7IG1hcCwgc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXMsIFNZTlRIRVNJWkVSUywgVEVDSE5PTE9HSUVTLCBNT0RJRklDQVRJT05TIH0gZnJvbSAnLi9tYXAnO1xuaW1wb3J0IHsgaXNWYWxpZFNlcXVlbmNlIH0gZnJvbSAnLi9zZXF1ZW5jZS1jb2Rlcy10b29scyc7XG5pbXBvcnQgeyBnZXROdWNsZW90aWRlc01vbCB9IGZyb20gJy4vbW9sLXRyYW5zZm9ybWF0aW9ucyc7XG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VUb01vbFYzMDAwKHNlcXVlbmNlLCBpbnZlcnRlZCA9IGZhbHNlLCBvY2xSZW5kZXIgPSBmYWxzZSkge1xuICAgIGNvbnN0IG9iaiA9IGdldE9iamVjdFdpdGhDb2Rlc0FuZFNtaWxlcyhzZXF1ZW5jZSk7XG4gICAgbGV0IGNvZGVzID0gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoT2JqZWN0LmtleXMob2JqKSk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IHNtaWxlc0NvZGVzID0gW107XG4gICAgY29uc3QgY29kZXNMaXN0ID0gW107XG4gICAgY29uc3QgbGlua3MgPSBbJ3MnLCAncHMnLCAnKiddO1xuICAgIGNvbnN0IGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeSA9IFsnZScsICdoJywgLyonZycsKi8gJ2YnLCAnaScsICdsJywgJ2snLCAnaiddO1xuICAgIGNvbnN0IGRyb3Bkb3ducyA9IE9iamVjdC5rZXlzKE1PRElGSUNBVElPTlMpO1xuICAgIGNvZGVzID0gY29kZXMuY29uY2F0KGRyb3Bkb3ducyk7XG4gICAgd2hpbGUgKGkgPCBzZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGNvZGVzLmZpbmQoKHMpID0+IHMgPT0gc2VxdWVuY2Uuc2xpY2UoaSwgaSArIHMubGVuZ3RoKSk7XG4gICAgICAgIGkgKz0gY29kZS5sZW5ndGg7XG4gICAgICAgIGludmVydGVkID8gY29kZXNMaXN0LnVuc2hpZnQoY29kZSkgOiBjb2Rlc0xpc3QucHVzaChjb2RlKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGRyb3Bkb3ducy5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pKSB7XG4gICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKChpID49IGNvZGVzTGlzdC5sZW5ndGggLyAyKSA/XG4gICAgICAgICAgICAgICAgTU9ESUZJQ0FUSU9OU1tjb2Rlc0xpc3RbaV1dLnJpZ2h0IDogTU9ESUZJQ0FUSU9OU1tjb2Rlc0xpc3RbaV1dLmxlZnQpO1xuICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaChzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAobGlua3MuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSB8fFxuICAgICAgICAgICAgICAgIGluY2x1ZGVzU3RhbmRhcmRMaW5rQWxyZWFkeS5pbmNsdWRlcyhjb2Rlc0xpc3RbaV0pIHx8XG4gICAgICAgICAgICAgICAgKGkgPCBjb2Rlc0xpc3QubGVuZ3RoIC0gMSAmJiBsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbaSArIDFdKSkpXG4gICAgICAgICAgICAgICAgc21pbGVzQ29kZXMucHVzaChvYmpbY29kZXNMaXN0W2ldXSk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKG9ialtjb2Rlc0xpc3RbaV1dKTtcbiAgICAgICAgICAgICAgICBzbWlsZXNDb2Rlcy5wdXNoKHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0TnVjbGVvdGlkZXNNb2woc21pbGVzQ29kZXMsIG9jbFJlbmRlcik7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2VUb1NtaWxlcyhzZXF1ZW5jZSwgaW52ZXJ0ZWQgPSBmYWxzZSkge1xuICAgIGNvbnN0IG9iaiA9IGdldE9iamVjdFdpdGhDb2Rlc0FuZFNtaWxlcyhzZXF1ZW5jZSk7XG4gICAgbGV0IGNvZGVzID0gc29ydEJ5U3RyaW5nTGVuZ3RoSW5EZXNjZW5kaW5nT3JkZXIoT2JqZWN0LmtleXMob2JqKSk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBzbWlsZXMgPSAnJztcbiAgICBjb25zdCBjb2Rlc0xpc3QgPSBbXTtcbiAgICBjb25zdCBsaW5rcyA9IFsncycsICdwcycsICcqJ107XG4gICAgY29uc3QgaW5jbHVkZXNTdGFuZGFyZExpbmtBbHJlYWR5ID0gWydlJywgJ2gnLCAvKidnJywqLyAnZicsICdpJywgJ2wnLCAnaycsICdqJ107XG4gICAgY29uc3QgZHJvcGRvd25zID0gT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUyk7XG4gICAgY29kZXMgPSBjb2Rlcy5jb25jYXQoZHJvcGRvd25zKTtcbiAgICB3aGlsZSAoaSA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjb2RlID0gY29kZXMuZmluZCgocykgPT4gcyA9PSBzZXF1ZW5jZS5zbGljZShpLCBpICsgcy5sZW5ndGgpKTtcbiAgICAgICAgaSArPSBjb2RlLmxlbmd0aDtcbiAgICAgICAgaW52ZXJ0ZWQgPyBjb2Rlc0xpc3QudW5zaGlmdChjb2RlKSA6IGNvZGVzTGlzdC5wdXNoKGNvZGUpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZHJvcGRvd25zLmluY2x1ZGVzKGNvZGVzTGlzdFtpXSkpIHtcbiAgICAgICAgICAgIHNtaWxlcyArPSAoaSA+PSBjb2Rlc0xpc3QubGVuZ3RoIC8gMikgP1xuICAgICAgICAgICAgICAgIE1PRElGSUNBVElPTlNbY29kZXNMaXN0W2ldXS5yaWdodCArIHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzIDpcbiAgICAgICAgICAgICAgICBNT0RJRklDQVRJT05TW2NvZGVzTGlzdFtpXV0ubGVmdCArIHN0YWRhcmRQaG9zcGhhdGVMaW5rU21pbGVzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGxpbmtzLmluY2x1ZGVzKGNvZGVzTGlzdFtpXSkgfHxcbiAgICAgICAgICAgICAgICBpbmNsdWRlc1N0YW5kYXJkTGlua0FscmVhZHkuaW5jbHVkZXMoY29kZXNMaXN0W2ldKSB8fFxuICAgICAgICAgICAgICAgIChpIDwgY29kZXNMaXN0Lmxlbmd0aCAtIDEgJiYgbGlua3MuaW5jbHVkZXMoY29kZXNMaXN0W2kgKyAxXSkpKVxuICAgICAgICAgICAgICAgIHNtaWxlcyArPSBvYmpbY29kZXNMaXN0W2ldXTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzbWlsZXMgKz0gb2JqW2NvZGVzTGlzdFtpXV0gKyBzdGFkYXJkUGhvc3BoYXRlTGlua1NtaWxlcztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzbWlsZXMgPSBzbWlsZXMucmVwbGFjZSgvT08vZywgJ08nKTtcbiAgICByZXR1cm4gKChsaW5rcy5pbmNsdWRlcyhjb2Rlc0xpc3RbY29kZXNMaXN0Lmxlbmd0aCAtIDFdKSAmJlxuICAgICAgICBjb2Rlc0xpc3QubGVuZ3RoID4gMSAmJlxuICAgICAgICAhaW5jbHVkZXNTdGFuZGFyZExpbmtBbHJlYWR5LmluY2x1ZGVzKGNvZGVzTGlzdFtjb2Rlc0xpc3QubGVuZ3RoIC0gMl0pKSB8fFxuICAgICAgICBkcm9wZG93bnMuaW5jbHVkZXMoY29kZXNMaXN0W2NvZGVzTGlzdC5sZW5ndGggLSAxXSkgfHxcbiAgICAgICAgaW5jbHVkZXNTdGFuZGFyZExpbmtBbHJlYWR5LmluY2x1ZGVzKGNvZGVzTGlzdFtjb2Rlc0xpc3QubGVuZ3RoIC0gMV0pKSA/XG4gICAgICAgIHNtaWxlcyA6XG4gICAgICAgIHNtaWxlcy5zbGljZSgwLCBzbWlsZXMubGVuZ3RoIC0gc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXMubGVuZ3RoICsgMSk7XG59XG5mdW5jdGlvbiBnZXRPYmplY3RXaXRoQ29kZXNBbmRTbWlsZXMoc2VxdWVuY2UpIHtcbiAgICBjb25zdCBvYmogPSB7fTtcbiAgICBmb3IgKGNvbnN0IHN5bnRoZXNpemVyIG9mIE9iamVjdC5rZXlzKG1hcCkpIHtcbiAgICAgICAgZm9yIChjb25zdCB0ZWNobm9sb2d5IG9mIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl0pKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XSkpXG4gICAgICAgICAgICAgICAgb2JqW2NvZGVdID0gbWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XVtjb2RlXS5TTUlMRVM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVE9ETzogY3JlYXRlIG9iamVjdCBiYXNlZCBmcm9tIHN5bnRoZXNpemVyIHR5cGUgdG8gYXZvaWQga2V5KGNvZGVzKSBkdXBsaWNhdGVzXG4gICAgY29uc3Qgb3V0cHV0ID0gaXNWYWxpZFNlcXVlbmNlKHNlcXVlbmNlKTtcbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyID09IFNZTlRIRVNJWkVSUy5NRVJNQURFXzEyKVxuICAgICAgICBvYmpbJ2cnXSA9IG1hcFtTWU5USEVTSVpFUlMuTUVSTUFERV8xMl1bVEVDSE5PTE9HSUVTLlNJX1JOQV1bJ2cnXS5TTUlMRVM7XG4gICAgZWxzZSBpZiAob3V0cHV0LnN5bnRoZXNpemVyID09IFNZTlRIRVNJWkVSUy5BWE9MQUJTKVxuICAgICAgICBvYmpbJ2cnXSA9IG1hcFtTWU5USEVTSVpFUlMuQVhPTEFCU11bVEVDSE5PTE9HSUVTLlNJX1JOQV1bJ2cnXS5TTUlMRVM7XG4gICAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIHNvcnRCeVN0cmluZ0xlbmd0aEluRGVzY2VuZGluZ09yZGVyKGFycmF5KSB7XG4gICAgcmV0dXJuIGFycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7IH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IFNZTlRIRVNJWkVSUyA9IHtcbiAgICBSQVdfTlVDTEVPVElERVM6ICdSYXcgTnVjbGVvdGlkZXMnLFxuICAgIEJJT1NQUklORzogJ0Jpb1NwcmluZyBDb2RlcycsXG4gICAgR0NSUzogJ0phbnNzZW4gR0NSUyBDb2RlcycsXG4gICAgQVhPTEFCUzogJ0F4b2xhYnMgQ29kZXMnLFxuICAgIE1FUk1BREVfMTI6ICdNZXJtYWRlIDEyJyxcbn07XG5leHBvcnQgY29uc3QgVEVDSE5PTE9HSUVTID0ge1xuICAgIEROQTogJ0ROQScsXG4gICAgUk5BOiAnUk5BJyxcbiAgICBBU09fR0FQTUVSUzogJ0ZvciBBU08gR2FwbWVycycsXG4gICAgU0lfUk5BOiAnRm9yIDJcXCctT01lIGFuZCAyXFwnLUYgbW9kaWZpZWQgc2lSTkEnLFxufTtcbmV4cG9ydCBjb25zdCBDT0xfTkFNRVMgPSB7XG4gICAgQ0hFTUlTVFJZOiAnQ2hlbWlzdHJ5JyxcbiAgICBOVU1CRVI6ICdOdW1iZXInLFxuICAgIFRZUEU6ICdUeXBlJyxcbiAgICBDSEVNSVNUUllfTkFNRTogJ0NoZW1pc3RyeSBOYW1lJyxcbiAgICBJTlRFUk5BTF9DT01QT1VORF9JRDogJ0ludGVybmFsIGNvbXBvdW5kIElEJyxcbiAgICBJRFA6ICdJRFAnLFxuICAgIFNFUVVFTkNFOiAnU2VxdWVuY2UnLFxuICAgIENPTVBPVU5EX05BTUU6ICdDb21wb3VuZCBOYW1lJyxcbiAgICBDT01QT1VORF9DT01NRU5UUzogJ0NvbXBvdW5kIENvbW1lbnRzJyxcbiAgICBTQUxUOiAnU2FsdCcsXG4gICAgRVFVSVZBTEVOVFM6ICdFcXVpdmFsZW50cycsXG4gICAgUFVSSVRZOiAnUHVyaXR5JyxcbiAgICBDUERfTVc6ICdDcGQgTVcnLFxuICAgIFNBTFRfTUFTUzogJ1NhbHQgbWFzcycsXG4gICAgQkFUQ0hfTVc6ICdCYXRjaCBNVycsXG4gICAgU09VUkNFOiAnU291cmNlJyxcbiAgICBJQ0Q6ICdJQ0QnLFxuICAgIE9XTkVSOiAnT3duZXInLFxufTtcbi8vIGludGVyZmFjZSBDT0RFUyB7XG4vLyB9XG5leHBvcnQgY29uc3QgTU9ESUZJQ0FUSU9OUyA9IHtcbiAgICAnKGludmFiYXNpYyknOiB7XG4gICAgICAgIG1vbGVjdWxhcldlaWdodDogMTE4LjEzLFxuICAgICAgICBsZWZ0OiAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPJyxcbiAgICAgICAgcmlnaHQ6ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ08nLFxuICAgIH0sXG4gICAgJyhHYWxOQWMtMi1KTkopJzoge1xuICAgICAgICBtb2xlY3VsYXJXZWlnaHQ6IDEyNzMuMyxcbiAgICAgICAgbGVmdDogJ0MoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQylOQyg9TylDQ0NDKD1PKU5DQyhPKUNPJyxcbiAgICAgICAgcmlnaHQ6ICdPQ0MoTylDTkMoPU8pQ0NDQyg9TylOQyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScsXG4gICAgfSxcbn07XG5leHBvcnQgY29uc3Qgc3RhZGFyZFBob3NwaGF0ZUxpbmtTbWlsZXMgPSAnT1AoPU8pKE8pTyc7XG5leHBvcnQgY29uc3QgbWFwID0ge1xuICAgICdSYXcgTnVjbGVvdGlkZXMnOiB7XG4gICAgICAgICdETkEnOiB7XG4gICAgICAgICAgICAnQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzEzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdUJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ1R5cm9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA0LjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZFQnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdSTkEnOiB7XG4gICAgICAgICAgICAnQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzEzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdVJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ1VyYWNpbCcsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNi4xNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyVScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oTylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAnQmlvU3ByaW5nIENvZGVzJzoge1xuICAgICAgICAnRm9yIEFTTyBHYXBtZXJzJzoge1xuICAgICAgICAgICAgJzUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtclUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzguMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnNic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLXJBJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzg3LjI5LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnOCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogNDAzLjI4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzknOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnNS1NZXRoeWwtZEMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDMuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyonOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAncHMgbGlua2FnZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDE2LjA3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzEzLjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdDJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0N5dG9zaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMjg5LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ0d1YW5pbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1QnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVHlyb3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDQuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkVCcsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdGb3IgMlxcJy1PTWUgYW5kIDJcXCctRiBtb2RpZmllZCBzaVJOQSc6IHtcbiAgICAgICAgICAgICcxJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDguMTYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcyJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzEuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzQnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4xOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzYnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc3Jzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnOCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyonOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAncHMgbGlua2FnZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDE2LjA3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAnQXhvbGFicyBDb2Rlcyc6IHtcbiAgICAgICAgJ0ZvciAyXFwnLU9NZSBhbmQgMlxcJy1GIG1vZGlmaWVkIHNpUk5BJzoge1xuICAgICAgICAgICAgJ1VmJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDguMTYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdBZic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1BJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzMxLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdDZic6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1DJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA3LjE4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnR2YnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4xOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2EnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdjJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdzJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ3BzIGxpbmthZ2UnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAxNi4wNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgJ0phbnNzZW4gR0NSUyBDb2Rlcyc6IHtcbiAgICAgICAgJ0ZvciBBU08gR2FwbWVycyc6IHtcbiAgICAgICAgICAgICdtb2VUJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdNT0UtNU1lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc4LjI3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21vZUEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM4Ny4yOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0NDT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtb2U1bUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnKDVtKW1vZUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ01PRS01TWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNzcuMjksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKVtDQEhdKE9DQ09DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbW9lRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnTU9FLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogNDAzLjI4LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQ0NPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJzVtQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICc1LU1ldGh5bC1kQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwMy4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnKDVtKUMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnNS1NZXRoeWwtZEMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDMuMjgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3BzJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJ3BzIGxpbmthZ2UnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAxNi4wNyxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0EnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZEEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQWRlbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMxMy4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdDeXRvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDI4OS4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZEMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAyODkuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnZEMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0cnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZEcnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnR3VhbmluZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyOS4yMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdkRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpQ1tDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdUeXJvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RUJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkVCc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdUeXJvc2luZScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ2RUJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9QyhDKUMoPU8pTkMyKD1PKSlDW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdyQSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZGVuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzI5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnckMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnQ3l0b3NpbmUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDUuMTgsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE8pW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdyRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICdHdWFuaW5lJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzQ1LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnclUnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnVXJhY2lsJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA2LjE3LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdGb3IgMlxcJy1PTWUgYW5kIDJcXCctRiBtb2RpZmllZCBzaVJOQSc6IHtcbiAgICAgICAgICAgICdmVSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnLWZsdW9yby1VJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzA4LjE2LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZkEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzMS4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JBJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZkMnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2ZHJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDcuMTksXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtVSc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJVJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzIwLjIsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbUEnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdtQyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJDJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzE5LjIxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JDJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ21HJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckcnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNTkuMjQsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICAnTWVybWFkZSAxMic6IHtcbiAgICAgICAgJ0ZvciAyXFwnLU9NZSBhbmQgMlxcJy1GIG1vZGlmaWVkIHNpUk5BJzoge1xuICAgICAgICAgICAgJ2UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQS1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM1OS4zMSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdoJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtclUtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzYuMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUylPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHLXBzJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzc1LjMxLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2YnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQy1wcycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMzNS4yOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdpJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNDcuMjcsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckEnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdsJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjQuMjMsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdrJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUctcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzNjMuMjYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckcnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdqJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUMtcHMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMjMuMjUsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdMJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLVUnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMDguMTYsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnclUnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdJJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCctZmx1b3JvLUEnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMzEuMixcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0onOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tQycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMwNy4xOCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0snOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJy1mbHVvcm8tRycsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0Ny4xOSxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyRycsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0gnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yVScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMyMC4yLFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JVJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0UnOiB7XG4gICAgICAgICAgICAgICAgJ25hbWUnOiAnMlxcJ09NZS1yQScsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDM0My4yNCxcbiAgICAgICAgICAgICAgICAnbm9ybWFsaXplZCc6ICdyQScsXG4gICAgICAgICAgICAgICAgJ1NNSUxFUyc6ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdGJzoge1xuICAgICAgICAgICAgICAgICduYW1lJzogJzJcXCdPTWUtckMnLFxuICAgICAgICAgICAgICAgICd3ZWlnaHQnOiAzMTkuMjEsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnOiAnckMnLFxuICAgICAgICAgICAgICAgICdTTUlMRVMnOiAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnRyc6IHtcbiAgICAgICAgICAgICAgICAnbmFtZSc6ICcyXFwnT01lLXJHJyxcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMzU5LjI0LFxuICAgICAgICAgICAgICAgICdub3JtYWxpemVkJzogJ3JHJyxcbiAgICAgICAgICAgICAgICAnU01JTEVTJzogJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuIiwiaW1wb3J0ICogYXMgT0NMIGZyb20gJ29wZW5jaGVtbGliL2Z1bGwuanMnO1xuY29uc3QgUEhPU0hBVEUgPSBgXG5EYXRhZ3JvayBtb25vbWVyIGxpYnJhcnkgTnVjbGVvdGlkZXNcblxuICAwICAwICAwICAwICAwICAwICAgICAgICAgICAgICAwIFYzMDAwXG5NICBWMzAgQkVHSU4gQ1RBQlxuTSAgVjMwIENPVU5UUyA1IDQgMCAwIDBcbk0gIFYzMCBCRUdJTiBBVE9NXG5NICBWMzAgMSBPIC0xLjUgMCAwIDBcbk0gIFYzMCAyIFAgMCAwIDAgMFxuTSAgVjMwIDMgTyAwIDEgMCAwXG5NICBWMzAgNCBPIDAgLTEgMCAwXG5NICBWMzAgNSBPIDEuNSAwIDAgMFxuTSAgVjMwIEVORCBBVE9NXG5NICBWMzAgQkVHSU4gQk9ORFxuTSAgVjMwIDEgMSAxIDJcbk0gIFYzMCAyIDIgMiAzXG5NICBWMzAgMyAxIDIgNFxuTSAgVjMwIDQgMSAyIDVcbk0gIFYzMCBFTkQgQk9ORFxuTSAgVjMwIEVORCBDVEFCXG5NICBWMzAgQkVHSU4gQ09MTEVDVElPTlxuTSAgVjMwIEVORCBDT0xMRUNUSU9OXG5NICBFTkRgO1xuY29uc3QgVEhJT1BIT1NIQVRFID0gYFxuRGF0YWdyb2sgbW9ub21lciBsaWJyYXJ5IE51Y2xlb3RpZGVzXG5cbiAgMCAgMCAgMCAgMCAgMCAgMCAgICAgICAgICAgICAgMCBWMzAwMFxuTSAgVjMwIEJFR0lOIENUQUJcbk0gIFYzMCBDT1VOVFMgNSA0IDAgMCAwXG5NICBWMzAgQkVHSU4gQVRPTVxuTSAgVjMwIDEgTyAtMS41IDAgMCAwXG5NICBWMzAgMiBQIDAgMCAwIDBcbk0gIFYzMCAzIE8gMCAxIDAgMFxuTSAgVjMwIDQgUyAwIC0xIDAgMFxuTSAgVjMwIDUgTyAxLjUgMCAwIDBcbk0gIFYzMCBFTkQgQVRPTVxuTSAgVjMwIEJFR0lOIEJPTkRcbk0gIFYzMCAxIDEgMSAyXG5NICBWMzAgMiAyIDIgM1xuTSAgVjMwIDMgMSAyIDRcbk0gIFYzMCA0IDEgMiA1XG5NICBWMzAgRU5EIEJPTkRcbk0gIFYzMCBFTkQgQ1RBQlxuTSAgVjMwIEJFR0lOIENPTExFQ1RJT05cbk0gIFYzMCBFTkQgQ09MTEVDVElPTlxuTSAgRU5EYDtcbmNvbnN0IElOVkFCQVNJQyA9IGBcbkRhdGFncm9rIG1vbm9tZXIgbGlicmFyeSBOdWNsZW90aWRlc1xuXG4gIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICAgIDAgVjMwMDBcbk0gIFYzMCBCRUdJTiBDVEFCXG5NICBWMzAgQ09VTlRTIDggOCAwIDAgMFxuTSAgVjMwIEJFR0lOIEFUT01cbk0gIFYzMCAxIE8gMS4wOTM0IC0yLjE2MzYgMCAwXG5NICBWMzAgMiBDIDEuODM2NSAtMS40OTQ1IDAgMCBDRkc9MlxuTSAgVjMwIDMgQyAyLjgxNDcgLTEuNzAyNCAwIDBcbk0gIFYzMCA0IEMgMy4zMTQ3IC0wLjgzNjQgMCAwIFZBTD0zXG5NICBWMzAgNSBPIDIuNjQ1NSAtMC4wOTMyIDAgMFxuTSAgVjMwIDYgQyAxLjczMiAtMC41IDAgMCBDRkc9MVxuTSAgVjMwIDcgQyAwLjg2NiAwIDAgMFxuTSAgVjMwIDggTyAwLjg2NiAxIDAgMFxuTSAgVjMwIEVORCBBVE9NXG5NICBWMzAgQkVHSU4gQk9ORFxuTSAgVjMwIDEgMSAyIDEgQ0ZHPTFcbk0gIFYzMCAyIDEgMiAzXG5NICBWMzAgMyAxIDMgNFxuTSAgVjMwIDQgMSA0IDVcbk0gIFYzMCA1IDEgNiA1XG5NICBWMzAgNiAxIDIgNlxuTSAgVjMwIDcgMSA2IDcgQ0ZHPTNcbk0gIFYzMCA4IDEgNyA4XG5NICBWMzAgRU5EIEJPTkRcbk0gIFYzMCBCRUdJTiBDT0xMRUNUSU9OXG5NICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oMiAyIDYpXG5NICBWMzAgRU5EIENPTExFQ1RJT05cbk0gIFYzMCBFTkQgQ1RBQlxuTSAgRU5EYDtcbmV4cG9ydCBmdW5jdGlvbiBnZXROdWNsZW90aWRlc01vbChzbWlsZXNDb2Rlcywgb2NsUmVuZGVyID0gZmFsc2UpIHtcbiAgICBjb25zdCBtb2xCbG9ja3MgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNtaWxlc0NvZGVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBzbWlsZXNDb2Rlc1tpXSA9PSAnT1AoPU8pKE8pTycgPyBtb2xCbG9ja3MucHVzaChQSE9TSEFURSkgOlxuICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ09QKD1PKShTKU8nID8gbW9sQmxvY2tzLnB1c2goVEhJT1BIT1NIQVRFKSA6XG4gICAgICAgICAgICAgICAgc21pbGVzQ29kZXNbaV0gPT0gJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDTycgPyBtb2xCbG9ja3MucHVzaChyb3RhdGVOdWNsZW90aWRlc1YzMDAwKElOVkFCQVNJQykpIDpcbiAgICAgICAgICAgICAgICAgICAgbW9sQmxvY2tzLnB1c2gocm90YXRlTnVjbGVvdGlkZXNWMzAwMChzbWlsZXNDb2Rlc1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gbGlua1YzMDAwKG1vbEJsb2NrcywgZmFsc2UsIG9jbFJlbmRlcik7XG59XG5leHBvcnQgZnVuY3Rpb24gbGlua1YzMDAwKG1vbEJsb2NrcywgdHdvTW9sZWN1bGVzID0gZmFsc2UsIG9jbFJlbmRlciA9IGZhbHNlKSB7XG4gICAgbGV0IG1hY3JvTW9sQmxvY2sgPSAnXFxuRGF0YWdyb2sgbWFjcm9tb2xlY3VsZSBoYW5kbGVyXFxuXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICcgIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICA5OTkgVjMwMDBcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBCRUdJTiBDVEFCXFxuJztcbiAgICBsZXQgYXRvbUJsb2NrID0gJyc7XG4gICAgbGV0IGJvbmRCbG9jayA9ICcnO1xuICAgIGxldCBjb2xsZWN0aW9uQmxvY2sgPSAnJztcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gW107XG4gICAgbGV0IG5hdG9tID0gMDtcbiAgICBsZXQgbmJvbmQgPSAwO1xuICAgIGxldCBzZXF1ZW5jZVNoaWZ0ID0gMDtcbiAgICBsZXQgeFNoaWZ0ID0gMDtcbiAgICBpZiAodHdvTW9sZWN1bGVzICYmIG1vbEJsb2Nrcy5sZW5ndGggPiAxKVxuICAgICAgICBtb2xCbG9ja3NbMV0gPSBpbnZlcnROdWNsZW90aWRlc1YzMDAwKG1vbEJsb2Nrc1sxXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2xCbG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnJlcGxhY2VBbGwoJygtXFxuTSAgVjMwICcsICcoJylcbiAgICAgICAgICAgIC5yZXBsYWNlQWxsKCctXFxuTSAgVjMwICcsICcnKS5yZXBsYWNlQWxsKCcgKScsICcpJyk7XG4gICAgICAgIGNvbnN0IG51bWJlcnMgPSBleHRyYWN0QXRvbXNCb25kc051bWJlcnNWMzAwMChtb2xCbG9ja3NbaV0pO1xuICAgICAgICBjb25zdCBjb29yZGluYXRlcyA9IGV4dHJhY3RBdG9tRGF0YVYzMDAwKG1vbEJsb2Nrc1tpXSk7XG4gICAgICAgIGxldCBpbmRleEF0b21zID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBCRUdJTiBBVE9NJyk7IC8vIFYzMDAwIGluZGV4IGZvciBhdG9tcyBjb29yZGluYXRlc1xuICAgICAgICBpbmRleEF0b21zID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4QXRvbXMpO1xuICAgICAgICBsZXQgaW5kZXggPSBpbmRleEF0b21zO1xuICAgICAgICBsZXQgaW5kZXhFbmQgPSBpbmRleEF0b21zO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bWJlcnMubmF0b207IGorKykge1xuICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVzLmF0b21JbmRleFtqXSAhPSAxIHx8IGkgPT0gMCB8fCB0d29Nb2xlY3VsZXMpIHtcbiAgICAgICAgICAgICAgICAvL3Jld3JpdGUgYXRvbSBudW1iZXJcbiAgICAgICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdWMzAnLCBpbmRleCkgKyA0O1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXRvbU51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYXRvbTtcbiAgICAgICAgICAgICAgICBtb2xCbG9ja3NbaV0gPSBtb2xCbG9ja3NbaV0uc2xpY2UoMCwgaW5kZXgpICsgYXRvbU51bWJlciArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICAgICAgLy9yZXdyaXRlIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbFNoaWZ0ID0geFNoaWZ0IC0gY29vcmRpbmF0ZXMueFswXTtcbiAgICAgICAgICAgICAgICBsZXQgY29vcmRpbmF0ZSA9IE1hdGgucm91bmQoMTAwMDAgKiAocGFyc2VGbG9hdChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgdG90YWxTaGlmdCkpIC8gMTAwMDA7XG4gICAgICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGNvb3JkaW5hdGUgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgY29vcmRpbmF0ZSA9IE1hdGgucm91bmQoMTAwMDAgKiAocGFyc2VGbG9hdChtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpICsgc2VxdWVuY2VTaGlmdCkpIC8gMTAwMDA7XG4gICAgICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGNvb3JkaW5hdGUgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAnLCBpbmRleCkgLSAxO1xuICAgICAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1xcbicsIGluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIG1vbEJsb2Nrc1tpXS5zbGljZShpbmRleEVuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXhBdG9tc0VuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgRU5EIEFUT00nKTtcbiAgICAgICAgYXRvbUJsb2NrICs9IG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXhBdG9tcyArIDEsIGluZGV4QXRvbXNFbmQpO1xuICAgICAgICBsZXQgaW5kZXhCb25kcyA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgQkVHSU4gQk9ORCcpOyAvLyBWMzAwMCBpbmRleCBmb3IgYm9uZHNcbiAgICAgICAgaW5kZXhCb25kcyA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdcXG4nLCBpbmRleEJvbmRzKTtcbiAgICAgICAgaW5kZXggPSBpbmRleEJvbmRzO1xuICAgICAgICBpbmRleEVuZCA9IGluZGV4Qm9uZHM7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtYmVycy5uYm9uZDsgaisrKSB7XG4gICAgICAgICAgICAvL3Jld3JpdGUgYm9uZCBudW1iZXJcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ1YzMCcsIGluZGV4KSArIDQ7XG4gICAgICAgICAgICBpbmRleEVuZCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgYm9uZE51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYm9uZDtcbiAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBib25kTnVtYmVyICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgIC8vcmV3cml0ZSBhdG9tIHBhaXIgaW4gYm9uZFxuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSArIDE7XG4gICAgICAgICAgICBpbmRleCA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgICAgICAgICBsZXQgYXRvbU51bWJlciA9IHBhcnNlSW50KG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSkgKyBuYXRvbTtcbiAgICAgICAgICAgIG1vbEJsb2Nrc1tpXSA9IG1vbEJsb2Nrc1tpXS5zbGljZSgwLCBpbmRleCkgKyBhdG9tTnVtYmVyICsgbW9sQmxvY2tzW2ldLnNsaWNlKGluZGV4RW5kKTtcbiAgICAgICAgICAgIGluZGV4ID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJyAnLCBpbmRleCkgKyAxO1xuICAgICAgICAgICAgaW5kZXhFbmQgPSBNYXRoLm1pbihtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXgpLCBtb2xCbG9ja3NbaV0uaW5kZXhPZignICcsIGluZGV4KSk7XG4gICAgICAgICAgICBhdG9tTnVtYmVyID0gcGFyc2VJbnQobW9sQmxvY2tzW2ldLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKSArIG5hdG9tO1xuICAgICAgICAgICAgbW9sQmxvY2tzW2ldID0gbW9sQmxvY2tzW2ldLnNsaWNlKDAsIGluZGV4KSArIGF0b21OdW1iZXIgKyBtb2xCbG9ja3NbaV0uc2xpY2UoaW5kZXhFbmQpO1xuICAgICAgICAgICAgaW5kZXggPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleEJvbmRFbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignTSAgVjMwIEVORCBCT05EJyk7XG4gICAgICAgIGJvbmRCbG9jayArPSBtb2xCbG9ja3NbaV0uc3Vic3RyaW5nKGluZGV4Qm9uZHMgKyAxLCBpbmRleEJvbmRFbmQpO1xuICAgICAgICBsZXQgaW5kZXhDb2xsZWN0aW9uID0gbW9sQmxvY2tzW2ldLmluZGV4T2YoJ00gIFYzMCBNRExWMzAvU1RFQUJTIEFUT01TPSgnKTsgLy8gVjMwMDAgaW5kZXggZm9yIGNvbGxlY3Rpb25zXG4gICAgICAgIHdoaWxlIChpbmRleENvbGxlY3Rpb24gIT0gLTEpIHtcbiAgICAgICAgICAgIGluZGV4Q29sbGVjdGlvbiArPSAyODtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25FbmQgPSBtb2xCbG9ja3NbaV0uaW5kZXhPZignKScsIGluZGV4Q29sbGVjdGlvbik7XG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IG1vbEJsb2Nrc1tpXS5zdWJzdHJpbmcoaW5kZXhDb2xsZWN0aW9uLCBjb2xsZWN0aW9uRW5kKS5zcGxpdCgnICcpLnNsaWNlKDEpO1xuICAgICAgICAgICAgY29sbGVjdGlvbkVudHJpZXMuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24ucHVzaChwYXJzZUludChlKSArIG5hdG9tKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5kZXhDb2xsZWN0aW9uID0gY29sbGVjdGlvbkVuZDtcbiAgICAgICAgICAgIGluZGV4Q29sbGVjdGlvbiA9IG1vbEJsb2Nrc1tpXS5pbmRleE9mKCdNICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oJywgaW5kZXhDb2xsZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBuYXRvbSArPSB0d29Nb2xlY3VsZXMgPyBudW1iZXJzLm5hdG9tIDogbnVtYmVycy5uYXRvbSAtIDE7XG4gICAgICAgIG5ib25kICs9IG51bWJlcnMubmJvbmQ7XG4gICAgICAgIHhTaGlmdCArPSB0d29Nb2xlY3VsZXMgPyAwIDogY29vcmRpbmF0ZXMueFtudW1iZXJzLm5hdG9tIC0gMV0gLSBjb29yZGluYXRlcy54WzBdO1xuICAgICAgICBzZXF1ZW5jZVNoaWZ0ICs9IHR3b01vbGVjdWxlcyA/IC03IDogMDtcbiAgICB9XG4gICAgY29uc3QgZW50cmllcyA9IDQ7XG4gICAgY29uc3QgY29sbE51bWJlciA9IE1hdGguY2VpbChjb2xsZWN0aW9uLmxlbmd0aCAvIGVudHJpZXMpO1xuICAgIGlmIChvY2xSZW5kZXIpIHtcbiAgICAgICAgY29sbGVjdGlvbkJsb2NrICs9ICdNICBWMzAgTURMVjMwL1NURUFCUyBBVE9NUz0oJyArIGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbGxlY3Rpb24ubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gJyAnICsgY29sbGVjdGlvbltqXTtcbiAgICAgICAgY29sbGVjdGlvbkJsb2NrICs9ICcpXFxuJztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbGxlY3Rpb25CbG9jayArPSAnTSAgVjMwIE1ETFYzMC9TVEVBQlMgQVRPTVM9KCcgKyBjb2xsZWN0aW9uLmxlbmd0aCArICcgLVxcbic7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sbE51bWJlcjsgaSsrKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gJ00gIFYzMCAnO1xuICAgICAgICAgICAgY29uc3QgZW50cmllc0N1cnJlbnQgPSBpICsgMSA9PSBjb2xsTnVtYmVyID8gY29sbGVjdGlvbi5sZW5ndGggLSAoY29sbE51bWJlciAtIDEpICogZW50cmllcyA6IGVudHJpZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGVudHJpZXNDdXJyZW50OyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uQmxvY2sgKz0gKGogKyAxID09IGVudHJpZXNDdXJyZW50KSA/XG4gICAgICAgICAgICAgICAgICAgIChpID09IGNvbGxOdW1iZXIgLSAxID8gY29sbGVjdGlvbltlbnRyaWVzICogaSArIGpdICsgJylcXG4nIDogY29sbGVjdGlvbltlbnRyaWVzICogaSArIGpdICsgJyAtXFxuJykgOlxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uW2VudHJpZXMgKiBpICsgal0gKyAnICc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy9nZW5lcmF0ZSBmaWxlXG4gICAgdHdvTW9sZWN1bGVzID8gbmF0b20gOiBuYXRvbSsrO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIFYzMCBDT1VOVFMgJyArIG5hdG9tICsgJyAnICsgbmJvbmQgKyAnIDAgMCAwXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQVRPTVxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBhdG9tQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBBVE9NXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQk9ORFxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBib25kQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBCT05EXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgQkVHSU4gQ09MTEVDVElPTlxcbic7XG4gICAgbWFjcm9Nb2xCbG9jayArPSBjb2xsZWN0aW9uQmxvY2s7XG4gICAgbWFjcm9Nb2xCbG9jayArPSAnTSAgVjMwIEVORCBDT0xMRUNUSU9OXFxuJztcbiAgICBtYWNyb01vbEJsb2NrICs9ICdNICBWMzAgRU5EIENUQUJcXG4nO1xuICAgIG1hY3JvTW9sQmxvY2sgKz0gJ00gIEVORFxcbic7XG4gICAgcmV0dXJuIG1hY3JvTW9sQmxvY2s7XG59XG5mdW5jdGlvbiByb3RhdGVOdWNsZW90aWRlc1YzMDAwKG1vbGVjdWxlKSB7XG4gICAgbGV0IG1vbEJsb2NrID0gbW9sZWN1bGUuaW5jbHVkZXMoJ00gIEVORCcpID8gbW9sZWN1bGUgOiBPQ0wuTW9sZWN1bGUuZnJvbVNtaWxlcyhtb2xlY3VsZSkudG9Nb2xmaWxlVjMoKTtcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGV4dHJhY3RBdG9tRGF0YVYzMDAwKG1vbEJsb2NrKTtcbiAgICBjb25zdCBuYXRvbSA9IGNvb3JkaW5hdGVzLmF0b21JbmRleC5sZW5ndGg7XG4gICAgY29uc3QgaW5kZXhGaXZlUHJpbWUgPSBjb29yZGluYXRlcy5hdG9tSW5kZXguaW5kZXhPZigxKTtcbiAgICBjb25zdCBpbmRleFRocmVlUHJpbWUgPSBjb29yZGluYXRlcy5hdG9tSW5kZXguaW5kZXhPZihuYXRvbSk7XG4gICAgLy9maXggNSBwcmltZSBpZiBpbmFkZXF1YXRlXG4gICAgaWYgKG5hdG9tID4gOClcbiAgICAgICAgZml4NVByaW1lKGNvb3JkaW5hdGVzLCBpbmRleEZpdmVQcmltZSwgaW5kZXhUaHJlZVByaW1lKTtcbiAgICBjb25zdCB4Q2VudGVyID0gKGNvb3JkaW5hdGVzLnhbaW5kZXhUaHJlZVByaW1lXSArIGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdKSAvIDI7XG4gICAgY29uc3QgeUNlbnRlciA9IChjb29yZGluYXRlcy55W2luZGV4VGhyZWVQcmltZV0gKyBjb29yZGluYXRlcy55W2luZGV4Rml2ZVByaW1lXSkgLyAyO1xuICAgIC8vcGxhY2UgdG8gY2VudGVyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gLT0geENlbnRlcjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSAtPSB5Q2VudGVyO1xuICAgIH1cbiAgICBsZXQgYW5nbGUgPSAwO1xuICAgIGlmIChjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXSA9PSAwKVxuICAgICAgICBhbmdsZSA9IGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdID4gY29vcmRpbmF0ZXMueVtpbmRleFRocmVlUHJpbWVdID8gTWF0aC5QSSAvIDIgOiAzICogTWF0aC5QSSAvIDI7XG4gICAgZWxzZSBpZiAoY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gPT0gMClcbiAgICAgICAgYW5nbGUgPSBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXSA+IGNvb3JkaW5hdGVzLnhbaW5kZXhUaHJlZVByaW1lXSA/IE1hdGguUEkgOiAwO1xuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBkZXJpdmF0aXZlID0gY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZV0gLyBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXTtcbiAgICAgICAgYW5nbGUgPSBkZXJpdmF0aXZlID4gMCA/IE1hdGguUEkgLSBNYXRoLmF0YW4oZGVyaXZhdGl2ZSkgOiBNYXRoLmF0YW4oZGVyaXZhdGl2ZSk7XG4gICAgfVxuICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHhBZGQgPSBjb29yZGluYXRlcy54W2ldO1xuICAgICAgICBjb29yZGluYXRlcy54W2ldID0geEFkZCAqIGNvcyAtIGNvb3JkaW5hdGVzLnlbaV0gKiBzaW47XG4gICAgICAgIGNvb3JkaW5hdGVzLnlbaV0gPSB4QWRkICogc2luICsgY29vcmRpbmF0ZXMueVtpXSAqIGNvcztcbiAgICB9XG4gICAgLy9wbGFjZSB0byByaWdodFxuICAgIGNvbnN0IHhTaGlmdCA9IGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF0b207IGkrKylcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSAtPSB4U2hpZnQ7XG4gICAgLy9yZXdyaXRlIG1vbEJsb2NrXG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCk7XG4gICAgbGV0IGluZGV4RW5kID0gaW5kZXg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXhFbmQpO1xuICAgICAgICBtb2xCbG9jayA9IG1vbEJsb2NrLnNsaWNlKDAsIGluZGV4KSArXG4gICAgICAgICAgICBjb29yZGluYXRlcy54W2ldICsgJyAnICsgY29vcmRpbmF0ZXMueVtpXSArXG4gICAgICAgICAgICBtb2xCbG9jay5zbGljZShpbmRleEVuZCk7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIG1vbEJsb2NrO1xufVxuZnVuY3Rpb24gaW52ZXJ0TnVjbGVvdGlkZXNWMzAwMChtb2xlY3VsZSkge1xuICAgIGxldCBtb2xCbG9jayA9IG1vbGVjdWxlLmluY2x1ZGVzKCdNICBFTkQnKSA/IG1vbGVjdWxlIDogT0NMLk1vbGVjdWxlLmZyb21TbWlsZXMobW9sZWN1bGUpLnRvTW9sZmlsZVYzKCk7XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBleHRyYWN0QXRvbURhdGFWMzAwMChtb2xCbG9jayk7XG4gICAgY29uc3QgbmF0b20gPSBjb29yZGluYXRlcy5hdG9tSW5kZXgubGVuZ3RoO1xuICAgIGNvbnN0IHhDZW50ZXIgPSAoTWF0aC5tYXgoLi4uY29vcmRpbmF0ZXMueCkgKyBNYXRoLm1pbiguLi5jb29yZGluYXRlcy54KSkgLyAyO1xuICAgIGNvbnN0IHlDZW50ZXIgPSAoTWF0aC5tYXgoLi4uY29vcmRpbmF0ZXMueSkgKyBNYXRoLm1pbiguLi5jb29yZGluYXRlcy55KSkgLyAyO1xuICAgIC8vcGxhY2UgdG8gY2VudGVyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gLT0geENlbnRlcjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSAtPSB5Q2VudGVyO1xuICAgIH1cbiAgICBjb25zdCBhbmdsZSA9IE1hdGguUEk7XG4gICAgY29uc3QgY29zID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29uc3QgeEFkZCA9IGNvb3JkaW5hdGVzLnhbaV07XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaV0gPSB4QWRkICogY29zIC0gY29vcmRpbmF0ZXMueVtpXSAqIHNpbjtcbiAgICAgICAgY29vcmRpbmF0ZXMueVtpXSA9IHhBZGQgKiBzaW4gKyBjb29yZGluYXRlcy55W2ldICogY29zO1xuICAgIH1cbiAgICAvL3BsYWNlIGJhY2tcbiAgICBjb25zdCB5U2hpZnQgPSBNYXRoLm1heCguLi5jb29yZGluYXRlcy55KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdG9tOyBpKyspIHtcbiAgICAgICAgY29vcmRpbmF0ZXMueFtpXSArPSB4Q2VudGVyO1xuICAgICAgICBjb29yZGluYXRlcy55W2ldIC09IHlTaGlmdDtcbiAgICB9XG4gICAgLy9yZXdyaXRlIG1vbEJsb2NrXG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCk7XG4gICAgbGV0IGluZGV4RW5kID0gaW5kZXg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXRvbTsgaSsrKSB7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignVjMwJywgaW5kZXgpICsgNDtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXhFbmQpO1xuICAgICAgICBtb2xCbG9jayA9IG1vbEJsb2NrLnNsaWNlKDAsIGluZGV4KSArXG4gICAgICAgICAgICBjb29yZGluYXRlcy54W2ldICsgJyAnICsgY29vcmRpbmF0ZXMueVtpXSArXG4gICAgICAgICAgICBtb2xCbG9jay5zbGljZShpbmRleEVuZCk7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIG1vbEJsb2NrO1xufVxuZnVuY3Rpb24gZml4NVByaW1lKGNvb3JkaW5hdGVzLCBpbmRleEZpdmVQcmltZSwgaW5kZXhUaHJlZVByaW1lKSB7XG4gICAgY29uc3QgaW5kZXhGaXZlUHJpbWVOZWlnaGJvdXIgPSBpbmRleEZpdmVQcmltZSArIDE7XG4gICAgY29uc3QgeFNoaWZ0ID0gY29vcmRpbmF0ZXMueFtpbmRleEZpdmVQcmltZU5laWdoYm91cl07XG4gICAgY29uc3QgeVNoaWZ0ID0gY29vcmRpbmF0ZXMueVtpbmRleEZpdmVQcmltZU5laWdoYm91cl07XG4gICAgY29uc3QgYmFzZTNQcmltZVggPSBjb29yZGluYXRlcy54W2luZGV4VGhyZWVQcmltZV0gLSB4U2hpZnQ7XG4gICAgY29uc3QgYmFzZTNQcmltZVkgPSBjb29yZGluYXRlcy55W2luZGV4VGhyZWVQcmltZV0gLSB5U2hpZnQ7XG4gICAgY29uc3QgYmFzZTVQcmltZVggPSBjb29yZGluYXRlcy54W2luZGV4Rml2ZVByaW1lXSAtIHhTaGlmdDtcbiAgICBjb25zdCBiYXNlNVByaW1lWSA9IGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdIC0geVNoaWZ0O1xuICAgIGNvbnN0IHJvdGF0ZWQ1UHJpbWVYID0gYmFzZTVQcmltZVggKiBNYXRoLmNvcyhNYXRoLlBJICogMiAvIDMpIC0gYmFzZTVQcmltZVkgKiBNYXRoLnNpbihNYXRoLlBJICogMiAvIDMpO1xuICAgIGNvbnN0IHJvdGF0ZWQ1UHJpbWVZID0gYmFzZTVQcmltZVggKiBNYXRoLnNpbihNYXRoLlBJICogMiAvIDMpICsgYmFzZTVQcmltZVkgKiBNYXRoLmNvcyhNYXRoLlBJICogMiAvIDMpO1xuICAgIGNvbnN0IGR4ID0gYmFzZTVQcmltZVggLSBiYXNlM1ByaW1lWDtcbiAgICBjb25zdCBkeSA9IGJhc2U1UHJpbWVZIC0gYmFzZTNQcmltZVk7XG4gICAgY29uc3QgZHhSb3RhdGVkID0gcm90YXRlZDVQcmltZVggLSBiYXNlM1ByaW1lWDtcbiAgICBjb25zdCBkeVJvdGF0ZWQgPSByb3RhdGVkNVByaW1lWSAtIGJhc2UzUHJpbWVZO1xuICAgIGlmIChNYXRoLnNxcnQoZHlSb3RhdGVkICogZHlSb3RhdGVkICsgZHhSb3RhdGVkICogZHhSb3RhdGVkKSA+PSBNYXRoLnNxcnQoZHkgKiBkeSArIGR4ICogZHgpKSB7XG4gICAgICAgIGNvb3JkaW5hdGVzLnhbaW5kZXhGaXZlUHJpbWVdID0gcm90YXRlZDVQcmltZVggKyB4U2hpZnQ7XG4gICAgICAgIGNvb3JkaW5hdGVzLnlbaW5kZXhGaXZlUHJpbWVdID0gcm90YXRlZDVQcmltZVkgKyB5U2hpZnQ7XG4gICAgfVxufVxuZnVuY3Rpb24gZXh0cmFjdEF0b21zQm9uZHNOdW1iZXJzVjMwMDAobW9sQmxvY2spIHtcbiAgICBtb2xCbG9jayA9IG1vbEJsb2NrLnJlcGxhY2VBbGwoJ1xccicsICcnKTsgLy9lcXVhbGl6ZSBvbGQgYW5kIG5ldyBzZGYgc3RhbmRhcmRzXG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignQ09VTlRTJykgKyA3OyAvLyBWMzAwMCBpbmRleCBmb3IgYXRvbXMgYW5kIGJvbmRzIG51bWJlclxuICAgIGxldCBpbmRleEVuZCA9IG1vbEJsb2NrLmluZGV4T2YoJyAnLCBpbmRleCk7XG4gICAgY29uc3QgYXRvbXNOdW1iZXIgPSBwYXJzZUludChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgaW5kZXggPSBpbmRleEVuZCArIDE7XG4gICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgIGNvbnN0IGJvbmRzTnVtYmVyID0gcGFyc2VJbnQobW9sQmxvY2suc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpO1xuICAgIHJldHVybiB7IG5hdG9tOiBhdG9tc051bWJlciwgbmJvbmQ6IGJvbmRzTnVtYmVyIH07XG59XG5mdW5jdGlvbiBleHRyYWN0QXRvbURhdGFWMzAwMChtb2xCbG9jaykge1xuICAgIGNvbnN0IG51bWJlcnMgPSBleHRyYWN0QXRvbXNCb25kc051bWJlcnNWMzAwMChtb2xCbG9jayk7XG4gICAgbGV0IGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignTSAgVjMwIEJFR0lOIEFUT00nKTsgLy8gVjMwMDAgaW5kZXggZm9yIGF0b21zIGNvb3JkaW5hdGVzXG4gICAgaW5kZXggPSBtb2xCbG9jay5pbmRleE9mKCdcXG4nLCBpbmRleCk7XG4gICAgbGV0IGluZGV4RW5kID0gaW5kZXg7XG4gICAgY29uc3QgaW5kZXhlcyA9IEFycmF5KG51bWJlcnMubmF0b20pO1xuICAgIGNvbnN0IHR5cGVzID0gQXJyYXkobnVtYmVycy5uYXRvbSk7XG4gICAgY29uc3QgeCA9IEFycmF5KG51bWJlcnMubmF0b20pO1xuICAgIGNvbnN0IHkgPSBBcnJheShudW1iZXJzLm5hdG9tKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlcnMubmF0b207IGkrKykge1xuICAgICAgICBpbmRleCA9IG1vbEJsb2NrLmluZGV4T2YoJ1YzMCcsIGluZGV4KSArIDQ7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgaW5kZXhlc1tpXSA9IHBhcnNlSW50KG1vbEJsb2NrLnN1YnN0cmluZyhpbmRleCwgaW5kZXhFbmQpKTtcbiAgICAgICAgaW5kZXggPSBpbmRleEVuZCArIDE7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgdHlwZXNbaV0gPSBtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKTtcbiAgICAgICAgaW5kZXggPSBpbmRleEVuZCArIDE7XG4gICAgICAgIGluZGV4RW5kID0gbW9sQmxvY2suaW5kZXhPZignICcsIGluZGV4KTtcbiAgICAgICAgeFtpXSA9IHBhcnNlRmxvYXQobW9sQmxvY2suc3Vic3RyaW5nKGluZGV4LCBpbmRleEVuZCkpO1xuICAgICAgICBpbmRleCA9IGluZGV4RW5kICsgMTtcbiAgICAgICAgaW5kZXhFbmQgPSBtb2xCbG9jay5pbmRleE9mKCcgJywgaW5kZXgpO1xuICAgICAgICB5W2ldID0gcGFyc2VGbG9hdChtb2xCbG9jay5zdWJzdHJpbmcoaW5kZXgsIGluZGV4RW5kKSk7XG4gICAgICAgIGluZGV4ID0gbW9sQmxvY2suaW5kZXhPZignXFxuJywgaW5kZXgpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYXRvbUluZGV4OiBpbmRleGVzLCBhdG9tVHlwZTogdHlwZXMsIHg6IHgsIHk6IHkgfTtcbn1cbiIsImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbi8vIGltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgeyBtYXAsIFNZTlRIRVNJWkVSUywgVEVDSE5PTE9HSUVTLCBNT0RJRklDQVRJT05TIH0gZnJvbSAnLi9tYXAnO1xuaW1wb3J0IHsgYXNvR2FwbWVyc051Y2xlb3RpZGVzVG9CaW9TcHJpbmcsIGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvR2NycywgYXNvR2FwbWVyc0Jpb1NwcmluZ1RvTnVjbGVvdGlkZXMsIGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnMsIGFzb0dhcG1lcnNHY3JzVG9OdWNsZW90aWRlcywgYXNvR2FwbWVyc0djcnNUb0Jpb1NwcmluZywgZ2Nyc1RvTWVybWFkZTEyLCBzaVJuYU51Y2xlb3RpZGVUb0Jpb1NwcmluZ1NlbnNlU3RyYW5kLCBzaVJuYU51Y2xlb3RpZGVUb0F4b2xhYnNTZW5zZVN0cmFuZCwgc2lSbmFOdWNsZW90aWRlc1RvR2Nycywgc2lSbmFCaW9TcHJpbmdUb051Y2xlb3RpZGVzLCBzaVJuYUJpb1NwcmluZ1RvQXhvbGFicywgc2lSbmFCaW9TcHJpbmdUb0djcnMsIHNpUm5hQXhvbGFic1RvTnVjbGVvdGlkZXMsIHNpUm5hQXhvbGFic1RvQmlvU3ByaW5nLCBzaVJuYUF4b2xhYnNUb0djcnMsIHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXMsIHNpUm5hR2Nyc1RvQmlvU3ByaW5nLCBzaVJuYUdjcnNUb0F4b2xhYnMsIGdjcnNUb051Y2xlb3RpZGVzIH0gZnJvbSAnLi9jb252ZXJ0ZXJzJztcbmNvbnN0IG5vVHJhbnNsYXRpb25UYWJsZUF2YWlsYWJsZSA9ICdObyB0cmFuc2xhdGlvbiB0YWJsZSBhdmFpbGFibGUnO1xuZXhwb3J0IGNvbnN0IHVuZGVmaW5lZElucHV0U2VxdWVuY2UgPSAnVHlwZSBvZiBpbnB1dCBzZXF1ZW5jZSBpcyB1bmRlZmluZWQnO1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRTZXF1ZW5jZShzZXF1ZW5jZSkge1xuICAgIGxldCBwb3NzaWJsZVN5bnRoZXNpemVycyA9IGdldExpc3RPZlBvc3NpYmxlU3ludGhlc2l6ZXJzQnlGaXJzdE1hdGNoZWRDb2RlKHNlcXVlbmNlKTtcbiAgICBpZiAocG9zc2libGVTeW50aGVzaXplcnMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBzeW50aGVzaXplciA9IHVpLmNob2ljZUlucHV0KCdDaG9vc2Ugc3ludGhlc2l6ZXIgZnJvbSBsaXN0OiAnLCBwb3NzaWJsZVN5bnRoZXNpemVyc1swXSwgcG9zc2libGVTeW50aGVzaXplcnMpO1xuICAgICAgICB1aS5kaWFsb2coJ0Nob29zZSBTeW50aGVzaXplcicpXG4gICAgICAgICAgICAuYWRkKHVpLnBhbmVsKFtzeW50aGVzaXplci5yb290XSwgeyBzdHlsZTogeyBmb250V2VpZ2h0OiAnYm9sZCcgfSB9KSlcbiAgICAgICAgICAgIC5vbk9LKCgpID0+IHBvc3NpYmxlU3ludGhlc2l6ZXJzID0gW3N5bnRoZXNpemVyLnZhbHVlXSlcbiAgICAgICAgICAgIC5vbkNhbmNlbCgoKSA9PiB7XG4gICAgICAgICAgICBwb3NzaWJsZVN5bnRoZXNpemVycyA9IFtwb3NzaWJsZVN5bnRoZXNpemVyc1swXV07XG4gICAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoJ0lucHV0IHNlcXVlbmNlIGlzIGV4cGVjdGVkIHRvIGJlIGluIGZvcm1hdCAnICsgcG9zc2libGVTeW50aGVzaXplcnNbMF0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnNob3coKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocG9zc2libGVTeW50aGVzaXplcnMubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiB7IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcjogMCwgc3ludGhlc2l6ZXI6IG51bGwsIHRlY2hub2xvZ3k6IG51bGwgfTtcbiAgICBsZXQgb3V0cHV0SW5kZXggPSAwO1xuICAgIGNvbnN0IGZpcnN0VW5pcXVlQ2hhcmFjdGVycyA9IFsncicsICdkJ107XG4gICAgY29uc3QgbnVjbGVvdGlkZXMgPSBbJ0EnLCAnVScsICdUJywgJ0MnLCAnRyddO1xuICAgIHBvc3NpYmxlU3ludGhlc2l6ZXJzLmZvckVhY2goKHN5bnRoZXNpemVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gZ2V0QWxsQ29kZXNPZlN5bnRoZXNpemVyKHN5bnRoZXNpemVyKTtcbiAgICAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkQ29kZSA9IGNvZGVzLmZpbmQoKGMpID0+IGMgPT0gc2VxdWVuY2Uuc2xpY2Uob3V0cHV0SW5kZXgsIG91dHB1dEluZGV4ICsgYy5sZW5ndGgpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkQ29kZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdyQUEnXG4gICAgICAgICAgICBvdXRwdXRJbmRleCA+IDEgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pICYmXG4gICAgICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4IC0gMl0pKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgaWYgKCAvLyBmb3IgbWlzdGFrZSBwYXR0ZXJuICdBckEnXG4gICAgICAgICAgICBmaXJzdFVuaXF1ZUNoYXJhY3RlcnMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXggKyAxXSkgJiZcbiAgICAgICAgICAgICAgICBudWNsZW90aWRlcy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0SW5kZXgrKztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dEluZGV4ICs9IG1hdGNoZWRDb2RlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhciA9IChvdXRwdXRJbmRleCA9PSBzZXF1ZW5jZS5sZW5ndGgpID8gLTEgOiBvdXRwdXRJbmRleDtcbiAgICBpZiAoaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyICE9IC0xKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXI6IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcixcbiAgICAgICAgICAgIHN5bnRoZXNpemVyOiBwb3NzaWJsZVN5bnRoZXNpemVyc1swXSxcbiAgICAgICAgICAgIHRlY2hub2xvZ3k6IG51bGwsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGxldCBwb3NzaWJsZVRlY2hub2xvZ2llcyA9IGdldExpc3RPZlBvc3NpYmxlVGVjaG5vbG9naWVzQnlGaXJzdE1hdGNoZWRDb2RlKHNlcXVlbmNlLCBwb3NzaWJsZVN5bnRoZXNpemVyc1swXSk7XG4gICAgaWYgKHBvc3NpYmxlVGVjaG5vbG9naWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc3QgdGVjaG5vbG9neSA9IHVpLmNob2ljZUlucHV0KCdDaG9vc2UgdGVjaG5vbG9neSBmcm9tIGxpc3Q6ICcsIHBvc3NpYmxlVGVjaG5vbG9naWVzWzBdLCBwb3NzaWJsZVRlY2hub2xvZ2llcyk7XG4gICAgICAgIHVpLmRpYWxvZygnQ2hvb3NlIFRlY2hub2xvZ3knKVxuICAgICAgICAgICAgLmFkZCh1aS5wYW5lbChbdGVjaG5vbG9neS5yb290XSwgeyBzdHlsZTogeyBmb250V2VpZ2h0OiAnYm9sZCcgfSB9KSlcbiAgICAgICAgICAgIC5vbk9LKCgpID0+IHBvc3NpYmxlVGVjaG5vbG9naWVzID0gW3RlY2hub2xvZ3kudmFsdWVdKVxuICAgICAgICAgICAgLm9uQ2FuY2VsKCgpID0+IHtcbiAgICAgICAgICAgIHBvc3NpYmxlVGVjaG5vbG9naWVzID0gW3Bvc3NpYmxlVGVjaG5vbG9naWVzWzBdXTtcbiAgICAgICAgICAgIGdyb2suc2hlbGwud2FybmluZygnSW5wdXQgc2VxdWVuY2UgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gZm9ybWF0ICcgKyBwb3NzaWJsZVRlY2hub2xvZ2llc1swXSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuc2hvdygpO1xuICAgIH1cbiAgICBlbHNlIGlmIChwb3NzaWJsZVRlY2hub2xvZ2llcy5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIHsgaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyOiAwLCBzeW50aGVzaXplcjogbnVsbCwgdGVjaG5vbG9neTogbnVsbCB9O1xuICAgIG91dHB1dEluZGV4ID0gMDtcbiAgICBwb3NzaWJsZVRlY2hub2xvZ2llcy5mb3JFYWNoKCh0ZWNobm9sb2d5KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gT2JqZWN0LmtleXMobWFwW3Bvc3NpYmxlU3ludGhlc2l6ZXJzWzBdXVt0ZWNobm9sb2d5XSk7XG4gICAgICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZENvZGUgPSBjb2Rlcy5maW5kKChjKSA9PiBjID09IHNlcXVlbmNlLnNsaWNlKG91dHB1dEluZGV4LCBvdXRwdXRJbmRleCArIGMubGVuZ3RoKSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlZENvZGUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnckFBJ1xuICAgICAgICAgICAgb3V0cHV0SW5kZXggPiAxICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSAmJlxuICAgICAgICAgICAgICAgIGZpcnN0VW5pcXVlQ2hhcmFjdGVycy5pbmNsdWRlcyhzZXF1ZW5jZVtvdXRwdXRJbmRleCAtIDJdKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmICggLy8gZm9yIG1pc3Rha2UgcGF0dGVybiAnQXJBJ1xuICAgICAgICAgICAgZmlyc3RVbmlxdWVDaGFyYWN0ZXJzLmluY2x1ZGVzKHNlcXVlbmNlW291dHB1dEluZGV4ICsgMV0pICYmXG4gICAgICAgICAgICAgICAgbnVjbGVvdGlkZXMuaW5jbHVkZXMoc2VxdWVuY2Vbb3V0cHV0SW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIG91dHB1dEluZGV4Kys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRJbmRleCArPSBtYXRjaGVkQ29kZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbmRleE9mRmlyc3ROb3RWYWxpZENoYXI6IGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcixcbiAgICAgICAgc3ludGhlc2l6ZXI6IHBvc3NpYmxlU3ludGhlc2l6ZXJzWzBdLFxuICAgICAgICB0ZWNobm9sb2d5OiBwb3NzaWJsZVRlY2hub2xvZ2llc1tvdXRwdXRJbmRleF0sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldEFsbENvZGVzT2ZTeW50aGVzaXplcihzeW50aGVzaXplcikge1xuICAgIGxldCBjb2RlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgdGVjaG5vbG9neSBvZiBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdKSlcbiAgICAgICAgY29kZXMgPSBjb2Rlcy5jb25jYXQoT2JqZWN0LmtleXMobWFwW3N5bnRoZXNpemVyXVt0ZWNobm9sb2d5XSkpO1xuICAgIHJldHVybiBjb2Rlcy5jb25jYXQoT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUykpO1xufVxuZnVuY3Rpb24gZ2V0TGlzdE9mUG9zc2libGVTeW50aGVzaXplcnNCeUZpcnN0TWF0Y2hlZENvZGUoc2VxdWVuY2UpIHtcbiAgICBjb25zdCBzeW50aGVzaXplcnMgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goKHN5bnRoZXNpemVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGVzID0gZ2V0QWxsQ29kZXNPZlN5bnRoZXNpemVyKHN5bnRoZXNpemVyKTtcbiAgICAgICAgLy9UT0RPOiBnZXQgZmlyc3Qgbm9uLWRyb3Bkb3duIGNvZGUgd2hlbiB0aGVyZSBhcmUgdHdvIG1vZGlmaWNhdGlvbnNcbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXF1ZW5jZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHNlcXVlbmNlW2ldID09ICcpJyAmJiBpICE9IHNlcXVlbmNlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2Rlcy5zb21lKChzKSA9PiBzID09IHNlcXVlbmNlLnNsaWNlKHN0YXJ0LCBzdGFydCArIHMubGVuZ3RoKSkpXG4gICAgICAgICAgICBzeW50aGVzaXplcnMucHVzaChzeW50aGVzaXplcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN5bnRoZXNpemVycztcbn1cbmZ1bmN0aW9uIGdldExpc3RPZlBvc3NpYmxlVGVjaG5vbG9naWVzQnlGaXJzdE1hdGNoZWRDb2RlKHNlcXVlbmNlLCBzeW50aGVzaXplcikge1xuICAgIGNvbnN0IHRlY2hub2xvZ2llcyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKG1hcFtzeW50aGVzaXplcl0pLmZvckVhY2goKHRlY2hub2xvZ3kpID0+IHtcbiAgICAgICAgY29uc3QgY29kZXMgPSBPYmplY3Qua2V5cyhtYXBbc3ludGhlc2l6ZXJdW3RlY2hub2xvZ3ldKS5jb25jYXQoT2JqZWN0LmtleXMoTU9ESUZJQ0FUSU9OUykpO1xuICAgICAgICBpZiAoY29kZXMuc29tZSgocykgPT4gcyA9PSBzZXF1ZW5jZS5zbGljZSgwLCBzLmxlbmd0aCkpKVxuICAgICAgICAgICAgdGVjaG5vbG9naWVzLnB1c2godGVjaG5vbG9neSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRlY2hub2xvZ2llcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U2VxdWVuY2Uoc2VxdWVuY2UsIG91dHB1dCkge1xuICAgIGlmIChvdXRwdXQuaW5kZXhPZkZpcnN0Tm90VmFsaWRDaGFyICE9IC0xKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyB0eXBlOiAnJyxcbiAgICAgICAgICAgIGluZGV4T2ZGaXJzdE5vdFZhbGlkQ2hhcjogSlNPTi5zdHJpbmdpZnkob3V0cHV0KSxcbiAgICAgICAgICAgIEVycm9yOiB1bmRlZmluZWRJbnB1dFNlcXVlbmNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyID09IFNZTlRIRVNJWkVSUy5SQVdfTlVDTEVPVElERVMgJiYgb3V0cHV0LnRlY2hub2xvZ3kgPT0gVEVDSE5PTE9HSUVTLkROQSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLlJBV19OVUNMRU9USURFUyArICcgJyArIFRFQ0hOT0xPR0lFUy5ETkEsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogc2VxdWVuY2UsXG4gICAgICAgICAgICBCaW9TcHJpbmc6IGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvQmlvU3ByaW5nKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IGFzb0dhcG1lcnNOdWNsZW90aWRlc1RvR2NycyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIgPT0gU1lOVEhFU0laRVJTLkJJT1NQUklORyAmJiBvdXRwdXQudGVjaG5vbG9neSA9PSBURUNITk9MT0dJRVMuQVNPX0dBUE1FUlMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcgKyAnICcgKyBURUNITk9MT0dJRVMuQVNPX0dBUE1FUlMsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogYXNvR2FwbWVyc0Jpb1NwcmluZ1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIEdDUlM6IGFzb0dhcG1lcnNCaW9TcHJpbmdUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyID09IFNZTlRIRVNJWkVSUy5HQ1JTICYmIG91dHB1dC50ZWNobm9sb2d5ID09IFRFQ0hOT0xPR0lFUy5BU09fR0FQTUVSUykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkdDUlMgKyAnICcgKyBURUNITk9MT0dJRVMuQVNPX0dBUE1FUlMsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogYXNvR2FwbWVyc0djcnNUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogYXNvR2FwbWVyc0djcnNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBNZXJtYWRlMTI6IGdjcnNUb01lcm1hZGUxMihzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzZXF1ZW5jZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplciA9PSBTWU5USEVTSVpFUlMuUkFXX05VQ0xFT1RJREVTICYmIG91dHB1dC50ZWNobm9sb2d5ID09IFRFQ0hOT0xPR0lFUy5STkEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFNZTlRIRVNJWkVSUy5SQVdfTlVDTEVPVElERVMgKyAnICcgKyBURUNITk9MT0dJRVMuUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNlcXVlbmNlLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzaVJuYU51Y2xlb3RpZGVUb0Jpb1NwcmluZ1NlbnNlU3RyYW5kKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEF4b2xhYnM6IHNpUm5hTnVjbGVvdGlkZVRvQXhvbGFic1NlbnNlU3RyYW5kKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNpUm5hTnVjbGVvdGlkZXNUb0djcnMoc2VxdWVuY2UpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyID09IFNZTlRIRVNJWkVSUy5CSU9TUFJJTkcgJiYgb3V0cHV0LnRlY2hub2xvZ3kgPT0gVEVDSE5PTE9HSUVTLlNJX1JOQSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkJJT1NQUklORyArICcgJyArIFRFQ0hOT0xPR0lFUy5TSV9STkEsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogc2lSbmFCaW9TcHJpbmdUb051Y2xlb3RpZGVzKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEJpb1NwcmluZzogc2VxdWVuY2UsXG4gICAgICAgICAgICBBeG9sYWJzOiBzaVJuYUJpb1NwcmluZ1RvQXhvbGFicyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzaVJuYUJpb1NwcmluZ1RvR2NycyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIgPT0gU1lOVEhFU0laRVJTLkFYT0xBQlMgJiYgb3V0cHV0LnRlY2hub2xvZ3kgPT0gVEVDSE5PTE9HSUVTLlNJX1JOQSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkFYT0xBQlMgKyAnICcgKyBURUNITk9MT0dJRVMuU0lfUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNpUm5hQXhvbGFic1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzaVJuYUF4b2xhYnNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBBeG9sYWJzOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIEdDUlM6IHNpUm5hQXhvbGFic1RvR2NycyhzZXF1ZW5jZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3ludGhlc2l6ZXIgPT0gU1lOVEhFU0laRVJTLkdDUlMgJiYgb3V0cHV0LnRlY2hub2xvZ3kgPT0gVEVDSE5PTE9HSUVTLlNJX1JOQSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLkdDUlMgKyAnICcgKyBURUNITk9MT0dJRVMuU0lfUk5BLFxuICAgICAgICAgICAgTnVjbGVvdGlkZXM6IHNpUm5hR2Nyc1RvTnVjbGVvdGlkZXMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgQmlvU3ByaW5nOiBzaVJuYUdjcnNUb0Jpb1NwcmluZyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBBeG9sYWJzOiBzaVJuYUdjcnNUb0F4b2xhYnMoc2VxdWVuY2UpLFxuICAgICAgICAgICAgTU0xMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgICAgIEdDUlM6IHNlcXVlbmNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN5bnRoZXNpemVyID09IFNZTlRIRVNJWkVSUy5HQ1JTKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBTWU5USEVTSVpFUlMuR0NSUyxcbiAgICAgICAgICAgIE51Y2xlb3RpZGVzOiBnY3JzVG9OdWNsZW90aWRlcyhzZXF1ZW5jZSksXG4gICAgICAgICAgICBHQ1JTOiBzZXF1ZW5jZSxcbiAgICAgICAgICAgIE1lcm1hZGUxMjogZ2Nyc1RvTWVybWFkZTEyKHNlcXVlbmNlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5zeW50aGVzaXplciA9PSBTWU5USEVTSVpFUlMuTUVSTUFERV8xMikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogU1lOVEhFU0laRVJTLk1FUk1BREVfMTIsXG4gICAgICAgICAgICBOdWNsZW90aWRlczogbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlLFxuICAgICAgICAgICAgR0NSUzogbm9UcmFuc2xhdGlvblRhYmxlQXZhaWxhYmxlLFxuICAgICAgICAgICAgTWVybWFkZTEyOiBzZXF1ZW5jZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdW5kZWZpbmVkSW5wdXRTZXF1ZW5jZSxcbiAgICAgICAgTnVjbGVvdGlkZXM6IHVuZGVmaW5lZElucHV0U2VxdWVuY2UsXG4gICAgfTtcbn1cbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgY2F0ZWdvcnksIGV4cGVjdCwgdGVzdCB9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3Rlc3QnO1xuaW1wb3J0IHsgc2VxdWVuY2VUb1NtaWxlcyB9IGZyb20gJy4uL3N0cnVjdHVyZXMtd29ya3MvZnJvbS1tb25vbWVycyc7XG5jYXRlZ29yeSgnc2VxdWVuY2UtdHJhbnNsYXRvcicsICgpID0+IHtcbiAgICB0ZXN0KCdBR0dUQ0NUQ1RUR0FDVFRBR0dDQycsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DKEMpQyg9TylOQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpQ1tDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpQ1tDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUMoQylDKD1PKU5DMig9TykpQ1tDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpQ1tDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xT1AoPU8pKE8pT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKUNbQ0BASF0xTyc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCdBR0dUQ0NUQ1RUR0FDVFRBR0dDQycpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJ2ludmFiYXNpYy9nYWxuYWMxJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NDKE8pQ05DKD1PKUNDQ0MoPU8pTkMoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygnKGludmFiYXNpYylzZ2coaW52YWJhc2ljKShHYWxOQWMtMi1KTkopJyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgnaW52YWJhc2ljL2dhbG5hYzInLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ0MoTylDTkMoPU8pQ0NDQyg9TylOQyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKSc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCcoaW52YWJhc2ljKXNnc2coaW52YWJhc2ljKShHYWxOQWMtMi1KTkopJyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgnaW52YWJhc2ljL2dhbG5hYzMnLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ0MoTylDTkMoPU8pQ0NDQyg9TylOQyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKSc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCcoaW52YWJhc2ljKXNnZ3MoaW52YWJhc2ljKShHYWxOQWMtMi1KTkopJyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgnaW52YWJhc2ljL2dhbG5hYzQnLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ0MoTylDTkMoPU8pQ0NDQyg9TylOQyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKSc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCcoaW52YWJhc2ljKXNnZyhpbnZhYmFzaWMpcyhHYWxOQWMtMi1KTkopJyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgndXNDZkNmVWZHZkFmJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJ3VzQ2ZDZlVmR2ZBZicpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJ3VzQWZzdXNnc2dzZycsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU8nO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygndXNBZnN1c2dzZ3NnJyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgnVWZVZlVmc0Nmc3VhY2cnLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTyc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCdVZlVmVWZzQ2ZzdWFjZycpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJ3N1c3VzdXNhdWFzdScsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPUCg9TykoUylPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygnc3VzdXN1c2F1YXN1JyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgnQ2ZHZkNmc0dmc0NmJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xTyc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCdDZkdmQ2ZzR2ZzQ2YnKSwgZXhwZWN0ZWQpO1xuICAgIH0pKTtcbiAgICB0ZXN0KCdhY2FjYWNzYWNzYWMnLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJ2FjYWNhY3NhY3NhYycpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJ2NjY2dnZ3VzdWcnLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTyc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCdjY2NnZ2d1c3VnJyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgnVWZBZkNmR2ZHZkNmQWZVZicsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygnVWZBZkNmR2ZHZkNmQWZVZicpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJyhpbnZhYmFzaWMpc3VjdUNmdVVmJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU8nO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygnKGludmFiYXNpYylzdWN1Q2Z1VWYnKSwgZXhwZWN0ZWQpO1xuICAgIH0pKTtcbiAgICB0ZXN0KCcoaW52YWJhc2ljKXNBZmdjdWdVZicsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJyhpbnZhYmFzaWMpc0FmZ2N1Z1VmJyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgnKGludmFiYXNpYyljdUNmdVVmc2MnLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xTyc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCcoaW52YWJhc2ljKWN1Q2Z1VWZzYycpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJyhpbnZhYmFzaWMpc2N1c3VzdShHYWxOQWMtMi1KTkopJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ0MoTylDTkMoPU8pQ0NDQyg9TylOQyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKSc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCcoaW52YWJhc2ljKXNjdXN1c3UoR2FsTkFjLTItSk5KKScpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJyhpbnZhYmFzaWMpdXNBZnN1Y3VDZnVVZkFmZ2N1Z1VmZ0NmYWN1c3VzdScsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU8nO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygnKGludmFiYXNpYyl1c0Fmc3VjdUNmdVVmQWZnY3VnVWZnQ2ZhY3VzdXN1JyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgnKGludmFiYXNpYylhc2FjZ0dmdUdmQ2ZBZmFjdWN1YXV1Y2EnLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xTyc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCcoaW52YWJhc2ljKWFzYWNnR2Z1R2ZDZkFmYWN1Y3VhdXVjYScpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJyhpbnZhYmFzaWMpc2NzZ2d1R2ZjQWZBZkNmdWN1YXV1Y3VnYScsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJyhpbnZhYmFzaWMpc2NzZ2d1R2ZjQWZBZkNmdWN1YXV1Y3VnYScpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJyhpbnZhYmFzaWMpc2NzYWFjVWZjVWZBZlVmdWN1Z2dhY3V1YScsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJyhpbnZhYmFzaWMpc2NzYWFjVWZjVWZBZlVmdWN1Z2dhY3V1YScpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJyhpbnZhYmFzaWMpc2FzYWN1Q2Z1QWZVZlVmY3VnZ2FjdXV1YScsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUMoTilOQyg9TylDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJyhpbnZhYmFzaWMpc2FzYWN1Q2Z1QWZVZlVmY3VnZ2FjdXV1YScpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJyhpbnZhYmFzaWMpdXNBZnNjdWcoaW52YWJhc2ljKShHYWxOQWMtMi1KTkopJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oRilbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ0MoTylDTkMoPU8pQ0NDQyg9TylOQyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKScgK1xuICAgICAgICAgICAgJyhDT0NDQyg9TylOQ0NDTkMoPU8pQ0NDQ09DMk9DKENPKUMoTylDKE8pQzJOQyg9TylDKSc7XG4gICAgICAgIGV4cGVjdChzZXF1ZW5jZVRvU21pbGVzKCcoaW52YWJhc2ljKXVzQWZzY3VnKGludmFiYXNpYykoR2FsTkFjLTItSk5KKScpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJyhpbnZhYmFzaWMpc2FzdWFhQ2ZjVWYoR2FsTkFjLTItSk5KKScsICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9ICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DQyhPKUNOQyg9TylDQ0NDKD1PKU5DKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJyhpbnZhYmFzaWMpc2FzdWFhQ2ZjVWYoR2FsTkFjLTItSk5KKScpLCBleHBlY3RlZCk7XG4gICAgfSkpO1xuICAgIHRlc3QoJyhpbnZhYmFzaWMpc2FzdWFhQ2ZjVWZDZlVmdWd1YWd1dWF1YShHYWxOQWMtMi1KTkopJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gJ09bQ0BASF0xQ1tDQEBIXU9bQ0BIXTFDT1AoPU8pKFMpJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DQyhPKUNOQyg9TylDQ0NDKD1PKU5DKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJyhpbnZhYmFzaWMpc2FzdWFhQ2ZjVWZDZlVmdWd1YWd1dWF1YShHYWxOQWMtMi1KTkopJyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgnKGludmFiYXNpYylzY3NhdWNhY2d1VWZHZkNmYWdjY2d1Y3V1YShpbnZhYmFzaWMpKEdhbE5BYy0yLUpOSiknLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQzNOPUNOPUMoTilDPTNOPUMyKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPW0NAQEhdMUNbQ0BASF1PW0NASF0xQ09QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DQyhPKUNOQyg9TylDQ0NDKD1PKU5DKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJyArXG4gICAgICAgICAgICAnKENPQ0NDKD1PKU5DQ0NOQyg9TylDQ0NDT0MyT0MoQ08pQyhPKUMoTylDMk5DKD1PKUMpJztcbiAgICAgICAgZXhwZWN0KHNlcXVlbmNlVG9TbWlsZXMoJyhpbnZhYmFzaWMpc2NzYXVjYWNndVVmR2ZDZmFnY2NndWN1dWEoaW52YWJhc2ljKShHYWxOQWMtMi1KTkopJyksIGV4cGVjdGVkKTtcbiAgICB9KSk7XG4gICAgdGVzdCgnKGludmFiYXNpYylzdXNndXVVZmdDZkNmVWZhY2F1Y3VhY3VhKEdhbE5BYy0yLUpOSiknLCAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSAnT1tDQEBIXTFDW0NAQEhdT1tDQEhdMUNPUCg9TykoUyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShTKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DKE4pTkMoPU8pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049QyhOKU5DKD1PKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoTik9TkMyKD1PKSlbQ0BIXShGKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKE4pPU5DMig9TykpW0NASF0oRilbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyg9TylOQzIoPU8pKVtDQEhdKEYpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDM049Q049QyhOKUM9M049QzIpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkM9Q0MoPU8pTkMyKD1PKSlbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NbQ0BIXTFPW0NAQEhdKE4yQz1DQyhOKT1OQzIoPU8pKVtDQEhdKE9DKVtDQEBIXTFPUCg9TykoTyknICtcbiAgICAgICAgICAgICdPQ1tDQEhdMU9bQ0BASF0oTjJDPUNDKD1PKU5DMig9TykpW0NASF0oT0MpW0NAQEhdMU9QKD1PKShPKScgK1xuICAgICAgICAgICAgJ09DW0NASF0xT1tDQEBIXShOMkMzTj1DTj1DKE4pQz0zTj1DMilbQ0BIXShPQylbQ0BASF0xT1AoPU8pKE8pJyArXG4gICAgICAgICAgICAnT0NDKE8pQ05DKD1PKUNDQ0MoPU8pTkMoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknICtcbiAgICAgICAgICAgICcoQ09DQ0MoPU8pTkNDQ05DKD1PKUNDQ0NPQzJPQyhDTylDKE8pQyhPKUMyTkMoPU8pQyknO1xuICAgICAgICBleHBlY3Qoc2VxdWVuY2VUb1NtaWxlcygnKGludmFiYXNpYylzdXNndXVVZmdDZkNmVWZhY2F1Y3VhY3VhKEdhbE5BYy0yLUpOSiknKSwgZXhwZWN0ZWQpO1xuICAgIH0pKTtcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBERzsiLCJtb2R1bGUuZXhwb3J0cyA9IE9DTDsiLCJtb2R1bGUuZXhwb3J0cyA9IGdyb2s7IiwibW9kdWxlLmV4cG9ydHMgPSB1aTsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHsgcnVuVGVzdHMsIHRlc3RzIH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdGVzdCc7XG5pbXBvcnQgJy4vdGVzdHMvc21pbGVzLXRlc3RzJztcbmV4cG9ydCBjb25zdCBfcGFja2FnZSA9IG5ldyBERy5QYWNrYWdlKCk7XG5leHBvcnQgeyB0ZXN0cyB9O1xuLy9uYW1lOiB0ZXN0XG4vL291dHB1dDogZGF0YWZyYW1lIHJlc3VsdFxuZXhwb3J0IGZ1bmN0aW9uIHRlc3QoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHlpZWxkIHJ1blRlc3RzKCk7XG4gICAgICAgIHJldHVybiBERy5EYXRhRnJhbWUuZnJvbU9iamVjdHMoZGF0YSk7XG4gICAgfSk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=