@gmod/tabix 1.5.0 → 1.5.3

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.
Files changed (56) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +3 -2
  3. package/dist/chunk.js +34 -62
  4. package/dist/chunk.js.map +1 -0
  5. package/dist/csi.d.ts +0 -1
  6. package/dist/csi.js +329 -533
  7. package/dist/csi.js.map +1 -0
  8. package/dist/index.js +12 -36
  9. package/dist/index.js.map +1 -0
  10. package/dist/indexFile.d.ts +1 -1
  11. package/dist/indexFile.js +113 -174
  12. package/dist/indexFile.js.map +1 -0
  13. package/dist/tabixIndexedFile.d.ts +8 -4
  14. package/dist/tabixIndexedFile.js +477 -774
  15. package/dist/tabixIndexedFile.js.map +1 -0
  16. package/dist/tbi.js +313 -485
  17. package/dist/tbi.js.map +1 -0
  18. package/dist/util.js +133 -148
  19. package/dist/util.js.map +1 -0
  20. package/dist/virtualOffset.js +45 -68
  21. package/dist/virtualOffset.js.map +1 -0
  22. package/esm/chunk.d.ts +18 -0
  23. package/esm/chunk.js +33 -0
  24. package/esm/chunk.js.map +1 -0
  25. package/esm/csi.d.ts +71 -0
  26. package/esm/csi.js +230 -0
  27. package/esm/csi.js.map +1 -0
  28. package/esm/index.d.ts +4 -0
  29. package/esm/index.js +5 -0
  30. package/esm/index.js.map +1 -0
  31. package/esm/indexFile.d.ts +32 -0
  32. package/esm/indexFile.js +40 -0
  33. package/esm/indexFile.js.map +1 -0
  34. package/esm/tabixIndexedFile.d.ts +118 -0
  35. package/esm/tabixIndexedFile.js +398 -0
  36. package/esm/tabixIndexedFile.js.map +1 -0
  37. package/esm/tbi.d.ts +45 -0
  38. package/esm/tbi.js +216 -0
  39. package/esm/tbi.js.map +1 -0
  40. package/esm/util.d.ts +25 -0
  41. package/esm/util.js +91 -0
  42. package/esm/util.js.map +1 -0
  43. package/esm/virtualOffset.d.ts +10 -0
  44. package/esm/virtualOffset.js +37 -0
  45. package/esm/virtualOffset.js.map +1 -0
  46. package/package.json +27 -44
  47. package/src/chunk.ts +52 -0
  48. package/src/csi.ts +277 -0
  49. package/src/declare.d.ts +2 -0
  50. package/src/index.ts +5 -0
  51. package/src/indexFile.ts +79 -0
  52. package/src/tabixIndexedFile.ts +519 -0
  53. package/src/tbi.ts +250 -0
  54. package/src/util.ts +103 -0
  55. package/src/virtualOffset.ts +47 -0
  56. package/dist/declare.d.js +0 -2
@@ -1,371 +1,259 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
4
-
5
- var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
6
-
7
- _Object$defineProperty(exports, "__esModule", {
8
- value: true
9
- });
10
-
11
- exports.default = void 0;
12
-
13
- var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/parse-int"));
14
-
15
- var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
16
-
17
- var _now = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/date/now"));
18
-
19
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
20
-
21
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
22
-
23
- var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
24
-
25
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
26
-
27
- var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
28
-
29
- var _abortablePromiseCache = _interopRequireDefault(require("abortable-promise-cache"));
30
-
31
- var _quickLru = _interopRequireDefault(require("quick-lru"));
32
-
33
- var _genericFilehandle = require("generic-filehandle");
34
-
35
- var _bgzfFilehandle = require("@gmod/bgzf-filehandle");
36
-
37
- var _util = require("./util");
38
-
39
- var _tbi = _interopRequireDefault(require("./tbi"));
40
-
41
- var _csi = _interopRequireDefault(require("./csi"));
42
-
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ var abortable_promise_cache_1 = __importDefault(require("abortable-promise-cache"));
43
+ var quick_lru_1 = __importDefault(require("quick-lru"));
44
+ var generic_filehandle_1 = require("generic-filehandle");
45
+ var bgzf_filehandle_1 = require("@gmod/bgzf-filehandle");
46
+ var util_1 = require("./util");
47
+ var tbi_1 = __importDefault(require("./tbi"));
48
+ var csi_1 = __importDefault(require("./csi"));
43
49
  function timeout(time) {
44
- return new _promise.default(function (resolve) {
45
- setTimeout(resolve, time);
46
- });
50
+ return new Promise(function (resolve) {
51
+ setTimeout(resolve, time);
52
+ });
47
53
  }
48
-
49
- var TabixIndexedFile = /*#__PURE__*/function () {
50
- /**
51
- * @param {object} args
52
- * @param {string} [args.path]
53
- * @param {filehandle} [args.filehandle]
54
- * @param {string} [args.tbiPath]
55
- * @param {filehandle} [args.tbiFilehandle]
56
- * @param {string} [args.csiPath]
57
- * @param {filehandle} [args.csiFilehandle]
58
- * @param {chunkSizeLimit} default 50MiB
59
- * @param {function} [args.renameRefSeqs] optional function with sig `string => string` to transform
60
- * reference sequence names for the purpose of indexing and querying. note that the data that is returned is
61
- * not altered, just the names of the reference sequences that are used for querying.
62
- * @param {number} [args.chunkCacheSize] maximum size in bytes of the chunk cache. default 5MB
63
- * @param {number} [args.blockCacheSize] maximum size in bytes of the block cache. default 5MB
64
- */
65
- function TabixIndexedFile(_ref) {
66
- var path = _ref.path,
67
- filehandle = _ref.filehandle,
68
- tbiPath = _ref.tbiPath,
69
- tbiFilehandle = _ref.tbiFilehandle,
70
- csiPath = _ref.csiPath,
71
- csiFilehandle = _ref.csiFilehandle,
72
- _ref$chunkSizeLimit = _ref.chunkSizeLimit,
73
- chunkSizeLimit = _ref$chunkSizeLimit === void 0 ? 50000000 : _ref$chunkSizeLimit,
74
- _ref$renameRefSeqs = _ref.renameRefSeqs,
75
- renameRefSeqs = _ref$renameRefSeqs === void 0 ? function (n) {
76
- return n;
77
- } : _ref$renameRefSeqs,
78
- _ref$chunkCacheSize = _ref.chunkCacheSize,
79
- chunkCacheSize = _ref$chunkCacheSize === void 0 ? 5 * Math.pow(2, 20) : _ref$chunkCacheSize;
80
- (0, _classCallCheck2.default)(this, TabixIndexedFile);
81
- (0, _defineProperty2.default)(this, "filehandle", void 0);
82
- (0, _defineProperty2.default)(this, "index", void 0);
83
- (0, _defineProperty2.default)(this, "chunkSizeLimit", void 0);
84
- (0, _defineProperty2.default)(this, "renameRefSeq", void 0);
85
- (0, _defineProperty2.default)(this, "chunkCache", void 0);
86
- if (filehandle) this.filehandle = filehandle;else if (path) this.filehandle = new _genericFilehandle.LocalFile(path);else throw new TypeError('must provide either filehandle or path');
87
- if (tbiFilehandle) this.index = new _tbi.default({
88
- filehandle: tbiFilehandle,
89
- renameRefSeqs: renameRefSeqs
90
- });else if (csiFilehandle) this.index = new _csi.default({
91
- filehandle: csiFilehandle,
92
- renameRefSeqs: renameRefSeqs
93
- });else if (tbiPath) this.index = new _tbi.default({
94
- filehandle: new _genericFilehandle.LocalFile(tbiPath),
95
- renameRefSeqs: renameRefSeqs
96
- });else if (csiPath) this.index = new _csi.default({
97
- filehandle: new _genericFilehandle.LocalFile(csiPath),
98
- renameRefSeqs: renameRefSeqs
99
- });else if (path) {
100
- this.index = new _tbi.default({
101
- filehandle: new _genericFilehandle.LocalFile("".concat(path, ".tbi")),
102
- renameRefSeqs: renameRefSeqs
103
- });
104
- } else {
105
- throw new TypeError('must provide one of tbiFilehandle, tbiPath, csiFilehandle, or csiPath');
54
+ var TabixIndexedFile = /** @class */ (function () {
55
+ /**
56
+ * @param {object} args
57
+ * @param {string} [args.path]
58
+ * @param {filehandle} [args.filehandle]
59
+ * @param {string} [args.tbiPath]
60
+ * @param {filehandle} [args.tbiFilehandle]
61
+ * @param {string} [args.csiPath]
62
+ * @param {filehandle} [args.csiFilehandle]
63
+ * @param {chunkSizeLimit} default 50MiB
64
+ * @param {function} [args.renameRefSeqs] optional function with sig `string => string` to transform
65
+ * reference sequence names for the purpose of indexing and querying. note that the data that is returned is
66
+ * not altered, just the names of the reference sequences that are used for querying.
67
+ * @param {number} [args.chunkCacheSize] maximum size in bytes of the chunk cache. default 5MB
68
+ * @param {number} [args.blockCacheSize] maximum size in bytes of the block cache. default 5MB
69
+ */
70
+ function TabixIndexedFile(_a) {
71
+ var path = _a.path, filehandle = _a.filehandle, tbiPath = _a.tbiPath, tbiFilehandle = _a.tbiFilehandle, csiPath = _a.csiPath, csiFilehandle = _a.csiFilehandle, _b = _a.chunkSizeLimit, chunkSizeLimit = _b === void 0 ? 50000000 : _b, _c = _a.renameRefSeqs, renameRefSeqs = _c === void 0 ? function (n) { return n; } : _c, _d = _a.chunkCacheSize, chunkCacheSize = _d === void 0 ? 5 * Math.pow(2, 20) : _d;
72
+ if (filehandle) {
73
+ this.filehandle = filehandle;
74
+ }
75
+ else if (path) {
76
+ this.filehandle = new generic_filehandle_1.LocalFile(path);
77
+ }
78
+ else {
79
+ throw new TypeError('must provide either filehandle or path');
80
+ }
81
+ if (tbiFilehandle) {
82
+ this.index = new tbi_1.default({
83
+ filehandle: tbiFilehandle,
84
+ renameRefSeqs: renameRefSeqs,
85
+ });
86
+ }
87
+ else if (csiFilehandle) {
88
+ this.index = new csi_1.default({
89
+ filehandle: csiFilehandle,
90
+ renameRefSeqs: renameRefSeqs,
91
+ });
92
+ }
93
+ else if (tbiPath) {
94
+ this.index = new tbi_1.default({
95
+ filehandle: new generic_filehandle_1.LocalFile(tbiPath),
96
+ renameRefSeqs: renameRefSeqs,
97
+ });
98
+ }
99
+ else if (csiPath) {
100
+ this.index = new csi_1.default({
101
+ filehandle: new generic_filehandle_1.LocalFile(csiPath),
102
+ renameRefSeqs: renameRefSeqs,
103
+ });
104
+ }
105
+ else if (path) {
106
+ this.index = new tbi_1.default({
107
+ filehandle: new generic_filehandle_1.LocalFile("".concat(path, ".tbi")),
108
+ renameRefSeqs: renameRefSeqs,
109
+ });
110
+ }
111
+ else {
112
+ throw new TypeError('must provide one of tbiFilehandle, tbiPath, csiFilehandle, or csiPath');
113
+ }
114
+ this.chunkSizeLimit = chunkSizeLimit;
115
+ this.renameRefSeq = renameRefSeqs;
116
+ this.chunkCache = new abortable_promise_cache_1.default({
117
+ cache: new quick_lru_1.default({
118
+ maxSize: Math.floor(chunkCacheSize / (1 << 16)),
119
+ }),
120
+ fill: this.readChunk.bind(this),
121
+ });
106
122
  }
107
- this.chunkSizeLimit = chunkSizeLimit;
108
- this.renameRefSeq = renameRefSeqs;
109
- this.chunkCache = new _abortablePromiseCache.default({
110
- cache: new _quickLru.default({
111
- maxSize: Math.floor(chunkCacheSize / (1 << 16))
112
- }),
113
- fill: this.readChunk.bind(this)
114
- });
115
- }
116
- /**
117
- * @param {string} refName name of the reference sequence
118
- * @param {number} start start of the region (in 0-based half-open coordinates)
119
- * @param {number} end end of the region (in 0-based half-open coordinates)
120
- * @param {function|object} lineCallback callback called for each line in the region. can also pass a object param containing obj.lineCallback, obj.signal, etc
121
- * @returns {Promise} resolved when the whole read is finished, rejected on error
122
- */
123
-
124
-
125
- (0, _createClass2.default)(TabixIndexedFile, [{
126
- key: "getLines",
127
- value: function () {
128
- var _getLines = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(refName, start, end, opts) {
129
- var signal, options, callback, metadata, chunks, i, size, last, chunkNum, previousStartCoordinate, c, _yield$this$chunkCach, buffer, cpositions, dpositions, lines, blockStart, pos, _i, line, _this$checkLine, startCoordinate, overlaps;
130
-
131
- return _regenerator.default.wrap(function _callee$(_context) {
132
- while (1) {
133
- switch (_context.prev = _context.next) {
134
- case 0:
135
- options = {};
136
-
137
- if (!(typeof opts === 'undefined')) {
138
- _context.next = 3;
139
- break;
140
- }
141
-
142
- throw new TypeError('line callback must be provided');
143
-
144
- case 3:
145
- if (typeof opts === 'function') callback = opts;else {
146
- options = opts;
147
- callback = opts.lineCallback;
148
- }
149
-
150
- if (!(refName === undefined)) {
151
- _context.next = 6;
152
- break;
153
- }
154
-
155
- throw new TypeError('must provide a reference sequence name');
156
-
157
- case 6:
158
- if (callback) {
159
- _context.next = 8;
160
- break;
161
- }
162
-
163
- throw new TypeError('line callback must be provided');
164
-
165
- case 8:
166
- _context.next = 10;
167
- return this.index.getMetadata(options);
168
-
169
- case 10:
170
- metadata = _context.sent;
171
- (0, _util.checkAbortSignal)(signal);
172
-
173
- if (!start) {
174
- start = 0;
175
- }
176
-
177
- if (!end) {
178
- end = metadata.maxRefLength;
179
- }
180
-
181
- if (start <= end) {
182
- _context.next = 16;
183
- break;
184
- }
185
-
186
- throw new TypeError('invalid start and end coordinates. start must be less than or equal to end');
187
-
188
- case 16:
189
- if (!(start === end)) {
190
- _context.next = 18;
191
- break;
192
- }
193
-
194
- return _context.abrupt("return");
195
-
196
- case 18:
197
- _context.next = 20;
198
- return this.index.blocksForRange(refName, start, end, options);
199
-
200
- case 20:
201
- chunks = _context.sent;
202
- (0, _util.checkAbortSignal)(signal); // check the chunks for any that are over the size limit. if
203
- // any are, don't fetch any of them
204
-
205
- i = 0;
206
-
207
- case 23:
208
- if (!(i < chunks.length)) {
209
- _context.next = 30;
210
- break;
211
- }
212
-
213
- size = chunks[i].fetchedSize();
214
-
215
- if (!(size > this.chunkSizeLimit)) {
216
- _context.next = 27;
217
- break;
218
- }
219
-
220
- throw new Error("Too much data. Chunk size ".concat(size.toLocaleString(), " bytes exceeds chunkSizeLimit of ").concat(this.chunkSizeLimit.toLocaleString(), "."));
221
-
222
- case 27:
223
- i += 1;
224
- _context.next = 23;
225
- break;
226
-
227
- case 30:
228
- // now go through each chunk and parse and filter the lines out of it
229
- last = (0, _now.default)();
230
- chunkNum = 0;
231
-
232
- case 32:
233
- if (!(chunkNum < chunks.length)) {
234
- _context.next = 72;
235
- break;
236
- }
237
-
238
- previousStartCoordinate = void 0;
239
- c = chunks[chunkNum];
240
- _context.next = 37;
241
- return this.chunkCache.get(c.toString(), c, signal);
242
-
243
- case 37:
244
- _yield$this$chunkCach = _context.sent;
245
- buffer = _yield$this$chunkCach.buffer;
246
- cpositions = _yield$this$chunkCach.cpositions;
247
- dpositions = _yield$this$chunkCach.dpositions;
248
- lines = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8').decode(buffer) : buffer.toString()).split('\n');
249
- lines.pop();
250
- (0, _util.checkAbortSignal)(signal);
251
- blockStart = c.minv.dataPosition;
252
- pos = void 0;
253
- _i = 0;
254
-
255
- case 47:
256
- if (!(_i < lines.length)) {
257
- _context.next = 69;
258
- break;
259
- }
260
-
261
- line = lines[_i];
262
-
263
- for (pos = 0; blockStart >= dpositions[pos]; pos += 1) {
264
- ;
265
- } // filter the line for whether it is within the requested range
266
-
267
-
268
- _this$checkLine = this.checkLine(metadata, refName, start, end, line), startCoordinate = _this$checkLine.startCoordinate, overlaps = _this$checkLine.overlaps; // do a small check just to make sure that the lines are really sorted by start coordinate
269
-
270
- if (!(previousStartCoordinate !== undefined && startCoordinate !== undefined && previousStartCoordinate > startCoordinate)) {
271
- _context.next = 53;
272
- break;
273
- }
274
-
275
- throw new Error("Lines not sorted by start coordinate (".concat(previousStartCoordinate, " > ").concat(startCoordinate, "), this file is not usable with Tabix."));
276
-
277
- case 53:
278
- previousStartCoordinate = startCoordinate;
279
-
280
- if (!overlaps) {
281
- _context.next = 58;
282
- break;
283
- }
284
-
285
- callback(line.trim(), // cpositions[pos] refers to actual file offset of a bgzip block boundaries
286
- //
287
- // we multiply by (1 <<8) in order to make sure each block has a "unique"
288
- // address space so that data in that block could never overlap
289
- //
290
- // then the blockStart-dpositions is an uncompressed file offset from
291
- // that bgzip block boundary, and since the cpositions are multiplied by
292
- // (1 << 8) these uncompressed offsets get a unique space
293
- cpositions[pos] * (1 << 8) + (blockStart - dpositions[pos]));
294
- _context.next = 60;
295
- break;
296
-
297
- case 58:
298
- if (!(startCoordinate !== undefined && startCoordinate >= end)) {
299
- _context.next = 60;
300
- break;
301
- }
302
-
303
- return _context.abrupt("return");
304
-
305
- case 60:
306
- blockStart += line.length + 1; // yield if we have emitted beyond the yield limit
307
-
308
- if (!(last - (0, _now.default)() > 500)) {
309
- _context.next = 66;
310
- break;
123
+ /**
124
+ * @param {string} refName name of the reference sequence
125
+ * @param {number} start start of the region (in 0-based half-open coordinates)
126
+ * @param {number} end end of the region (in 0-based half-open coordinates)
127
+ * @param {function|object} lineCallback callback called for each line in the region. can also pass a object param containing obj.lineCallback, obj.signal, etc
128
+ * @returns {Promise} resolved when the whole read is finished, rejected on error
129
+ */
130
+ TabixIndexedFile.prototype.getLines = function (refName, start, end, opts) {
131
+ return __awaiter(this, void 0, void 0, function () {
132
+ var signal, options, callback, metadata, chunks, i, size, last, chunkNum, previousStartCoordinate, c, _a, buffer, cpositions, dpositions, lines, blockStart, pos, i, line, _b, startCoordinate, overlaps;
133
+ return __generator(this, function (_c) {
134
+ switch (_c.label) {
135
+ case 0:
136
+ options = {};
137
+ if (typeof opts === 'undefined') {
138
+ throw new TypeError('line callback must be provided');
139
+ }
140
+ if (typeof opts === 'function') {
141
+ callback = opts;
142
+ }
143
+ else {
144
+ options = opts;
145
+ callback = opts.lineCallback;
146
+ }
147
+ if (refName === undefined) {
148
+ throw new TypeError('must provide a reference sequence name');
149
+ }
150
+ if (!callback) {
151
+ throw new TypeError('line callback must be provided');
152
+ }
153
+ return [4 /*yield*/, this.index.getMetadata(options)];
154
+ case 1:
155
+ metadata = _c.sent();
156
+ (0, util_1.checkAbortSignal)(signal);
157
+ if (!start) {
158
+ start = 0;
159
+ }
160
+ if (!end) {
161
+ end = metadata.maxRefLength;
162
+ }
163
+ if (!(start <= end)) {
164
+ throw new TypeError('invalid start and end coordinates. start must be less than or equal to end');
165
+ }
166
+ if (start === end) {
167
+ return [2 /*return*/];
168
+ }
169
+ return [4 /*yield*/, this.index.blocksForRange(refName, start, end, options)];
170
+ case 2:
171
+ chunks = _c.sent();
172
+ (0, util_1.checkAbortSignal)(signal);
173
+ // check the chunks for any that are over the size limit. if
174
+ // any are, don't fetch any of them
175
+ for (i = 0; i < chunks.length; i += 1) {
176
+ size = chunks[i].fetchedSize();
177
+ if (size > this.chunkSizeLimit) {
178
+ throw new Error("Too much data. Chunk size ".concat(size.toLocaleString(), " bytes exceeds chunkSizeLimit of ").concat(this.chunkSizeLimit.toLocaleString(), "."));
179
+ }
180
+ }
181
+ last = Date.now();
182
+ chunkNum = 0;
183
+ _c.label = 3;
184
+ case 3:
185
+ if (!(chunkNum < chunks.length)) return [3 /*break*/, 9];
186
+ previousStartCoordinate = void 0;
187
+ c = chunks[chunkNum];
188
+ return [4 /*yield*/, this.chunkCache.get(c.toString(), c, signal)];
189
+ case 4:
190
+ _a = _c.sent(), buffer = _a.buffer, cpositions = _a.cpositions, dpositions = _a.dpositions;
191
+ lines = (typeof TextDecoder !== 'undefined'
192
+ ? new TextDecoder('utf-8').decode(buffer)
193
+ : buffer.toString()).split('\n');
194
+ lines.pop();
195
+ (0, util_1.checkAbortSignal)(signal);
196
+ blockStart = c.minv.dataPosition;
197
+ pos = void 0;
198
+ i = 0;
199
+ _c.label = 5;
200
+ case 5:
201
+ if (!(i < lines.length)) return [3 /*break*/, 8];
202
+ line = lines[i];
203
+ for (pos = 0; blockStart >= dpositions[pos]; pos += 1) { }
204
+ _b = this.checkLine(metadata, refName, start, end, line), startCoordinate = _b.startCoordinate, overlaps = _b.overlaps;
205
+ // do a small check just to make sure that the lines are really sorted by start coordinate
206
+ if (previousStartCoordinate !== undefined &&
207
+ startCoordinate !== undefined &&
208
+ previousStartCoordinate > startCoordinate) {
209
+ throw new Error("Lines not sorted by start coordinate (".concat(previousStartCoordinate, " > ").concat(startCoordinate, "), this file is not usable with Tabix."));
210
+ }
211
+ previousStartCoordinate = startCoordinate;
212
+ if (overlaps) {
213
+ callback(line.trim(),
214
+ // cpositions[pos] refers to actual file offset of a bgzip block boundaries
215
+ //
216
+ // we multiply by (1 <<8) in order to make sure each block has a "unique"
217
+ // address space so that data in that block could never overlap
218
+ //
219
+ // then the blockStart-dpositions is an uncompressed file offset from
220
+ // that bgzip block boundary, and since the cpositions are multiplied by
221
+ // (1 << 8) these uncompressed offsets get a unique space
222
+ cpositions[pos] * (1 << 8) + (blockStart - dpositions[pos]));
223
+ }
224
+ else if (startCoordinate !== undefined && startCoordinate >= end) {
225
+ // the lines were overlapping the region, but now have stopped, so
226
+ // we must be at the end of the relevant data and we can stop
227
+ // processing data now
228
+ return [2 /*return*/];
229
+ }
230
+ blockStart += line.length + 1;
231
+ if (!(last - Date.now() > 500)) return [3 /*break*/, 7];
232
+ last = Date.now();
233
+ (0, util_1.checkAbortSignal)(signal);
234
+ return [4 /*yield*/, timeout(1)];
235
+ case 6:
236
+ _c.sent();
237
+ _c.label = 7;
238
+ case 7:
239
+ i += 1;
240
+ return [3 /*break*/, 5];
241
+ case 8:
242
+ chunkNum += 1;
243
+ return [3 /*break*/, 3];
244
+ case 9: return [2 /*return*/];
311
245
  }
312
-
313
- last = (0, _now.default)();
314
- (0, _util.checkAbortSignal)(signal);
315
- _context.next = 66;
316
- return timeout(1);
317
-
318
- case 66:
319
- _i += 1;
320
- _context.next = 47;
321
- break;
322
-
323
- case 69:
324
- chunkNum += 1;
325
- _context.next = 32;
326
- break;
327
-
328
- case 72:
329
- case "end":
330
- return _context.stop();
331
- }
332
- }
333
- }, _callee, this);
334
- }));
335
-
336
- function getLines(_x, _x2, _x3, _x4) {
337
- return _getLines.apply(this, arguments);
338
- }
339
-
340
- return getLines;
341
- }()
342
- }, {
343
- key: "getMetadata",
344
- value: function () {
345
- var _getMetadata = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
346
- var opts,
347
- _args2 = arguments;
348
- return _regenerator.default.wrap(function _callee2$(_context2) {
349
- while (1) {
350
- switch (_context2.prev = _context2.next) {
351
- case 0:
352
- opts = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : {};
353
- return _context2.abrupt("return", this.index.getMetadata(opts));
354
-
355
- case 2:
356
- case "end":
357
- return _context2.stop();
358
- }
359
- }
360
- }, _callee2, this);
361
- }));
362
-
363
- function getMetadata() {
364
- return _getMetadata.apply(this, arguments);
365
- }
366
-
367
- return getMetadata;
368
- }()
246
+ });
247
+ });
248
+ };
249
+ TabixIndexedFile.prototype.getMetadata = function (opts) {
250
+ if (opts === void 0) { opts = {}; }
251
+ return __awaiter(this, void 0, void 0, function () {
252
+ return __generator(this, function (_a) {
253
+ return [2 /*return*/, this.index.getMetadata(opts)];
254
+ });
255
+ });
256
+ };
369
257
  /**
370
258
  * get a buffer containing the "header" region of
371
259
  * the file, which are the bytes up to the first
@@ -373,156 +261,78 @@ var TabixIndexedFile = /*#__PURE__*/function () {
373
261
  *
374
262
  * @returns {Promise} for a buffer
375
263
  */
376
-
377
- }, {
378
- key: "getHeaderBuffer",
379
- value: function () {
380
- var _getHeaderBuffer = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
381
- var opts,
382
- _yield$this$getMetada,
383
- firstDataLine,
384
- metaChar,
385
- maxBlockSize,
386
- maxFetch,
387
- bytes,
388
- lastNewline,
389
- newlineByte,
390
- metaByte,
391
- i,
392
- _args3 = arguments;
393
-
394
- return _regenerator.default.wrap(function _callee3$(_context3) {
395
- while (1) {
396
- switch (_context3.prev = _context3.next) {
397
- case 0:
398
- opts = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {};
399
- _context3.next = 3;
400
- return this.getMetadata(opts);
401
-
402
- case 3:
403
- _yield$this$getMetada = _context3.sent;
404
- firstDataLine = _yield$this$getMetada.firstDataLine;
405
- metaChar = _yield$this$getMetada.metaChar;
406
- maxBlockSize = _yield$this$getMetada.maxBlockSize;
407
- (0, _util.checkAbortSignal)(opts.signal);
408
- maxFetch = firstDataLine && firstDataLine.blockPosition ? firstDataLine.blockPosition + maxBlockSize : maxBlockSize; // TODO: what if we don't have a firstDataLine, and the header
409
- // actually takes up more than one block? this case is not covered here
410
-
411
- _context3.next = 11;
412
- return this._readRegion(0, maxFetch, opts);
413
-
414
- case 11:
415
- bytes = _context3.sent;
416
- (0, _util.checkAbortSignal)(opts.signal);
417
- _context3.prev = 13;
418
- _context3.next = 16;
419
- return (0, _bgzfFilehandle.unzip)(bytes);
420
-
421
- case 16:
422
- bytes = _context3.sent;
423
- _context3.next = 23;
424
- break;
425
-
426
- case 19:
427
- _context3.prev = 19;
428
- _context3.t0 = _context3["catch"](13);
429
- console.error(_context3.t0);
430
- throw new Error("error decompressing block ".concat(_context3.t0.code, " at 0 (length ").concat(maxFetch, ") ").concat(_context3.t0));
431
-
432
- case 23:
433
- if (!metaChar) {
434
- _context3.next = 36;
435
- break;
436
- }
437
-
438
- // trim backward from the end
439
- lastNewline = -1;
440
- newlineByte = '\n'.charCodeAt(0);
441
- metaByte = metaChar.charCodeAt(0);
442
- i = 0;
443
-
444
- case 28:
445
- if (!(i < bytes.length)) {
446
- _context3.next = 35;
447
- break;
448
- }
449
-
450
- if (!(i === lastNewline + 1 && bytes[i] !== metaByte)) {
451
- _context3.next = 31;
452
- break;
264
+ TabixIndexedFile.prototype.getHeaderBuffer = function (opts) {
265
+ if (opts === void 0) { opts = {}; }
266
+ return __awaiter(this, void 0, void 0, function () {
267
+ var _a, firstDataLine, metaChar, maxBlockSize, maxFetch, bytes, e_1, lastNewline, newlineByte, metaByte, i;
268
+ return __generator(this, function (_b) {
269
+ switch (_b.label) {
270
+ case 0: return [4 /*yield*/, this.getMetadata(opts)];
271
+ case 1:
272
+ _a = _b.sent(), firstDataLine = _a.firstDataLine, metaChar = _a.metaChar, maxBlockSize = _a.maxBlockSize;
273
+ (0, util_1.checkAbortSignal)(opts.signal);
274
+ maxFetch = firstDataLine && firstDataLine.blockPosition
275
+ ? firstDataLine.blockPosition + maxBlockSize
276
+ : maxBlockSize;
277
+ return [4 /*yield*/, this._readRegion(0, maxFetch, opts)];
278
+ case 2:
279
+ bytes = _b.sent();
280
+ (0, util_1.checkAbortSignal)(opts.signal);
281
+ _b.label = 3;
282
+ case 3:
283
+ _b.trys.push([3, 5, , 6]);
284
+ return [4 /*yield*/, (0, bgzf_filehandle_1.unzip)(bytes)];
285
+ case 4:
286
+ bytes = _b.sent();
287
+ return [3 /*break*/, 6];
288
+ case 5:
289
+ e_1 = _b.sent();
290
+ console.error(e_1);
291
+ throw new Error(
292
+ //@ts-ignore
293
+ "error decompressing block ".concat(e_1.code, " at 0 (length ").concat(maxFetch, ") ").concat(e_1));
294
+ case 6:
295
+ // trim off lines after the last non-meta line
296
+ if (metaChar) {
297
+ lastNewline = -1;
298
+ newlineByte = '\n'.charCodeAt(0);
299
+ metaByte = metaChar.charCodeAt(0);
300
+ for (i = 0; i < bytes.length; i += 1) {
301
+ if (i === lastNewline + 1 && bytes[i] !== metaByte) {
302
+ break;
303
+ }
304
+ if (bytes[i] === newlineByte) {
305
+ lastNewline = i;
306
+ }
307
+ }
308
+ bytes = bytes.slice(0, lastNewline + 1);
309
+ }
310
+ return [2 /*return*/, bytes];
453
311
  }
454
-
455
- return _context3.abrupt("break", 35);
456
-
457
- case 31:
458
- if (bytes[i] === newlineByte) lastNewline = i;
459
-
460
- case 32:
461
- i += 1;
462
- _context3.next = 28;
463
- break;
464
-
465
- case 35:
466
- bytes = bytes.slice(0, lastNewline + 1);
467
-
468
- case 36:
469
- return _context3.abrupt("return", bytes);
470
-
471
- case 37:
472
- case "end":
473
- return _context3.stop();
474
- }
475
- }
476
- }, _callee3, this, [[13, 19]]);
477
- }));
478
-
479
- function getHeaderBuffer() {
480
- return _getHeaderBuffer.apply(this, arguments);
481
- }
482
-
483
- return getHeaderBuffer;
484
- }()
312
+ });
313
+ });
314
+ };
485
315
  /**
486
316
  * get a string containing the "header" region of the
487
317
  * file, is the portion up to the first non-meta line
488
318
  *
489
319
  * @returns {Promise} for a string
490
320
  */
491
-
492
- }, {
493
- key: "getHeader",
494
- value: function () {
495
- var _getHeader = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4() {
496
- var opts,
497
- bytes,
498
- _args4 = arguments;
499
- return _regenerator.default.wrap(function _callee4$(_context4) {
500
- while (1) {
501
- switch (_context4.prev = _context4.next) {
502
- case 0:
503
- opts = _args4.length > 0 && _args4[0] !== undefined ? _args4[0] : {};
504
- _context4.next = 3;
505
- return this.getHeaderBuffer(opts);
506
-
507
- case 3:
508
- bytes = _context4.sent;
509
- (0, _util.checkAbortSignal)(opts.signal);
510
- return _context4.abrupt("return", bytes.toString('utf8'));
511
-
512
- case 6:
513
- case "end":
514
- return _context4.stop();
515
- }
516
- }
517
- }, _callee4, this);
518
- }));
519
-
520
- function getHeader() {
521
- return _getHeader.apply(this, arguments);
522
- }
523
-
524
- return getHeader;
525
- }()
321
+ TabixIndexedFile.prototype.getHeader = function (opts) {
322
+ if (opts === void 0) { opts = {}; }
323
+ return __awaiter(this, void 0, void 0, function () {
324
+ var bytes;
325
+ return __generator(this, function (_a) {
326
+ switch (_a.label) {
327
+ case 0: return [4 /*yield*/, this.getHeaderBuffer(opts)];
328
+ case 1:
329
+ bytes = _a.sent();
330
+ (0, util_1.checkAbortSignal)(opts.signal);
331
+ return [2 /*return*/, bytes.toString('utf8')];
332
+ }
333
+ });
334
+ });
335
+ };
526
336
  /**
527
337
  * get an array of reference sequence names, in the order in which
528
338
  * they occur in the file.
@@ -531,40 +341,20 @@ var TabixIndexedFile = /*#__PURE__*/function () {
531
341
  *
532
342
  * @returns {Promise} for an array of string sequence names
533
343
  */
534
-
535
- }, {
536
- key: "getReferenceSequenceNames",
537
- value: function () {
538
- var _getReferenceSequenceNames = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5() {
539
- var opts,
540
- metadata,
541
- _args5 = arguments;
542
- return _regenerator.default.wrap(function _callee5$(_context5) {
543
- while (1) {
544
- switch (_context5.prev = _context5.next) {
545
- case 0:
546
- opts = _args5.length > 0 && _args5[0] !== undefined ? _args5[0] : {};
547
- _context5.next = 3;
548
- return this.getMetadata(opts);
549
-
550
- case 3:
551
- metadata = _context5.sent;
552
- return _context5.abrupt("return", metadata.refIdToName);
553
-
554
- case 5:
555
- case "end":
556
- return _context5.stop();
557
- }
558
- }
559
- }, _callee5, this);
560
- }));
561
-
562
- function getReferenceSequenceNames() {
563
- return _getReferenceSequenceNames.apply(this, arguments);
564
- }
565
-
566
- return getReferenceSequenceNames;
567
- }()
344
+ TabixIndexedFile.prototype.getReferenceSequenceNames = function (opts) {
345
+ if (opts === void 0) { opts = {}; }
346
+ return __awaiter(this, void 0, void 0, function () {
347
+ var metadata;
348
+ return __generator(this, function (_a) {
349
+ switch (_a.label) {
350
+ case 0: return [4 /*yield*/, this.getMetadata(opts)];
351
+ case 1:
352
+ metadata = _a.sent();
353
+ return [2 /*return*/, metadata.refIdToName];
354
+ }
355
+ });
356
+ });
357
+ };
568
358
  /**
569
359
  * @param {object} metadata metadata object from the parsed index,
570
360
  * containing columnNumbers, metaChar, and format
@@ -575,253 +365,166 @@ var TabixIndexedFile = /*#__PURE__*/function () {
575
365
  * @returns {object} like `{startCoordinate, overlaps}`. overlaps is boolean,
576
366
  * true if line is a data line that overlaps the given region
577
367
  */
578
-
579
- }, {
580
- key: "checkLine",
581
- value: function checkLine(_ref2, regionRefName, regionStart, regionEnd, line) {
582
- var columnNumbers = _ref2.columnNumbers,
583
- metaChar = _ref2.metaChar,
584
- coordinateType = _ref2.coordinateType,
585
- format = _ref2.format;
586
-
587
- // skip meta lines
588
- if (line.charAt(0) === metaChar) {
589
- return {
590
- overlaps: false
591
- };
592
- } // check ref/start/end using column metadata from index
593
-
594
-
595
- var ref = columnNumbers.ref,
596
- start = columnNumbers.start,
597
- end = columnNumbers.end;
598
- if (!ref) ref = 0;
599
- if (!start) start = 0;
600
- if (!end) end = 0;
601
- if (format === 'VCF') end = 8;
602
- var maxColumn = Math.max(ref, start, end); // this code is kind of complex, but it is fairly fast.
603
- // basically, we want to avoid doing a split, because if the lines are really long
604
- // that could lead to us allocating a bunch of extra memory, which is slow
605
-
606
- var currentColumnNumber = 1; // cols are numbered starting at 1 in the index metadata
607
-
608
- var currentColumnStart = 0;
609
- var refSeq = '';
610
- var startCoordinate = -Infinity;
611
-
612
- for (var i = 0; i < line.length + 1; i += 1) {
613
- if (line[i] === '\t' || i === line.length) {
614
- if (currentColumnNumber === ref) {
615
- if (this.renameRefSeq(line.slice(currentColumnStart, i)) !== regionRefName) {
616
- return {
617
- overlaps: false
618
- };
619
- }
620
- } else if (currentColumnNumber === start) {
621
- startCoordinate = (0, _parseInt2.default)(line.slice(currentColumnStart, i), 10); // we convert to 0-based-half-open
622
-
623
- if (coordinateType === '1-based-closed') {
624
- startCoordinate -= 1;
625
- }
626
-
627
- if (startCoordinate >= regionEnd) {
628
- return {
629
- startCoordinate: startCoordinate,
630
- overlaps: false
631
- };
632
- }
633
-
634
- if (end === 0 || end === start) {
635
- // if we have no end, we assume the feature is 1 bp long
636
- if (startCoordinate + 1 <= regionStart) {
637
- return {
638
- startCoordinate: startCoordinate,
639
- overlaps: false
640
- };
641
- }
642
- }
643
- } else if (format === 'VCF' && currentColumnNumber === 4) {
644
- refSeq = line.slice(currentColumnStart, i);
645
- } else if (currentColumnNumber === end) {
646
- var endCoordinate = void 0; // this will never match if there is no end column
647
-
648
- if (format === 'VCF') {
649
- endCoordinate = this._getVcfEnd(startCoordinate, refSeq, line.slice(currentColumnStart, i));
650
- } else {
651
- endCoordinate = (0, _parseInt2.default)(line.slice(currentColumnStart, i), 10);
368
+ TabixIndexedFile.prototype.checkLine = function (_a, regionRefName, regionStart, regionEnd, line) {
369
+ var columnNumbers = _a.columnNumbers, metaChar = _a.metaChar, coordinateType = _a.coordinateType, format = _a.format;
370
+ // skip meta lines
371
+ if (line.charAt(0) === metaChar) {
372
+ return { overlaps: false };
373
+ }
374
+ // check ref/start/end using column metadata from index
375
+ var ref = columnNumbers.ref, start = columnNumbers.start, end = columnNumbers.end;
376
+ if (!ref) {
377
+ ref = 0;
378
+ }
379
+ if (!start) {
380
+ start = 0;
381
+ }
382
+ if (!end) {
383
+ end = 0;
384
+ }
385
+ if (format === 'VCF') {
386
+ end = 8;
387
+ }
388
+ var maxColumn = Math.max(ref, start, end);
389
+ // this code is kind of complex, but it is fairly fast.
390
+ // basically, we want to avoid doing a split, because if the lines are really long
391
+ // that could lead to us allocating a bunch of extra memory, which is slow
392
+ var currentColumnNumber = 1; // cols are numbered starting at 1 in the index metadata
393
+ var currentColumnStart = 0;
394
+ var refSeq = '';
395
+ var startCoordinate = -Infinity;
396
+ for (var i = 0; i < line.length + 1; i += 1) {
397
+ if (line[i] === '\t' || i === line.length) {
398
+ if (currentColumnNumber === ref) {
399
+ if (this.renameRefSeq(line.slice(currentColumnStart, i)) !==
400
+ regionRefName) {
401
+ return { overlaps: false };
402
+ }
403
+ }
404
+ else if (currentColumnNumber === start) {
405
+ startCoordinate = parseInt(line.slice(currentColumnStart, i), 10);
406
+ // we convert to 0-based-half-open
407
+ if (coordinateType === '1-based-closed') {
408
+ startCoordinate -= 1;
409
+ }
410
+ if (startCoordinate >= regionEnd) {
411
+ return { startCoordinate: startCoordinate, overlaps: false };
412
+ }
413
+ if (end === 0 || end === start) {
414
+ // if we have no end, we assume the feature is 1 bp long
415
+ if (startCoordinate + 1 <= regionStart) {
416
+ return { startCoordinate: startCoordinate, overlaps: false };
417
+ }
418
+ }
419
+ }
420
+ else if (format === 'VCF' && currentColumnNumber === 4) {
421
+ refSeq = line.slice(currentColumnStart, i);
422
+ }
423
+ else if (currentColumnNumber === end) {
424
+ var endCoordinate
425
+ // this will never match if there is no end column
426
+ = void 0;
427
+ // this will never match if there is no end column
428
+ if (format === 'VCF') {
429
+ endCoordinate = this._getVcfEnd(startCoordinate, refSeq, line.slice(currentColumnStart, i));
430
+ }
431
+ else {
432
+ endCoordinate = parseInt(line.slice(currentColumnStart, i), 10);
433
+ }
434
+ if (endCoordinate <= regionStart) {
435
+ return { overlaps: false };
436
+ }
437
+ }
438
+ currentColumnStart = i + 1;
439
+ currentColumnNumber += 1;
440
+ if (currentColumnNumber > maxColumn) {
441
+ break;
442
+ }
652
443
  }
653
-
654
- if (endCoordinate <= regionStart) {
655
- return {
656
- overlaps: false
657
- };
444
+ }
445
+ return { startCoordinate: startCoordinate, overlaps: true };
446
+ };
447
+ TabixIndexedFile.prototype._getVcfEnd = function (startCoordinate, refSeq, info) {
448
+ var endCoordinate = startCoordinate + refSeq.length;
449
+ // ignore TRA features as they specify CHR2 and END
450
+ // as being on a different chromosome
451
+ // if CHR2 is on the same chromosome, still ignore it
452
+ // because there should be another pairwise feature
453
+ // at the end of this one
454
+ var isTRA = info.indexOf('SVTYPE=TRA') !== -1;
455
+ if (info[0] !== '.' && !isTRA) {
456
+ var prevChar = ';';
457
+ for (var j = 0; j < info.length; j += 1) {
458
+ if (prevChar === ';' && info.slice(j, j + 4) === 'END=') {
459
+ var valueEnd = info.indexOf(';', j);
460
+ if (valueEnd === -1) {
461
+ valueEnd = info.length;
462
+ }
463
+ endCoordinate = parseInt(info.slice(j + 4, valueEnd), 10);
464
+ break;
465
+ }
466
+ prevChar = info[j];
658
467
  }
659
- }
660
-
661
- currentColumnStart = i + 1;
662
- currentColumnNumber += 1;
663
-
664
- if (currentColumnNumber > maxColumn) {
665
- break;
666
- }
667
468
  }
668
- }
669
-
670
- return {
671
- startCoordinate: startCoordinate,
672
- overlaps: true
673
- };
674
- }
675
- }, {
676
- key: "_getVcfEnd",
677
- value: function _getVcfEnd(startCoordinate, refSeq, info) {
678
- var endCoordinate = startCoordinate + refSeq.length; // ignore TRA features as they specify CHR2 and END
679
- // as being on a different chromosome
680
- // if CHR2 is on the same chromosome, still ignore it
681
- // because there should be another pairwise feature
682
- // at the end of this one
683
-
684
- var isTRA = info.indexOf('SVTYPE=TRA') !== -1;
685
-
686
- if (info[0] !== '.' && !isTRA) {
687
- var prevChar = ';';
688
-
689
- for (var j = 0; j < info.length; j += 1) {
690
- if (prevChar === ';' && info.slice(j, j + 4) === 'END=') {
691
- var valueEnd = info.indexOf(';', j);
692
- if (valueEnd === -1) valueEnd = info.length;
693
- endCoordinate = (0, _parseInt2.default)(info.slice(j + 4, valueEnd), 10);
694
- break;
695
- }
696
-
697
- prevChar = info[j];
469
+ else if (isTRA) {
470
+ return startCoordinate + 1;
698
471
  }
699
- } else if (isTRA) {
700
- return startCoordinate + 1;
701
- }
702
-
703
- return endCoordinate;
704
- }
472
+ return endCoordinate;
473
+ };
705
474
  /**
706
475
  * return the approximate number of data lines in the given reference sequence
707
476
  * @param {string} refSeq reference sequence name
708
477
  * @returns {Promise} for number of data lines present on that reference sequence
709
478
  */
710
-
711
- }, {
712
- key: "lineCount",
713
- value: function () {
714
- var _lineCount = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(refName) {
715
- var opts,
716
- _args6 = arguments;
717
- return _regenerator.default.wrap(function _callee6$(_context6) {
718
- while (1) {
719
- switch (_context6.prev = _context6.next) {
720
- case 0:
721
- opts = _args6.length > 1 && _args6[1] !== undefined ? _args6[1] : {};
722
- return _context6.abrupt("return", this.index.lineCount(refName, opts));
723
-
724
- case 2:
725
- case "end":
726
- return _context6.stop();
727
- }
728
- }
729
- }, _callee6, this);
730
- }));
731
-
732
- function lineCount(_x5) {
733
- return _lineCount.apply(this, arguments);
734
- }
735
-
736
- return lineCount;
737
- }()
738
- }, {
739
- key: "_readRegion",
740
- value: function () {
741
- var _readRegion2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(position, compressedSize) {
742
- var opts,
743
- _yield$this$filehandl,
744
- bytesRead,
745
- buffer,
746
- _args7 = arguments;
747
-
748
- return _regenerator.default.wrap(function _callee7$(_context7) {
749
- while (1) {
750
- switch (_context7.prev = _context7.next) {
751
- case 0:
752
- opts = _args7.length > 2 && _args7[2] !== undefined ? _args7[2] : {};
753
- _context7.next = 3;
754
- return this.filehandle.read(Buffer.alloc(compressedSize), 0, compressedSize, position, opts);
755
-
756
- case 3:
757
- _yield$this$filehandl = _context7.sent;
758
- bytesRead = _yield$this$filehandl.bytesRead;
759
- buffer = _yield$this$filehandl.buffer;
760
- return _context7.abrupt("return", bytesRead < compressedSize ? buffer.slice(0, bytesRead) : buffer);
761
-
762
- case 7:
763
- case "end":
764
- return _context7.stop();
765
- }
766
- }
767
- }, _callee7, this);
768
- }));
769
-
770
- function _readRegion(_x6, _x7) {
771
- return _readRegion2.apply(this, arguments);
772
- }
773
-
774
- return _readRegion;
775
- }()
479
+ TabixIndexedFile.prototype.lineCount = function (refName, opts) {
480
+ if (opts === void 0) { opts = {}; }
481
+ return __awaiter(this, void 0, void 0, function () {
482
+ return __generator(this, function (_a) {
483
+ return [2 /*return*/, this.index.lineCount(refName, opts)];
484
+ });
485
+ });
486
+ };
487
+ TabixIndexedFile.prototype._readRegion = function (position, compressedSize, opts) {
488
+ if (opts === void 0) { opts = {}; }
489
+ return __awaiter(this, void 0, void 0, function () {
490
+ var _a, bytesRead, buffer;
491
+ return __generator(this, function (_b) {
492
+ switch (_b.label) {
493
+ case 0: return [4 /*yield*/, this.filehandle.read(Buffer.alloc(compressedSize), 0, compressedSize, position, opts)];
494
+ case 1:
495
+ _a = _b.sent(), bytesRead = _a.bytesRead, buffer = _a.buffer;
496
+ return [2 /*return*/, bytesRead < compressedSize ? buffer.slice(0, bytesRead) : buffer];
497
+ }
498
+ });
499
+ });
500
+ };
776
501
  /**
777
502
  * read and uncompress the data in a chunk (composed of one or more
778
503
  * contiguous bgzip blocks) of the file
779
504
  * @param {Chunk} chunk
780
505
  * @returns {Promise} for a string chunk of the file
781
506
  */
782
-
783
- }, {
784
- key: "readChunk",
785
- value: function () {
786
- var _readChunk = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(chunk) {
787
- var opts,
788
- compressedData,
789
- _args8 = arguments;
790
- return _regenerator.default.wrap(function _callee8$(_context8) {
791
- while (1) {
792
- switch (_context8.prev = _context8.next) {
793
- case 0:
794
- opts = _args8.length > 1 && _args8[1] !== undefined ? _args8[1] : {};
795
- _context8.next = 3;
796
- return this._readRegion(chunk.minv.blockPosition, chunk.fetchedSize(), opts);
797
-
798
- case 3:
799
- compressedData = _context8.sent;
800
- _context8.prev = 4;
801
- return _context8.abrupt("return", (0, _bgzfFilehandle.unzipChunkSlice)(compressedData, chunk));
802
-
803
- case 8:
804
- _context8.prev = 8;
805
- _context8.t0 = _context8["catch"](4);
806
- throw new Error("error decompressing chunk ".concat(chunk.toString(), " ").concat(_context8.t0));
807
-
808
- case 11:
809
- case "end":
810
- return _context8.stop();
811
- }
812
- }
813
- }, _callee8, this, [[4, 8]]);
814
- }));
815
-
816
- function readChunk(_x8) {
817
- return _readChunk.apply(this, arguments);
818
- }
819
-
820
- return readChunk;
821
- }()
822
- }]);
823
- return TabixIndexedFile;
824
- }();
825
-
507
+ TabixIndexedFile.prototype.readChunk = function (chunk, opts) {
508
+ if (opts === void 0) { opts = {}; }
509
+ return __awaiter(this, void 0, void 0, function () {
510
+ var compressedData;
511
+ return __generator(this, function (_a) {
512
+ switch (_a.label) {
513
+ case 0: return [4 /*yield*/, this._readRegion(chunk.minv.blockPosition, chunk.fetchedSize(), opts)];
514
+ case 1:
515
+ compressedData = _a.sent();
516
+ try {
517
+ return [2 /*return*/, (0, bgzf_filehandle_1.unzipChunkSlice)(compressedData, chunk)];
518
+ }
519
+ catch (e) {
520
+ throw new Error("error decompressing chunk ".concat(chunk.toString(), " ").concat(e));
521
+ }
522
+ return [2 /*return*/];
523
+ }
524
+ });
525
+ });
526
+ };
527
+ return TabixIndexedFile;
528
+ }());
826
529
  exports.default = TabixIndexedFile;
827
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy90YWJpeEluZGV4ZWRGaWxlLnRzIl0sIm5hbWVzIjpbInRpbWVvdXQiLCJ0aW1lIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJUYWJpeEluZGV4ZWRGaWxlIiwicGF0aCIsImZpbGVoYW5kbGUiLCJ0YmlQYXRoIiwidGJpRmlsZWhhbmRsZSIsImNzaVBhdGgiLCJjc2lGaWxlaGFuZGxlIiwiY2h1bmtTaXplTGltaXQiLCJyZW5hbWVSZWZTZXFzIiwibiIsImNodW5rQ2FjaGVTaXplIiwiTG9jYWxGaWxlIiwiVHlwZUVycm9yIiwiaW5kZXgiLCJUQkkiLCJDU0kiLCJyZW5hbWVSZWZTZXEiLCJjaHVua0NhY2hlIiwiQWJvcnRhYmxlUHJvbWlzZUNhY2hlIiwiY2FjaGUiLCJMUlUiLCJtYXhTaXplIiwiTWF0aCIsImZsb29yIiwiZmlsbCIsInJlYWRDaHVuayIsImJpbmQiLCJyZWZOYW1lIiwic3RhcnQiLCJlbmQiLCJvcHRzIiwib3B0aW9ucyIsImNhbGxiYWNrIiwibGluZUNhbGxiYWNrIiwidW5kZWZpbmVkIiwiZ2V0TWV0YWRhdGEiLCJtZXRhZGF0YSIsInNpZ25hbCIsIm1heFJlZkxlbmd0aCIsImJsb2Nrc0ZvclJhbmdlIiwiY2h1bmtzIiwiaSIsImxlbmd0aCIsInNpemUiLCJmZXRjaGVkU2l6ZSIsIkVycm9yIiwidG9Mb2NhbGVTdHJpbmciLCJsYXN0IiwiY2h1bmtOdW0iLCJwcmV2aW91c1N0YXJ0Q29vcmRpbmF0ZSIsImMiLCJnZXQiLCJ0b1N0cmluZyIsImJ1ZmZlciIsImNwb3NpdGlvbnMiLCJkcG9zaXRpb25zIiwibGluZXMiLCJUZXh0RGVjb2RlciIsImRlY29kZSIsInNwbGl0IiwicG9wIiwiYmxvY2tTdGFydCIsIm1pbnYiLCJkYXRhUG9zaXRpb24iLCJwb3MiLCJsaW5lIiwiY2hlY2tMaW5lIiwic3RhcnRDb29yZGluYXRlIiwib3ZlcmxhcHMiLCJ0cmltIiwiZmlyc3REYXRhTGluZSIsIm1ldGFDaGFyIiwibWF4QmxvY2tTaXplIiwibWF4RmV0Y2giLCJibG9ja1Bvc2l0aW9uIiwiX3JlYWRSZWdpb24iLCJieXRlcyIsImNvbnNvbGUiLCJlcnJvciIsImNvZGUiLCJsYXN0TmV3bGluZSIsIm5ld2xpbmVCeXRlIiwiY2hhckNvZGVBdCIsIm1ldGFCeXRlIiwic2xpY2UiLCJnZXRIZWFkZXJCdWZmZXIiLCJyZWZJZFRvTmFtZSIsInJlZ2lvblJlZk5hbWUiLCJyZWdpb25TdGFydCIsInJlZ2lvbkVuZCIsImNvbHVtbk51bWJlcnMiLCJjb29yZGluYXRlVHlwZSIsImZvcm1hdCIsImNoYXJBdCIsInJlZiIsIm1heENvbHVtbiIsIm1heCIsImN1cnJlbnRDb2x1bW5OdW1iZXIiLCJjdXJyZW50Q29sdW1uU3RhcnQiLCJyZWZTZXEiLCJJbmZpbml0eSIsImVuZENvb3JkaW5hdGUiLCJfZ2V0VmNmRW5kIiwiaW5mbyIsImlzVFJBIiwiaW5kZXhPZiIsInByZXZDaGFyIiwiaiIsInZhbHVlRW5kIiwibGluZUNvdW50IiwicG9zaXRpb24iLCJjb21wcmVzc2VkU2l6ZSIsInJlYWQiLCJCdWZmZXIiLCJhbGxvYyIsImJ5dGVzUmVhZCIsImNodW5rIiwiY29tcHJlc3NlZERhdGEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFFQSxTQUFTQSxPQUFULENBQWlCQyxJQUFqQixFQUErQjtBQUM3QixTQUFPLHFCQUFZLFVBQUFDLE9BQU8sRUFBSTtBQUM1QkMsSUFBQUEsVUFBVSxDQUFDRCxPQUFELEVBQVVELElBQVYsQ0FBVjtBQUNELEdBRk0sQ0FBUDtBQUdEOztJQUNvQkcsZ0I7QUFNbkI7Ozs7Ozs7Ozs7Ozs7OztBQWVBLGtDQW9CRztBQUFBLFFBbkJEQyxJQW1CQyxRQW5CREEsSUFtQkM7QUFBQSxRQWxCREMsVUFrQkMsUUFsQkRBLFVBa0JDO0FBQUEsUUFqQkRDLE9BaUJDLFFBakJEQSxPQWlCQztBQUFBLFFBaEJEQyxhQWdC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aXNlQ2FjaGUgZnJvbSAnYWJvcnRhYmxlLXByb21pc2UtY2FjaGUnXG5pbXBvcnQgTFJVIGZyb20gJ3F1aWNrLWxydSdcbmltcG9ydCB7IEdlbmVyaWNGaWxlaGFuZGxlLCBMb2NhbEZpbGUgfSBmcm9tICdnZW5lcmljLWZpbGVoYW5kbGUnXG5pbXBvcnQgeyB1bnppcCwgdW56aXBDaHVua1NsaWNlIH0gZnJvbSAnQGdtb2QvYmd6Zi1maWxlaGFuZGxlJ1xuaW1wb3J0IHsgY2hlY2tBYm9ydFNpZ25hbCB9IGZyb20gJy4vdXRpbCdcbmltcG9ydCBJbmRleEZpbGUsIHsgT3B0aW9ucyB9IGZyb20gJy4vaW5kZXhGaWxlJ1xuXG5pbXBvcnQgQ2h1bmsgZnJvbSAnLi9jaHVuaydcbmltcG9ydCBUQkkgZnJvbSAnLi90YmknXG5pbXBvcnQgQ1NJIGZyb20gJy4vY3NpJ1xuXG5mdW5jdGlvbiB0aW1lb3V0KHRpbWU6IG51bWJlcikge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgc2V0VGltZW91dChyZXNvbHZlLCB0aW1lKVxuICB9KVxufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFiaXhJbmRleGVkRmlsZSB7XG4gIHByaXZhdGUgZmlsZWhhbmRsZTogR2VuZXJpY0ZpbGVoYW5kbGVcbiAgcHJpdmF0ZSBpbmRleDogSW5kZXhGaWxlXG4gIHByaXZhdGUgY2h1bmtTaXplTGltaXQ6IG51bWJlclxuICBwcml2YXRlIHJlbmFtZVJlZlNlcTogKG46IHN0cmluZykgPT4gc3RyaW5nXG4gIHByaXZhdGUgY2h1bmtDYWNoZTogYW55XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucGF0aF1cbiAgICogQHBhcmFtIHtmaWxlaGFuZGxlfSBbYXJncy5maWxlaGFuZGxlXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudGJpUGF0aF1cbiAgICogQHBhcmFtIHtmaWxlaGFuZGxlfSBbYXJncy50YmlGaWxlaGFuZGxlXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuY3NpUGF0aF1cbiAgICogQHBhcmFtIHtmaWxlaGFuZGxlfSBbYXJncy5jc2lGaWxlaGFuZGxlXVxuICAgKiBAcGFyYW0ge2NodW5rU2l6ZUxpbWl0fSBkZWZhdWx0IDUwTWlCXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFthcmdzLnJlbmFtZVJlZlNlcXNdIG9wdGlvbmFsIGZ1bmN0aW9uIHdpdGggc2lnIGBzdHJpbmcgPT4gc3RyaW5nYCB0byB0cmFuc2Zvcm1cbiAgICogcmVmZXJlbmNlIHNlcXVlbmNlIG5hbWVzIGZvciB0aGUgcHVycG9zZSBvZiBpbmRleGluZyBhbmQgcXVlcnlpbmcuIG5vdGUgdGhhdCB0aGUgZGF0YSB0aGF0IGlzIHJldHVybmVkIGlzXG4gICAqIG5vdCBhbHRlcmVkLCBqdXN0IHRoZSBuYW1lcyBvZiB0aGUgcmVmZXJlbmNlIHNlcXVlbmNlcyB0aGF0IGFyZSB1c2VkIGZvciBxdWVyeWluZy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmNodW5rQ2FjaGVTaXplXSBtYXhpbXVtIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGNodW5rIGNhY2hlLiBkZWZhdWx0IDVNQlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYmxvY2tDYWNoZVNpemVdIG1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiB0aGUgYmxvY2sgY2FjaGUuIGRlZmF1bHQgNU1CXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgcGF0aCxcbiAgICBmaWxlaGFuZGxlLFxuICAgIHRiaVBhdGgsXG4gICAgdGJpRmlsZWhhbmRsZSxcbiAgICBjc2lQYXRoLFxuICAgIGNzaUZpbGVoYW5kbGUsXG4gICAgY2h1bmtTaXplTGltaXQgPSA1MDAwMDAwMCxcbiAgICByZW5hbWVSZWZTZXFzID0gbiA9PiBuLFxuICAgIGNodW5rQ2FjaGVTaXplID0gNSAqIDIgKiogMjAsXG4gIH06IHtcbiAgICBwYXRoPzogc3RyaW5nXG4gICAgZmlsZWhhbmRsZT86IEdlbmVyaWNGaWxlaGFuZGxlXG4gICAgdGJpUGF0aD86IHN0cmluZ1xuICAgIHRiaUZpbGVoYW5kbGU/OiBHZW5lcmljRmlsZWhhbmRsZVxuICAgIGNzaVBhdGg/OiBzdHJpbmdcbiAgICBjc2lGaWxlaGFuZGxlPzogR2VuZXJpY0ZpbGVoYW5kbGVcbiAgICBjaHVua1NpemVMaW1pdD86IG51bWJlclxuICAgIHJlbmFtZVJlZlNlcXM/OiAobjogc3RyaW5nKSA9PiBzdHJpbmdcbiAgICBjaHVua0NhY2hlU2l6ZT86IG51bWJlclxuICB9KSB7XG4gICAgaWYgKGZpbGVoYW5kbGUpIHRoaXMuZmlsZWhhbmRsZSA9IGZpbGVoYW5kbGVcbiAgICBlbHNlIGlmIChwYXRoKSB0aGlzLmZpbGVoYW5kbGUgPSBuZXcgTG9jYWxGaWxlKHBhdGgpXG4gICAgZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdtdXN0IHByb3ZpZGUgZWl0aGVyIGZpbGVoYW5kbGUgb3IgcGF0aCcpXG5cbiAgICBpZiAodGJpRmlsZWhhbmRsZSlcbiAgICAgIHRoaXMuaW5kZXggPSBuZXcgVEJJKHtcbiAgICAgICAgZmlsZWhhbmRsZTogdGJpRmlsZWhhbmRsZSxcbiAgICAgICAgcmVuYW1lUmVmU2VxcyxcbiAgICAgIH0pXG4gICAgZWxzZSBpZiAoY3NpRmlsZWhhbmRsZSlcbiAgICAgIHRoaXMuaW5kZXggPSBuZXcgQ1NJKHtcbiAgICAgICAgZmlsZWhhbmRsZTogY3NpRmlsZWhhbmRsZSxcbiAgICAgICAgcmVuYW1lUmVmU2VxcyxcbiAgICAgIH0pXG4gICAgZWxzZSBpZiAodGJpUGF0aClcbiAgICAgIHRoaXMuaW5kZXggPSBuZXcgVEJJKHtcbiAgICAgICAgZmlsZWhhbmRsZTogbmV3IExvY2FsRmlsZSh0YmlQYXRoKSxcbiAgICAgICAgcmVuYW1lUmVmU2VxcyxcbiAgICAgIH0pXG4gICAgZWxzZSBpZiAoY3NpUGF0aClcbiAgICAgIHRoaXMuaW5kZXggPSBuZXcgQ1NJKHtcbiAgICAgICAgZmlsZWhhbmRsZTogbmV3IExvY2FsRmlsZShjc2lQYXRoKSxcbiAgICAgICAgcmVuYW1lUmVmU2VxcyxcbiAgICAgIH0pXG4gICAgZWxzZSBpZiAocGF0aCkge1xuICAgICAgdGhpcy5pbmRleCA9IG5ldyBUQkkoe1xuICAgICAgICBmaWxlaGFuZGxlOiBuZXcgTG9jYWxGaWxlKGAke3BhdGh9LnRiaWApLFxuICAgICAgICByZW5hbWVSZWZTZXFzLFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ211c3QgcHJvdmlkZSBvbmUgb2YgdGJpRmlsZWhhbmRsZSwgdGJpUGF0aCwgY3NpRmlsZWhhbmRsZSwgb3IgY3NpUGF0aCcsXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5jaHVua1NpemVMaW1pdCA9IGNodW5rU2l6ZUxpbWl0XG4gICAgdGhpcy5yZW5hbWVSZWZTZXEgPSByZW5hbWVSZWZTZXFzXG4gICAgdGhpcy5jaHVua0NhY2hlID0gbmV3IEFib3J0YWJsZVByb21pc2VDYWNoZSh7XG4gICAgICBjYWNoZTogbmV3IExSVSh7XG4gICAgICAgIG1heFNpemU6IE1hdGguZmxvb3IoY2h1bmtDYWNoZVNpemUgLyAoMSA8PCAxNikpLFxuICAgICAgfSksXG5cbiAgICAgIGZpbGw6IHRoaXMucmVhZENodW5rLmJpbmQodGhpcyksXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmTmFtZSBuYW1lIG9mIHRoZSByZWZlcmVuY2Ugc2VxdWVuY2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IHN0YXJ0IG9mIHRoZSByZWdpb24gKGluIDAtYmFzZWQgaGFsZi1vcGVuIGNvb3JkaW5hdGVzKVxuICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIGVuZCBvZiB0aGUgcmVnaW9uIChpbiAwLWJhc2VkIGhhbGYtb3BlbiBjb29yZGluYXRlcylcbiAgICogQHBhcmFtIHtmdW5jdGlvbnxvYmplY3R9IGxpbmVDYWxsYmFjayBjYWxsYmFjayBjYWxsZWQgZm9yIGVhY2ggbGluZSBpbiB0aGUgcmVnaW9uLiBjYW4gYWxzbyBwYXNzIGEgb2JqZWN0IHBhcmFtIGNvbnRhaW5pbmcgb2JqLmxpbmVDYWxsYmFjaywgb2JqLnNpZ25hbCwgZXRjXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSByZXNvbHZlZCB3aGVuIHRoZSB3aG9sZSByZWFkIGlzIGZpbmlzaGVkLCByZWplY3RlZCBvbiBlcnJvclxuICAgKi9cbiAgYXN5bmMgZ2V0TGluZXMoXG4gICAgcmVmTmFtZTogc3RyaW5nLFxuICAgIHN0YXJ0OiBudW1iZXIsXG4gICAgZW5kOiBudW1iZXIsXG4gICAgb3B0czogeyBzaWduYWw/OiBBYm9ydFNpZ25hbDsgbGluZUNhbGxiYWNrOiBGdW5jdGlvbiB9IHwgRnVuY3Rpb24sXG4gICkge1xuICAgIGxldCBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkXG4gICAgbGV0IG9wdGlvbnM6IE9wdGlvbnMgPSB7fVxuICAgIGxldCBjYWxsYmFjazogRnVuY3Rpb25cbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICd1bmRlZmluZWQnKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbGluZSBjYWxsYmFjayBtdXN0IGJlIHByb3ZpZGVkJylcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIGNhbGxiYWNrID0gb3B0c1xuICAgIGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IG9wdHNcbiAgICAgIGNhbGxiYWNrID0gb3B0cy5saW5lQ2FsbGJhY2tcbiAgICB9XG4gICAgaWYgKHJlZk5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbXVzdCBwcm92aWRlIGEgcmVmZXJlbmNlIHNlcXVlbmNlIG5hbWUnKVxuICAgIH1cbiAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdsaW5lIGNhbGxiYWNrIG11c3QgYmUgcHJvdmlkZWQnKVxuICAgIH1cblxuICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5pbmRleC5nZXRNZXRhZGF0YShvcHRpb25zKVxuICAgIGNoZWNrQWJvcnRTaWduYWwoc2lnbmFsKVxuICAgIGlmICghc3RhcnQpIHtcbiAgICAgIHN0YXJ0ID0gMFxuICAgIH1cbiAgICBpZiAoIWVuZCkge1xuICAgICAgZW5kID0gbWV0YWRhdGEubWF4UmVmTGVuZ3RoXG4gICAgfVxuICAgIGlmICghKHN0YXJ0IDw9IGVuZCkpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnaW52YWxpZCBzdGFydCBhbmQgZW5kIGNvb3JkaW5hdGVzLiBzdGFydCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQnLFxuICAgICAgKVxuICAgIGlmIChzdGFydCA9PT0gZW5kKSByZXR1cm5cblxuICAgIGNvbnN0IGNodW5rcyA9IGF3YWl0IHRoaXMuaW5kZXguYmxvY2tzRm9yUmFuZ2UocmVmTmFtZSwgc3RhcnQsIGVuZCwgb3B0aW9ucylcbiAgICBjaGVja0Fib3J0U2lnbmFsKHNpZ25hbClcblxuICAgIC8vIGNoZWNrIHRoZSBjaHVua3MgZm9yIGFueSB0aGF0IGFyZSBvdmVyIHRoZSBzaXplIGxpbWl0LiAgaWZcbiAgICAvLyBhbnkgYXJlLCBkb24ndCBmZXRjaCBhbnkgb2YgdGhlbVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBzaXplID0gY2h1bmtzW2ldLmZldGNoZWRTaXplKClcbiAgICAgIGlmIChzaXplID4gdGhpcy5jaHVua1NpemVMaW1pdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRvbyBtdWNoIGRhdGEuIENodW5rIHNpemUgJHtzaXplLnRvTG9jYWxlU3RyaW5nKCl9IGJ5dGVzIGV4Y2VlZHMgY2h1bmtTaXplTGltaXQgb2YgJHt0aGlzLmNodW5rU2l6ZUxpbWl0LnRvTG9jYWxlU3RyaW5nKCl9LmAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBub3cgZ28gdGhyb3VnaCBlYWNoIGNodW5rIGFuZCBwYXJzZSBhbmQgZmlsdGVyIHRoZSBsaW5lcyBvdXQgb2YgaXRcbiAgICBsZXQgbGFzdCA9IERhdGUubm93KClcbiAgICBmb3IgKGxldCBjaHVua051bSA9IDA7IGNodW5rTnVtIDwgY2h1bmtzLmxlbmd0aDsgY2h1bmtOdW0gKz0gMSkge1xuICAgICAgbGV0IHByZXZpb3VzU3RhcnRDb29yZGluYXRlOiBudW1iZXIgfCB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGMgPSBjaHVua3NbY2h1bmtOdW1dXG4gICAgICBjb25zdCB7IGJ1ZmZlciwgY3Bvc2l0aW9ucywgZHBvc2l0aW9ucyB9ID0gYXdhaXQgdGhpcy5jaHVua0NhY2hlLmdldChcbiAgICAgICAgYy50b1N0cmluZygpLFxuICAgICAgICBjLFxuICAgICAgICBzaWduYWwsXG4gICAgICApXG5cbiAgICAgIGNvbnN0IGxpbmVzID0gKHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgPyBuZXcgVGV4dERlY29kZXIoJ3V0Zi04JykuZGVjb2RlKGJ1ZmZlcilcbiAgICAgICAgOiBidWZmZXIudG9TdHJpbmcoKVxuICAgICAgKS5zcGxpdCgnXFxuJylcbiAgICAgIGxpbmVzLnBvcCgpXG5cbiAgICAgIGNoZWNrQWJvcnRTaWduYWwoc2lnbmFsKVxuICAgICAgbGV0IGJsb2NrU3RhcnQgPSBjLm1pbnYuZGF0YVBvc2l0aW9uXG4gICAgICBsZXQgcG9zXG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldXG5cbiAgICAgICAgZm9yIChwb3MgPSAwOyBibG9ja1N0YXJ0ID49IGRwb3NpdGlvbnNbcG9zXTsgcG9zICs9IDEpO1xuXG4gICAgICAgIC8vIGZpbHRlciB0aGUgbGluZSBmb3Igd2hldGhlciBpdCBpcyB3aXRoaW4gdGhlIHJlcXVlc3RlZCByYW5nZVxuICAgICAgICBjb25zdCB7IHN0YXJ0Q29vcmRpbmF0ZSwgb3ZlcmxhcHMgfSA9IHRoaXMuY2hlY2tMaW5lKFxuICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgIHJlZk5hbWUsXG4gICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgZW5kLFxuICAgICAgICAgIGxpbmUsXG4gICAgICAgIClcblxuICAgICAgICAvLyBkbyBhIHNtYWxsIGNoZWNrIGp1c3QgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxpbmVzIGFyZSByZWFsbHkgc29ydGVkIGJ5IHN0YXJ0IGNvb3JkaW5hdGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXZpb3VzU3RhcnRDb29yZGluYXRlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBzdGFydENvb3JkaW5hdGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIHByZXZpb3VzU3RhcnRDb29yZGluYXRlID4gc3RhcnRDb29yZGluYXRlXG4gICAgICAgIClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgTGluZXMgbm90IHNvcnRlZCBieSBzdGFydCBjb29yZGluYXRlICgke3ByZXZpb3VzU3RhcnRDb29yZGluYXRlfSA+ICR7c3RhcnRDb29yZGluYXRlfSksIHRoaXMgZmlsZSBpcyBub3QgdXNhYmxlIHdpdGggVGFiaXguYCxcbiAgICAgICAgICApXG4gICAgICAgIHByZXZpb3VzU3RhcnRDb29yZGluYXRlID0gc3RhcnRDb29yZGluYXRlXG5cbiAgICAgICAgaWYgKG92ZXJsYXBzKSB7XG4gICAgICAgICAgY2FsbGJhY2soXG4gICAgICAgICAgICBsaW5lLnRyaW0oKSxcbiAgICAgICAgICAgIC8vIGNwb3NpdGlvbnNbcG9zXSByZWZlcnMgdG8gYWN0dWFsIGZpbGUgb2Zmc2V0IG9mIGEgYmd6aXAgYmxvY2sgYm91bmRhcmllc1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIHdlIG11bHRpcGx5IGJ5ICgxIDw8OCkgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIGVhY2ggYmxvY2sgaGFzIGEgXCJ1bmlxdWVcIlxuICAgICAgICAgICAgLy8gYWRkcmVzcyBzcGFjZSBzbyB0aGF0IGRhdGEgaW4gdGhhdCBibG9jayBjb3VsZCBuZXZlciBvdmVybGFwXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gdGhlbiB0aGUgYmxvY2tTdGFydC1kcG9zaXRpb25zIGlzIGFuIHVuY29tcHJlc3NlZCBmaWxlIG9mZnNldCBmcm9tXG4gICAgICAgICAgICAvLyB0aGF0IGJnemlwIGJsb2NrIGJvdW5kYXJ5LCBhbmQgc2luY2UgdGhlIGNwb3NpdGlvbnMgYXJlIG11bHRpcGxpZWQgYnlcbiAgICAgICAgICAgIC8vICgxIDw8IDgpIHRoZXNlIHVuY29tcHJlc3NlZCBvZmZzZXRzIGdldCBhIHVuaXF1ZSBzcGFjZVxuICAgICAgICAgICAgY3Bvc2l0aW9uc1twb3NdICogKDEgPDwgOCkgKyAoYmxvY2tTdGFydCAtIGRwb3NpdGlvbnNbcG9zXSksXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0Q29vcmRpbmF0ZSAhPT0gdW5kZWZpbmVkICYmIHN0YXJ0Q29vcmRpbmF0ZSA+PSBlbmQpIHtcbiAgICAgICAgICAvLyB0aGUgbGluZXMgd2VyZSBvdmVybGFwcGluZyB0aGUgcmVnaW9uLCBidXQgbm93IGhhdmUgc3RvcHBlZCwgc29cbiAgICAgICAgICAvLyB3ZSBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHJlbGV2YW50IGRhdGEgYW5kIHdlIGNhbiBzdG9wXG4gICAgICAgICAgLy8gcHJvY2Vzc2luZyBkYXRhIG5vd1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGJsb2NrU3RhcnQgKz0gbGluZS5sZW5ndGggKyAxXG5cbiAgICAgICAgLy8geWllbGQgaWYgd2UgaGF2ZSBlbWl0dGVkIGJleW9uZCB0aGUgeWllbGQgbGltaXRcbiAgICAgICAgaWYgKGxhc3QgLSBEYXRlLm5vdygpID4gNTAwKSB7XG4gICAgICAgICAgbGFzdCA9IERhdGUubm93KClcbiAgICAgICAgICBjaGVja0Fib3J0U2lnbmFsKHNpZ25hbClcbiAgICAgICAgICBhd2FpdCB0aW1lb3V0KDEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRNZXRhZGF0YShvcHRzOiBPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleC5nZXRNZXRhZGF0YShvcHRzKVxuICB9XG5cbiAgLyoqXG4gICAqIGdldCBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBcImhlYWRlclwiIHJlZ2lvbiBvZlxuICAgKiB0aGUgZmlsZSwgd2hpY2ggYXJlIHRoZSBieXRlcyB1cCB0byB0aGUgZmlyc3RcbiAgICogbm9uLW1ldGEgbGluZVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gZm9yIGEgYnVmZmVyXG4gICAqL1xuICBhc3luYyBnZXRIZWFkZXJCdWZmZXIob3B0czogT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBmaXJzdERhdGFMaW5lLCBtZXRhQ2hhciwgbWF4QmxvY2tTaXplIH0gPSBhd2FpdCB0aGlzLmdldE1ldGFkYXRhKFxuICAgICAgb3B0cyxcbiAgICApXG4gICAgY2hlY2tBYm9ydFNpZ25hbChvcHRzLnNpZ25hbClcbiAgICBjb25zdCBtYXhGZXRjaCA9XG4gICAgICBmaXJzdERhdGFMaW5lICYmIGZpcnN0RGF0YUxpbmUuYmxvY2tQb3NpdGlvblxuICAgICAgICA/IGZpcnN0RGF0YUxpbmUuYmxvY2tQb3NpdGlvbiArIG1heEJsb2NrU2l6ZVxuICAgICAgICA6IG1heEJsb2NrU2l6ZVxuICAgIC8vIFRPRE86IHdoYXQgaWYgd2UgZG9uJ3QgaGF2ZSBhIGZpcnN0RGF0YUxpbmUsIGFuZCB0aGUgaGVhZGVyXG4gICAgLy8gYWN0dWFsbHkgdGFrZXMgdXAgbW9yZSB0aGFuIG9uZSBibG9jaz8gdGhpcyBjYXNlIGlzIG5vdCBjb3ZlcmVkIGhlcmVcblxuICAgIGxldCBieXRlcyA9IGF3YWl0IHRoaXMuX3JlYWRSZWdpb24oMCwgbWF4RmV0Y2gsIG9wdHMpXG4gICAgY2hlY2tBYm9ydFNpZ25hbChvcHRzLnNpZ25hbClcbiAgICB0cnkge1xuICAgICAgYnl0ZXMgPSBhd2FpdCB1bnppcChieXRlcylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBlcnJvciBkZWNvbXByZXNzaW5nIGJsb2NrICR7ZS5jb2RlfSBhdCAwIChsZW5ndGggJHttYXhGZXRjaH0pICR7ZX1gLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIHRyaW0gb2ZmIGxpbmVzIGFmdGVyIHRoZSBsYXN0IG5vbi1tZXRhIGxpbmVcbiAgICBpZiAobWV0YUNoYXIpIHtcbiAgICAgIC8vIHRyaW0gYmFja3dhcmQgZnJvbSB0aGUgZW5kXG4gICAgICBsZXQgbGFzdE5ld2xpbmUgPSAtMVxuICAgICAgY29uc3QgbmV3bGluZUJ5dGUgPSAnXFxuJy5jaGFyQ29kZUF0KDApXG4gICAgICBjb25zdCBtZXRhQnl0ZSA9IG1ldGFDaGFyLmNoYXJDb2RlQXQoMClcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKGkgPT09IGxhc3ROZXdsaW5lICsgMSAmJiBieXRlc1tpXSAhPT0gbWV0YUJ5dGUpIGJyZWFrXG4gICAgICAgIGlmIChieXRlc1tpXSA9PT0gbmV3bGluZUJ5dGUpIGxhc3ROZXdsaW5lID0gaVxuICAgICAgfVxuICAgICAgYnl0ZXMgPSBieXRlcy5zbGljZSgwLCBsYXN0TmV3bGluZSArIDEpXG4gICAgfVxuICAgIHJldHVybiBieXRlc1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBhIHN0cmluZyBjb250YWluaW5nIHRoZSBcImhlYWRlclwiIHJlZ2lvbiBvZiB0aGVcbiAgICogZmlsZSwgaXMgdGhlIHBvcnRpb24gdXAgdG8gdGhlIGZpcnN0IG5vbi1tZXRhIGxpbmVcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IGZvciBhIHN0cmluZ1xuICAgKi9cbiAgYXN5bmMgZ2V0SGVhZGVyKG9wdHM6IE9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGJ5dGVzID0gYXdhaXQgdGhpcy5nZXRIZWFkZXJCdWZmZXIob3B0cylcbiAgICBjaGVja0Fib3J0U2lnbmFsKG9wdHMuc2lnbmFsKVxuICAgIHJldHVybiBieXRlcy50b1N0cmluZygndXRmOCcpXG4gIH1cblxuICAvKipcbiAgICogZ2V0IGFuIGFycmF5IG9mIHJlZmVyZW5jZSBzZXF1ZW5jZSBuYW1lcywgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gICAqIHRoZXkgb2NjdXIgaW4gdGhlIGZpbGUuXG4gICAqXG4gICAqIHJlZmVyZW5jZSBzZXF1ZW5jZSByZW5hbWluZyBpcyBub3QgYXBwbGllZCB0byB0aGVzZSBuYW1lcy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IGZvciBhbiBhcnJheSBvZiBzdHJpbmcgc2VxdWVuY2UgbmFtZXNcbiAgICovXG4gIGFzeW5jIGdldFJlZmVyZW5jZVNlcXVlbmNlTmFtZXMob3B0czogT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLmdldE1ldGFkYXRhKG9wdHMpXG4gICAgcmV0dXJuIG1ldGFkYXRhLnJlZklkVG9OYW1lXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IG1ldGFkYXRhIG1ldGFkYXRhIG9iamVjdCBmcm9tIHRoZSBwYXJzZWQgaW5kZXgsXG4gICAqIGNvbnRhaW5pbmcgY29sdW1uTnVtYmVycywgbWV0YUNoYXIsIGFuZCBmb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lvblJlZk5hbWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZ2lvblN0YXJ0IHJlZ2lvbiBzdGFydCBjb29yZGluYXRlICgwLWJhc2VkLWhhbGYtb3BlbilcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZ2lvbkVuZCByZWdpb24gZW5kIGNvb3JkaW5hdGUgKDAtYmFzZWQtaGFsZi1vcGVuKVxuICAgKiBAcGFyYW0ge2FycmF5W3N0cmluZ119IGxpbmVcbiAgICogQHJldHVybnMge29iamVjdH0gbGlrZSBge3N0YXJ0Q29vcmRpbmF0ZSwgb3ZlcmxhcHN9YC4gb3ZlcmxhcHMgaXMgYm9vbGVhbixcbiAgICogdHJ1ZSBpZiBsaW5lIGlzIGEgZGF0YSBsaW5lIHRoYXQgb3ZlcmxhcHMgdGhlIGdpdmVuIHJlZ2lvblxuICAgKi9cbiAgY2hlY2tMaW5lKFxuICAgIHtcbiAgICAgIGNvbHVtbk51bWJlcnMsXG4gICAgICBtZXRhQ2hhcixcbiAgICAgIGNvb3JkaW5hdGVUeXBlLFxuICAgICAgZm9ybWF0LFxuICAgIH06IHtcbiAgICAgIGNvbHVtbk51bWJlcnM6IHsgcmVmOiBudW1iZXI7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH1cbiAgICAgIG1ldGFDaGFyOiBzdHJpbmdcbiAgICAgIGNvb3JkaW5hdGVUeXBlOiBzdHJpbmdcbiAgICAgIGZvcm1hdDogc3RyaW5nXG4gICAgfSxcbiAgICByZWdpb25SZWZOYW1lOiBzdHJpbmcsXG4gICAgcmVnaW9uU3RhcnQ6IG51bWJlcixcbiAgICByZWdpb25FbmQ6IG51bWJlcixcbiAgICBsaW5lOiBzdHJpbmcsXG4gICkge1xuICAgIC8vIHNraXAgbWV0YSBsaW5lc1xuICAgIGlmIChsaW5lLmNoYXJBdCgwKSA9PT0gbWV0YUNoYXIpIHtcbiAgICAgIHJldHVybiB7IG92ZXJsYXBzOiBmYWxzZSB9XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgcmVmL3N0YXJ0L2VuZCB1c2luZyBjb2x1bW4gbWV0YWRhdGEgZnJvbSBpbmRleFxuICAgIGxldCB7IHJlZiwgc3RhcnQsIGVuZCB9ID0gY29sdW1uTnVtYmVyc1xuICAgIGlmICghcmVmKSByZWYgPSAwXG4gICAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gICAgaWYgKCFlbmQpIGVuZCA9IDBcbiAgICBpZiAoZm9ybWF0ID09PSAnVkNGJykgZW5kID0gOFxuICAgIGNvbnN0IG1heENvbHVtbiA9IE1hdGgubWF4KHJlZiwgc3RhcnQsIGVuZClcblxuICAgIC8vIHRoaXMgY29kZSBpcyBraW5kIG9mIGNvbXBsZXgsIGJ1dCBpdCBpcyBmYWlybHkgZmFzdC5cbiAgICAvLyBiYXNpY2FsbHksIHdlIHdhbnQgdG8gYXZvaWQgZG9pbmcgYSBzcGxpdCwgYmVjYXVzZSBpZiB0aGUgbGluZXMgYXJlIHJlYWxseSBsb25nXG4gICAgLy8gdGhhdCBjb3VsZCBsZWFkIHRvIHVzIGFsbG9jYXRpbmcgYSBidW5jaCBvZiBleHRyYSBtZW1vcnksIHdoaWNoIGlzIHNsb3dcblxuICAgIGxldCBjdXJyZW50Q29sdW1uTnVtYmVyID0gMSAvLyBjb2xzIGFyZSBudW1iZXJlZCBzdGFydGluZyBhdCAxIGluIHRoZSBpbmRleCBtZXRhZGF0YVxuICAgIGxldCBjdXJyZW50Q29sdW1uU3RhcnQgPSAwXG4gICAgbGV0IHJlZlNlcSA9ICcnXG4gICAgbGV0IHN0YXJ0Q29vcmRpbmF0ZSA9IC1JbmZpbml0eVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggKyAxOyBpICs9IDEpIHtcbiAgICAgIGlmIChsaW5lW2ldID09PSAnXFx0JyB8fCBpID09PSBsaW5lLmxlbmd0aCkge1xuICAgICAgICBpZiAoY3VycmVudENvbHVtbk51bWJlciA9PT0gcmVmKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5yZW5hbWVSZWZTZXEobGluZS5zbGljZShjdXJyZW50Q29sdW1uU3RhcnQsIGkpKSAhPT1cbiAgICAgICAgICAgIHJlZ2lvblJlZk5hbWVcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB7IG92ZXJsYXBzOiBmYWxzZSB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb2x1bW5OdW1iZXIgPT09IHN0YXJ0KSB7XG4gICAgICAgICAgc3RhcnRDb29yZGluYXRlID0gcGFyc2VJbnQobGluZS5zbGljZShjdXJyZW50Q29sdW1uU3RhcnQsIGkpLCAxMClcbiAgICAgICAgICAvLyB3ZSBjb252ZXJ0IHRvIDAtYmFzZWQtaGFsZi1vcGVuXG4gICAgICAgICAgaWYgKGNvb3JkaW5hdGVUeXBlID09PSAnMS1iYXNlZC1jbG9zZWQnKSB7XG4gICAgICAgICAgICBzdGFydENvb3JkaW5hdGUgLT0gMVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhcnRDb29yZGluYXRlID49IHJlZ2lvbkVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnRDb29yZGluYXRlLCBvdmVybGFwczogZmFsc2UgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZW5kID09PSAwIHx8IGVuZCA9PT0gc3RhcnQpIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgbm8gZW5kLCB3ZSBhc3N1bWUgdGhlIGZlYXR1cmUgaXMgMSBicCBsb25nXG4gICAgICAgICAgICBpZiAoc3RhcnRDb29yZGluYXRlICsgMSA8PSByZWdpb25TdGFydCkge1xuICAgICAgICAgICAgICByZXR1cm4geyBzdGFydENvb3JkaW5hdGUsIG92ZXJsYXBzOiBmYWxzZSB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ1ZDRicgJiYgY3VycmVudENvbHVtbk51bWJlciA9PT0gNCkge1xuICAgICAgICAgIHJlZlNlcSA9IGxpbmUuc2xpY2UoY3VycmVudENvbHVtblN0YXJ0LCBpKVxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb2x1bW5OdW1iZXIgPT09IGVuZCkge1xuICAgICAgICAgIGxldCBlbmRDb29yZGluYXRlXG4gICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIG1hdGNoIGlmIHRoZXJlIGlzIG5vIGVuZCBjb2x1bW5cbiAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnVkNGJykge1xuICAgICAgICAgICAgZW5kQ29vcmRpbmF0ZSA9IHRoaXMuX2dldFZjZkVuZChcbiAgICAgICAgICAgICAgc3RhcnRDb29yZGluYXRlLFxuICAgICAgICAgICAgICByZWZTZXEsXG4gICAgICAgICAgICAgIGxpbmUuc2xpY2UoY3VycmVudENvbHVtblN0YXJ0LCBpKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW5kQ29vcmRpbmF0ZSA9IHBhcnNlSW50KGxpbmUuc2xpY2UoY3VycmVudENvbHVtblN0YXJ0LCBpKSwgMTApXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbmRDb29yZGluYXRlIDw9IHJlZ2lvblN0YXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4geyBvdmVybGFwczogZmFsc2UgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50Q29sdW1uU3RhcnQgPSBpICsgMVxuICAgICAgICBjdXJyZW50Q29sdW1uTnVtYmVyICs9IDFcbiAgICAgICAgaWYgKGN1cnJlbnRDb2x1bW5OdW1iZXIgPiBtYXhDb2x1bW4pIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHN0YXJ0Q29vcmRpbmF0ZSwgb3ZlcmxhcHM6IHRydWUgfVxuICB9XG5cbiAgX2dldFZjZkVuZChzdGFydENvb3JkaW5hdGU6IG51bWJlciwgcmVmU2VxOiBzdHJpbmcsIGluZm86IGFueSkge1xuICAgIGxldCBlbmRDb29yZGluYXRlID0gc3RhcnRDb29yZGluYXRlICsgcmVmU2VxLmxlbmd0aFxuICAgIC8vIGlnbm9yZSBUUkEgZmVhdHVyZXMgYXMgdGhleSBzcGVjaWZ5IENIUjIgYW5kIEVORFxuICAgIC8vIGFzIGJlaW5nIG9uIGEgZGlmZmVyZW50IGNocm9tb3NvbWVcbiAgICAvLyBpZiBDSFIyIGlzIG9uIHRoZSBzYW1lIGNocm9tb3NvbWUsIHN0aWxsIGlnbm9yZSBpdFxuICAgIC8vIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIGFub3RoZXIgcGFpcndpc2UgZmVhdHVyZVxuICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhpcyBvbmVcbiAgICBjb25zdCBpc1RSQSA9IGluZm8uaW5kZXhPZignU1ZUWVBFPVRSQScpICE9PSAtMVxuICAgIGlmIChpbmZvWzBdICE9PSAnLicgJiYgIWlzVFJBKSB7XG4gICAgICBsZXQgcHJldkNoYXIgPSAnOydcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5mby5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICBpZiAocHJldkNoYXIgPT09ICc7JyAmJiBpbmZvLnNsaWNlKGosIGogKyA0KSA9PT0gJ0VORD0nKSB7XG4gICAgICAgICAgbGV0IHZhbHVlRW5kID0gaW5mby5pbmRleE9mKCc7JywgailcbiAgICAgICAgICBpZiAodmFsdWVFbmQgPT09IC0xKSB2YWx1ZUVuZCA9IGluZm8ubGVuZ3RoXG4gICAgICAgICAgZW5kQ29vcmRpbmF0ZSA9IHBhcnNlSW50KGluZm8uc2xpY2UoaiArIDQsIHZhbHVlRW5kKSwgMTApXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBwcmV2Q2hhciA9IGluZm9bal1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzVFJBKSB7XG4gICAgICByZXR1cm4gc3RhcnRDb29yZGluYXRlICsgMVxuICAgIH1cbiAgICByZXR1cm4gZW5kQ29vcmRpbmF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybiB0aGUgYXBwcm94aW1hdGUgbnVtYmVyIG9mIGRhdGEgbGluZXMgaW4gdGhlIGdpdmVuIHJlZmVyZW5jZSBzZXF1ZW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmU2VxIHJlZmVyZW5jZSBzZXF1ZW5jZSBuYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBmb3IgbnVtYmVyIG9mIGRhdGEgbGluZXMgcHJlc2VudCBvbiB0aGF0IHJlZmVyZW5jZSBzZXF1ZW5jZVxuICAgKi9cbiAgYXN5bmMgbGluZUNvdW50KHJlZk5hbWU6IHN0cmluZywgb3B0czogT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXgubGluZUNvdW50KHJlZk5hbWUsIG9wdHMpXG4gIH1cblxuICBhc3luYyBfcmVhZFJlZ2lvbihcbiAgICBwb3NpdGlvbjogbnVtYmVyLFxuICAgIGNvbXByZXNzZWRTaXplOiBudW1iZXIsXG4gICAgb3B0czogT3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICBjb25zdCB7IGJ5dGVzUmVhZCwgYnVmZmVyIH0gPSBhd2FpdCB0aGlzLmZpbGVoYW5kbGUucmVhZChcbiAgICAgIEJ1ZmZlci5hbGxvYyhjb21wcmVzc2VkU2l6ZSksXG4gICAgICAwLFxuICAgICAgY29tcHJlc3NlZFNpemUsXG4gICAgICBwb3NpdGlvbixcbiAgICAgIG9wdHMsXG4gICAgKVxuXG4gICAgcmV0dXJuIGJ5dGVzUmVhZCA8IGNvbXByZXNzZWRTaXplID8gYnVmZmVyLnNsaWNlKDAsIGJ5dGVzUmVhZCkgOiBidWZmZXJcbiAgfVxuXG4gIC8qKlxuICAgKiByZWFkIGFuZCB1bmNvbXByZXNzIHRoZSBkYXRhIGluIGEgY2h1bmsgKGNvbXBvc2VkIG9mIG9uZSBvciBtb3JlXG4gICAqIGNvbnRpZ3VvdXMgYmd6aXAgYmxvY2tzKSBvZiB0aGUgZmlsZVxuICAgKiBAcGFyYW0ge0NodW5rfSBjaHVua1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gZm9yIGEgc3RyaW5nIGNodW5rIG9mIHRoZSBmaWxlXG4gICAqL1xuICBhc3luYyByZWFkQ2h1bmsoY2h1bms6IENodW5rLCBvcHRzOiBPcHRpb25zID0ge30pIHtcbiAgICAvLyBmZXRjaCB0aGUgdW5jb21wcmVzc2VkIGRhdGEsIHVuY29tcHJlc3MgY2FyZWZ1bGx5IGEgYmxvY2sgYXQgYSB0aW1lLFxuICAgIC8vIGFuZCBzdG9wIHdoZW4gZG9uZVxuXG4gICAgY29uc3QgY29tcHJlc3NlZERhdGEgPSBhd2FpdCB0aGlzLl9yZWFkUmVnaW9uKFxuICAgICAgY2h1bmsubWludi5ibG9ja1Bvc2l0aW9uLFxuICAgICAgY2h1bmsuZmV0Y2hlZFNpemUoKSxcbiAgICAgIG9wdHMsXG4gICAgKVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdW56aXBDaHVua1NsaWNlKGNvbXByZXNzZWREYXRhLCBjaHVuaylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGVycm9yIGRlY29tcHJlc3NpbmcgY2h1bmsgJHtjaHVuay50b1N0cmluZygpfSAke2V9YClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
530
+ //# sourceMappingURL=tabixIndexedFile.js.map