@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
package/dist/csi.js CHANGED
@@ -1,554 +1,350 @@
1
1
  "use strict";
2
-
3
- var _interopRequireWildcard = require("@babel/runtime-corejs2/helpers/interopRequireWildcard");
4
-
5
- var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
-
7
- var _Object$defineProperty2 = require("@babel/runtime-corejs2/core-js/object/define-property");
8
-
9
- _Object$defineProperty2(exports, "__esModule", {
10
- value: true
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
28
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ var desc = Object.getOwnPropertyDescriptor(m, k);
31
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
32
+ desc = { enumerable: true, get: function() { return m[k]; } };
33
+ }
34
+ Object.defineProperty(o, k2, desc);
35
+ }) : (function(o, m, k, k2) {
36
+ if (k2 === undefined) k2 = k;
37
+ o[k2] = m[k];
38
+ }));
39
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
40
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
41
+ }) : function(o, v) {
42
+ o["default"] = v;
11
43
  });
12
-
13
- exports.default = void 0;
14
-
15
- var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/get-iterator"));
16
-
17
- var _isArray = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/is-array"));
18
-
19
- var _iterator2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/symbol/iterator"));
20
-
21
- var _symbol = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/symbol"));
22
-
23
- var _from = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/from"));
24
-
25
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/define-property"));
26
-
27
- var _defineProperties = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/define-properties"));
28
-
29
- var _getOwnPropertyDescriptors = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors"));
30
-
31
- var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor"));
32
-
33
- var _getOwnPropertySymbols = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols"));
34
-
35
- var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
36
-
37
- var _construct = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/construct"));
38
-
39
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));
40
-
41
- var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
42
-
43
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
44
-
45
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
46
-
47
- var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
48
-
49
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
50
-
51
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
52
-
53
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
54
-
55
- var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
56
-
57
- var _defineProperty3 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
58
-
59
- var _long = _interopRequireDefault(require("long"));
60
-
61
- var _bgzfFilehandle = require("@gmod/bgzf-filehandle");
62
-
63
- var _virtualOffset = _interopRequireWildcard(require("./virtualOffset"));
64
-
65
- var _chunk = _interopRequireDefault(require("./chunk"));
66
-
67
- var _util = require("./util");
68
-
69
- var _indexFile = _interopRequireDefault(require("./indexFile"));
70
-
71
- function _createForOfIteratorHelper(o) { if (typeof _symbol.default === "undefined" || o[_iterator2.default] == null) { if ((0, _isArray.default)(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = (0, _getIterator2.default)(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
72
-
73
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return (0, _from.default)(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
74
-
75
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
76
-
77
- function ownKeys(object, enumerableOnly) { var keys = (0, _keys.default)(object); if (_getOwnPropertySymbols.default) { var symbols = (0, _getOwnPropertySymbols.default)(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return (0, _getOwnPropertyDescriptor.default)(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
78
-
79
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty3.default)(target, key, source[key]); }); } else if (_getOwnPropertyDescriptors.default) { (0, _defineProperties.default)(target, (0, _getOwnPropertyDescriptors.default)(source)); } else { ownKeys(Object(source)).forEach(function (key) { (0, _defineProperty2.default)(target, key, (0, _getOwnPropertyDescriptor.default)(source, key)); }); } } return target; }
80
-
81
- function _createSuper(Derived) { return function () { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = (0, _construct.default)(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
82
-
83
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_construct.default) return false; if (_construct.default.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call((0, _construct.default)(Date, [], function () {})); return true; } catch (e) { return false; } }
84
-
44
+ var __importStar = (this && this.__importStar) || function (mod) {
45
+ if (mod && mod.__esModule) return mod;
46
+ var result = {};
47
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
48
+ __setModuleDefault(result, mod);
49
+ return result;
50
+ };
51
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
52
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
53
+ return new (P || (P = Promise))(function (resolve, reject) {
54
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
55
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
56
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
57
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
58
+ });
59
+ };
60
+ var __generator = (this && this.__generator) || function (thisArg, body) {
61
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
62
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
63
+ function verb(n) { return function (v) { return step([n, v]); }; }
64
+ function step(op) {
65
+ if (f) throw new TypeError("Generator is already executing.");
66
+ while (_) try {
67
+ 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;
68
+ if (y = 0, t) op = [op[0] & 2, t.value];
69
+ switch (op[0]) {
70
+ case 0: case 1: t = op; break;
71
+ case 4: _.label++; return { value: op[1], done: false };
72
+ case 5: _.label++; y = op[1]; op = [0]; continue;
73
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
74
+ default:
75
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
76
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
77
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
78
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
79
+ if (t[2]) _.ops.pop();
80
+ _.trys.pop(); continue;
81
+ }
82
+ op = body.call(thisArg, _);
83
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
84
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
85
+ }
86
+ };
87
+ var __importDefault = (this && this.__importDefault) || function (mod) {
88
+ return (mod && mod.__esModule) ? mod : { "default": mod };
89
+ };
90
+ Object.defineProperty(exports, "__esModule", { value: true });
91
+ var long_1 = __importDefault(require("long"));
92
+ var bgzf_filehandle_1 = require("@gmod/bgzf-filehandle");
93
+ var virtualOffset_1 = __importStar(require("./virtualOffset"));
94
+ var chunk_1 = __importDefault(require("./chunk"));
95
+ var util_1 = require("./util");
96
+ var indexFile_1 = __importDefault(require("./indexFile"));
85
97
  var CSI1_MAGIC = 21582659; // CSI\1
86
-
87
98
  var CSI2_MAGIC = 38359875; // CSI\2
88
-
89
99
  function lshift(num, bits) {
90
- return num * Math.pow(2, bits);
100
+ return num * Math.pow(2, bits);
91
101
  }
92
-
93
102
  function rshift(num, bits) {
94
- return Math.floor(num / Math.pow(2, bits));
103
+ return Math.floor(num / Math.pow(2, bits));
95
104
  }
96
-
97
- var CSI = /*#__PURE__*/function (_IndexFile) {
98
- (0, _inherits2.default)(CSI, _IndexFile);
99
-
100
- var _super = _createSuper(CSI);
101
-
102
- function CSI(args) {
103
- var _this;
104
-
105
- (0, _classCallCheck2.default)(this, CSI);
106
- _this = _super.call(this, args);
107
- (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "maxBinNumber", void 0);
108
- (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "depth", void 0);
109
- (0, _defineProperty3.default)((0, _assertThisInitialized2.default)(_this), "minShift", void 0);
110
- _this.maxBinNumber = 0;
111
- _this.depth = 0;
112
- _this.minShift = 0;
113
- return _this;
114
- }
115
-
116
- (0, _createClass2.default)(CSI, [{
117
- key: "lineCount",
118
- value: function () {
119
- var _lineCount = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(refName) {
120
- var opts,
121
- indexData,
122
- refId,
123
- idx,
124
- stats,
125
- _args = arguments;
126
- return _regenerator.default.wrap(function _callee$(_context) {
127
- while (1) {
128
- switch (_context.prev = _context.next) {
129
- case 0:
130
- opts = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};
131
- _context.next = 3;
132
- return this.parse(opts);
133
-
134
- case 3:
135
- indexData = _context.sent;
136
-
137
- if (indexData) {
138
- _context.next = 6;
139
- break;
140
- }
141
-
142
- return _context.abrupt("return", -1);
143
-
144
- case 6:
145
- refId = indexData.refNameToId[refName];
146
- idx = indexData.indices[refId];
147
-
148
- if (idx) {
149
- _context.next = 10;
150
- break;
151
- }
152
-
153
- return _context.abrupt("return", -1);
154
-
155
- case 10:
156
- stats = indexData.indices[refId].stats;
157
-
158
- if (!stats) {
159
- _context.next = 13;
160
- break;
105
+ var CSI = /** @class */ (function (_super) {
106
+ __extends(CSI, _super);
107
+ function CSI(args) {
108
+ var _this = _super.call(this, args) || this;
109
+ _this.maxBinNumber = 0;
110
+ _this.depth = 0;
111
+ _this.minShift = 0;
112
+ return _this;
113
+ }
114
+ CSI.prototype.lineCount = function (refName, opts) {
115
+ if (opts === void 0) { opts = {}; }
116
+ return __awaiter(this, void 0, void 0, function () {
117
+ var indexData, refId, idx, stats;
118
+ return __generator(this, function (_a) {
119
+ switch (_a.label) {
120
+ case 0: return [4 /*yield*/, this.parse(opts)];
121
+ case 1:
122
+ indexData = _a.sent();
123
+ if (!indexData) {
124
+ return [2 /*return*/, -1];
125
+ }
126
+ refId = indexData.refNameToId[refName];
127
+ idx = indexData.indices[refId];
128
+ if (!idx) {
129
+ return [2 /*return*/, -1];
130
+ }
131
+ stats = indexData.indices[refId].stats;
132
+ if (stats) {
133
+ return [2 /*return*/, stats.lineCount];
134
+ }
135
+ return [2 /*return*/, -1];
161
136
  }
162
-
163
- return _context.abrupt("return", stats.lineCount);
164
-
165
- case 13:
166
- return _context.abrupt("return", -1);
167
-
168
- case 14:
169
- case "end":
170
- return _context.stop();
171
- }
172
- }
173
- }, _callee, this);
174
- }));
175
-
176
- function lineCount(_x) {
177
- return _lineCount.apply(this, arguments);
178
- }
179
-
180
- return lineCount;
181
- }()
182
- }, {
183
- key: "indexCov",
184
- value: function () {
185
- var _indexCov = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
186
- return _regenerator.default.wrap(function _callee2$(_context2) {
187
- while (1) {
188
- switch (_context2.prev = _context2.next) {
189
- case 0:
137
+ });
138
+ });
139
+ };
140
+ CSI.prototype.indexCov = function () {
141
+ return __awaiter(this, void 0, void 0, function () {
142
+ return __generator(this, function (_a) {
190
143
  throw new Error('CSI indexes do not support indexcov');
191
-
192
- case 2:
193
- case "end":
194
- return _context2.stop();
195
- }
196
- }
197
- }, _callee2);
198
- }));
199
-
200
- function indexCov() {
201
- return _indexCov.apply(this, arguments);
202
- }
203
-
204
- return indexCov;
205
- }()
206
- }, {
207
- key: "parseAuxData",
208
- value: function parseAuxData(bytes, offset, auxLength) {
209
- if (auxLength < 30) {
144
+ });
145
+ });
146
+ };
147
+ CSI.prototype.parseAuxData = function (bytes, offset, auxLength) {
148
+ if (auxLength < 30) {
149
+ return {
150
+ refIdToName: [],
151
+ refNameToId: {},
152
+ };
153
+ }
154
+ var formatFlags = bytes.readInt32LE(offset);
155
+ var coordinateType = formatFlags & 0x10000 ? 'zero-based-half-open' : '1-based-closed';
156
+ var format = { 0: 'generic', 1: 'SAM', 2: 'VCF' }[formatFlags & 0xf];
157
+ if (!format) {
158
+ throw new Error("invalid Tabix preset format flags ".concat(formatFlags));
159
+ }
160
+ var columnNumbers = {
161
+ ref: bytes.readInt32LE(offset + 4),
162
+ start: bytes.readInt32LE(offset + 8),
163
+ end: bytes.readInt32LE(offset + 12),
164
+ };
165
+ var metaValue = bytes.readInt32LE(offset + 16);
166
+ var metaChar = metaValue ? String.fromCharCode(metaValue) : '';
167
+ var skipLines = bytes.readInt32LE(offset + 20);
168
+ var nameSectionLength = bytes.readInt32LE(offset + 24);
169
+ var _a = this._parseNameBytes(bytes.slice(offset + 28, offset + 28 + nameSectionLength)), refIdToName = _a.refIdToName, refNameToId = _a.refNameToId;
210
170
  return {
211
- refIdToName: [],
212
- refNameToId: {}
171
+ refIdToName: refIdToName,
172
+ refNameToId: refNameToId,
173
+ skipLines: skipLines,
174
+ metaChar: metaChar,
175
+ columnNumbers: columnNumbers,
176
+ format: format,
177
+ coordinateType: coordinateType,
213
178
  };
214
- }
215
-
216
- var formatFlags = bytes.readInt32LE(offset);
217
- var coordinateType = formatFlags & 0x10000 ? 'zero-based-half-open' : '1-based-closed';
218
- var format = {
219
- 0: 'generic',
220
- 1: 'SAM',
221
- 2: 'VCF'
222
- }[formatFlags & 0xf];
223
- if (!format) throw new Error("invalid Tabix preset format flags ".concat(formatFlags));
224
- var columnNumbers = {
225
- ref: bytes.readInt32LE(offset + 4),
226
- start: bytes.readInt32LE(offset + 8),
227
- end: bytes.readInt32LE(offset + 12)
228
- };
229
- var metaValue = bytes.readInt32LE(offset + 16);
230
- var metaChar = metaValue ? String.fromCharCode(metaValue) : '';
231
- var skipLines = bytes.readInt32LE(offset + 20);
232
- var nameSectionLength = bytes.readInt32LE(offset + 24);
233
-
234
- var _this$_parseNameBytes = this._parseNameBytes(bytes.slice(offset + 28, offset + 28 + nameSectionLength)),
235
- refIdToName = _this$_parseNameBytes.refIdToName,
236
- refNameToId = _this$_parseNameBytes.refNameToId;
237
-
238
- return {
239
- refIdToName: refIdToName,
240
- refNameToId: refNameToId,
241
- skipLines: skipLines,
242
- metaChar: metaChar,
243
- columnNumbers: columnNumbers,
244
- format: format,
245
- coordinateType: coordinateType
246
- };
247
- }
248
- }, {
249
- key: "_parseNameBytes",
250
- value: function _parseNameBytes(namesBytes) {
251
- var currRefId = 0;
252
- var currNameStart = 0;
253
- var refIdToName = [];
254
- var refNameToId = {};
255
-
256
- for (var i = 0; i < namesBytes.length; i += 1) {
257
- if (!namesBytes[i]) {
258
- if (currNameStart < i) {
259
- var refName = namesBytes.toString('utf8', currNameStart, i);
260
- refName = this.renameRefSeq(refName);
261
- refIdToName[currRefId] = refName;
262
- refNameToId[refName] = currRefId;
263
- }
264
-
265
- currNameStart = i + 1;
266
- currRefId += 1;
267
- }
268
- }
269
-
270
- return {
271
- refNameToId: refNameToId,
272
- refIdToName: refIdToName
273
- };
274
- } // fetch and parse the index
275
-
276
- }, {
277
- key: "_parse",
278
- value: function () {
279
- var _parse2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
280
- var _this2 = this;
281
-
282
- var opts,
283
- bytes,
284
- csiVersion,
285
- maxRefLength,
286
- auxLength,
287
- aux,
288
- refCount,
289
- firstDataLine,
290
- currOffset,
291
- indices,
292
- _args3 = arguments;
293
- return _regenerator.default.wrap(function _callee3$(_context3) {
294
- while (1) {
295
- switch (_context3.prev = _context3.next) {
296
- case 0:
297
- opts = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {};
298
- _context3.t0 = _bgzfFilehandle.unzip;
299
- _context3.next = 4;
300
- return this.filehandle.readFile(opts);
301
-
302
- case 4:
303
- _context3.t1 = _context3.sent;
304
- _context3.next = 7;
305
- return (0, _context3.t0)(_context3.t1);
306
-
307
- case 7:
308
- bytes = _context3.sent;
309
-
310
- if (!(bytes.readUInt32LE(0) === CSI1_MAGIC)) {
311
- _context3.next = 12;
312
- break;
313
- }
314
-
315
- csiVersion = 1;
316
- _context3.next = 17;
317
- break;
318
-
319
- case 12:
320
- if (!(bytes.readUInt32LE(0) === CSI2_MAGIC)) {
321
- _context3.next = 16;
322
- break;
179
+ };
180
+ CSI.prototype._parseNameBytes = function (namesBytes) {
181
+ var currRefId = 0;
182
+ var currNameStart = 0;
183
+ var refIdToName = [];
184
+ var refNameToId = {};
185
+ for (var i = 0; i < namesBytes.length; i += 1) {
186
+ if (!namesBytes[i]) {
187
+ if (currNameStart < i) {
188
+ var refName = namesBytes.toString('utf8', currNameStart, i);
189
+ refName = this.renameRefSeq(refName);
190
+ refIdToName[currRefId] = refName;
191
+ refNameToId[refName] = currRefId;
323
192
  }
324
-
325
- csiVersion = 2;
326
- _context3.next = 17;
327
- break;
328
-
329
- case 16:
330
- throw new Error('Not a CSI file');
331
-
332
- case 17:
333
- this.minShift = bytes.readInt32LE(4);
334
- this.depth = bytes.readInt32LE(8);
335
- this.maxBinNumber = ((1 << (this.depth + 1) * 3) - 1) / 7;
336
- maxRefLength = Math.pow(2, this.minShift + this.depth * 3);
337
- auxLength = bytes.readInt32LE(12);
338
- aux = {
339
- refIdToName: [],
340
- refNameToId: {}
341
- };
342
-
343
- if (auxLength) {
344
- aux = this.parseAuxData(bytes, 16, auxLength);
345
- }
346
-
347
- refCount = bytes.readInt32LE(16 + auxLength); // read the indexes for each reference sequence
348
-
349
- currOffset = 16 + auxLength + 4;
350
- indices = new Array(refCount).fill(0).map(function () {
351
- // the binning index
352
- var binCount = bytes.readInt32LE(currOffset);
353
- currOffset += 4;
354
- var binIndex = {};
355
- var stats; // < provided by parsing a pseudo-bin, if present
356
-
357
- for (var j = 0; j < binCount; j += 1) {
358
- var bin = bytes.readUInt32LE(currOffset);
359
-
360
- if (bin > _this2.maxBinNumber) {
361
- // this is a fake bin that actually has stats information
362
- // about the reference sequence in it
363
- stats = _this2.parsePseudoBin(bytes, currOffset + 4);
364
- currOffset += 4 + 8 + 4 + 16 + 16;
365
- } else {
366
- var loffset = (0, _virtualOffset.fromBytes)(bytes, currOffset + 4);
367
- firstDataLine = _this2._findFirstData(firstDataLine, loffset);
368
- var chunkCount = bytes.readInt32LE(currOffset + 12);
369
- currOffset += 16;
370
- var chunks = new Array(chunkCount);
371
-
372
- for (var k = 0; k < chunkCount; k += 1) {
373
- var u = (0, _virtualOffset.fromBytes)(bytes, currOffset);
374
- var v = (0, _virtualOffset.fromBytes)(bytes, currOffset + 8);
375
- currOffset += 16; // this._findFirstData(data, u)
376
-
377
- chunks[k] = new _chunk.default(u, v, bin);
378
- }
379
-
380
- binIndex[bin] = chunks;
381
- }
382
- }
383
-
384
- return {
385
- binIndex: binIndex,
386
- stats: stats
387
- };
388
- });
389
- return _context3.abrupt("return", _objectSpread({}, aux, {
390
- csi: true,
391
- refCount: refCount,
392
- maxBlockSize: 1 << 16,
393
- firstDataLine: firstDataLine,
394
- csiVersion: csiVersion,
395
- indices: indices,
396
- depth: this.depth,
397
- maxBinNumber: this.maxBinNumber,
398
- maxRefLength: maxRefLength
399
- }));
400
-
401
- case 28:
402
- case "end":
403
- return _context3.stop();
193
+ currNameStart = i + 1;
194
+ currRefId += 1;
404
195
  }
405
- }
406
- }, _callee3, this);
407
- }));
408
-
409
- function _parse() {
410
- return _parse2.apply(this, arguments);
411
- }
412
-
413
- return _parse;
414
- }()
415
- }, {
416
- key: "parsePseudoBin",
417
- value: function parsePseudoBin(bytes, offset) {
418
- var lineCount = (0, _util.longToNumber)(_long.default.fromBytesLE(Array.prototype.slice.call(bytes, offset + 28, offset + 36), true));
419
- return {
420
- lineCount: lineCount
421
- };
422
- }
423
- }, {
424
- key: "blocksForRange",
425
- value: function () {
426
- var _blocksForRange = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(refName, min, max) {
427
- var opts,
428
- indexData,
429
- refId,
430
- ba,
431
- overlappingBins,
432
- chunks,
433
- _iterator,
434
- _step,
435
- _step$value,
436
- start,
437
- end,
438
- bin,
439
- binChunks,
440
- c,
441
- _args4 = arguments;
442
-
443
- return _regenerator.default.wrap(function _callee4$(_context4) {
444
- while (1) {
445
- switch (_context4.prev = _context4.next) {
446
- case 0:
447
- opts = _args4.length > 3 && _args4[3] !== undefined ? _args4[3] : {};
448
-
449
- if (min < 0) {
450
- min = 0;
451
- }
452
-
453
- _context4.next = 4;
454
- return this.parse(opts);
455
-
456
- case 4:
457
- indexData = _context4.sent;
458
-
459
- if (indexData) {
460
- _context4.next = 7;
461
- break;
462
- }
463
-
464
- return _context4.abrupt("return", []);
465
-
466
- case 7:
467
- refId = indexData.refNameToId[refName];
468
- ba = indexData.indices[refId];
469
-
470
- if (ba) {
471
- _context4.next = 11;
472
- break;
196
+ }
197
+ return { refNameToId: refNameToId, refIdToName: refIdToName };
198
+ };
199
+ // fetch and parse the index
200
+ CSI.prototype._parse = function (opts) {
201
+ if (opts === void 0) { opts = {}; }
202
+ return __awaiter(this, void 0, void 0, function () {
203
+ var bytes, _a, csiVersion, maxRefLength, auxLength, aux, refCount, firstDataLine, currOffset, indices;
204
+ var _this = this;
205
+ return __generator(this, function (_b) {
206
+ switch (_b.label) {
207
+ case 0:
208
+ _a = bgzf_filehandle_1.unzip;
209
+ return [4 /*yield*/, this.filehandle.readFile(opts)];
210
+ case 1: return [4 /*yield*/, _a.apply(void 0, [(_b.sent())])
211
+ // check TBI magic numbers
212
+ ];
213
+ case 2:
214
+ bytes = _b.sent();
215
+ if (bytes.readUInt32LE(0) === CSI1_MAGIC) {
216
+ csiVersion = 1;
217
+ }
218
+ else if (bytes.readUInt32LE(0) === CSI2_MAGIC) {
219
+ csiVersion = 2;
220
+ }
221
+ else {
222
+ throw new Error('Not a CSI file');
223
+ // TODO: do we need to support big-endian CSI files?
224
+ }
225
+ this.minShift = bytes.readInt32LE(4);
226
+ this.depth = bytes.readInt32LE(8);
227
+ this.maxBinNumber = ((1 << ((this.depth + 1) * 3)) - 1) / 7;
228
+ maxRefLength = Math.pow(2, (this.minShift + this.depth * 3));
229
+ auxLength = bytes.readInt32LE(12);
230
+ aux = {
231
+ refIdToName: [],
232
+ refNameToId: {},
233
+ };
234
+ if (auxLength) {
235
+ aux = this.parseAuxData(bytes, 16, auxLength);
236
+ }
237
+ refCount = bytes.readInt32LE(16 + auxLength);
238
+ currOffset = 16 + auxLength + 4;
239
+ indices = new Array(refCount).fill(0).map(function () {
240
+ // the binning index
241
+ var binCount = bytes.readInt32LE(currOffset);
242
+ currOffset += 4;
243
+ var binIndex = {};
244
+ var stats; // < provided by parsing a pseudo-bin, if present
245
+ for (var j = 0; j < binCount; j += 1) {
246
+ var bin = bytes.readUInt32LE(currOffset);
247
+ if (bin > _this.maxBinNumber) {
248
+ // this is a fake bin that actually has stats information
249
+ // about the reference sequence in it
250
+ stats = _this.parsePseudoBin(bytes, currOffset + 4);
251
+ currOffset += 4 + 8 + 4 + 16 + 16;
252
+ }
253
+ else {
254
+ var loffset = (0, virtualOffset_1.fromBytes)(bytes, currOffset + 4);
255
+ firstDataLine = _this._findFirstData(firstDataLine, loffset);
256
+ var chunkCount = bytes.readInt32LE(currOffset + 12);
257
+ currOffset += 16;
258
+ var chunks = new Array(chunkCount);
259
+ for (var k = 0; k < chunkCount; k += 1) {
260
+ var u = (0, virtualOffset_1.fromBytes)(bytes, currOffset);
261
+ var v = (0, virtualOffset_1.fromBytes)(bytes, currOffset + 8);
262
+ currOffset += 16;
263
+ // this._findFirstData(data, u)
264
+ chunks[k] = new chunk_1.default(u, v, bin);
265
+ }
266
+ binIndex[bin] = chunks;
267
+ }
268
+ }
269
+ return { binIndex: binIndex, stats: stats };
270
+ });
271
+ return [2 /*return*/, __assign(__assign({}, aux), { csi: true, refCount: refCount, maxBlockSize: 1 << 16, firstDataLine: firstDataLine, csiVersion: csiVersion, indices: indices, depth: this.depth, maxBinNumber: this.maxBinNumber, maxRefLength: maxRefLength })];
473
272
  }
474
-
475
- return _context4.abrupt("return", []);
476
-
477
- case 11:
478
- // const { linearIndex, binIndex } = indexes
479
- overlappingBins = this.reg2bins(min, max); // List of bin #s that overlap min, max
480
-
481
- chunks = []; // Find chunks in overlapping bins. Leaf bins (< 4681) are not pruned
482
-
483
- _iterator = _createForOfIteratorHelper(overlappingBins);
484
-
485
- try {
486
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
487
- _step$value = (0, _slicedToArray2.default)(_step.value, 2), start = _step$value[0], end = _step$value[1];
488
-
489
- for (bin = start; bin <= end; bin++) {
490
- if (ba.binIndex[bin]) {
491
- binChunks = ba.binIndex[bin];
492
-
493
- for (c = 0; c < binChunks.length; ++c) {
494
- chunks.push(new _chunk.default(binChunks[c].minv, binChunks[c].maxv, bin));
273
+ });
274
+ });
275
+ };
276
+ CSI.prototype.parsePseudoBin = function (bytes, offset) {
277
+ var lineCount = (0, util_1.longToNumber)(long_1.default.fromBytesLE(Array.prototype.slice.call(bytes, offset + 28, offset + 36), true));
278
+ return { lineCount: lineCount };
279
+ };
280
+ CSI.prototype.blocksForRange = function (refName, min, max, opts) {
281
+ if (opts === void 0) { opts = {}; }
282
+ return __awaiter(this, void 0, void 0, function () {
283
+ var indexData, refId, ba, overlappingBins, chunks, _i, overlappingBins_1, _a, start, end, bin, binChunks, c;
284
+ return __generator(this, function (_b) {
285
+ switch (_b.label) {
286
+ case 0:
287
+ if (min < 0) {
288
+ min = 0;
495
289
  }
496
- }
497
- }
498
- }
499
- } catch (err) {
500
- _iterator.e(err);
501
- } finally {
502
- _iterator.f();
290
+ return [4 /*yield*/, this.parse(opts)];
291
+ case 1:
292
+ indexData = _b.sent();
293
+ if (!indexData) {
294
+ return [2 /*return*/, []];
295
+ }
296
+ refId = indexData.refNameToId[refName];
297
+ ba = indexData.indices[refId];
298
+ if (!ba) {
299
+ return [2 /*return*/, []];
300
+ }
301
+ overlappingBins = this.reg2bins(min, max) // List of bin #s that overlap min, max
302
+ ;
303
+ chunks = [];
304
+ // Find chunks in overlapping bins. Leaf bins (< 4681) are not pruned
305
+ for (_i = 0, overlappingBins_1 = overlappingBins; _i < overlappingBins_1.length; _i++) {
306
+ _a = overlappingBins_1[_i], start = _a[0], end = _a[1];
307
+ for (bin = start; bin <= end; bin++) {
308
+ if (ba.binIndex[bin]) {
309
+ binChunks = ba.binIndex[bin];
310
+ for (c = 0; c < binChunks.length; ++c) {
311
+ chunks.push(new chunk_1.default(binChunks[c].minv, binChunks[c].maxv, bin));
312
+ }
313
+ }
314
+ }
315
+ }
316
+ return [2 /*return*/, (0, util_1.optimizeChunks)(chunks, new virtualOffset_1.default(0, 0))];
503
317
  }
504
-
505
- return _context4.abrupt("return", (0, _util.optimizeChunks)(chunks, new _virtualOffset.default(0, 0)));
506
-
507
- case 16:
508
- case "end":
509
- return _context4.stop();
510
- }
511
- }
512
- }, _callee4, this);
513
- }));
514
-
515
- function blocksForRange(_x2, _x3, _x4) {
516
- return _blocksForRange.apply(this, arguments);
517
- }
518
-
519
- return blocksForRange;
520
- }()
318
+ });
319
+ });
320
+ };
521
321
  /**
522
322
  * calculate the list of bins that may overlap with region [beg,end) (zero-based half-open)
523
- * @returns {Array[number]}
524
323
  */
525
-
526
- }, {
527
- key: "reg2bins",
528
- value: function reg2bins(beg, end) {
529
- beg -= 1; // < convert to 1-based closed
530
-
531
- if (beg < 1) beg = 1;
532
- if (end > Math.pow(2, 50)) end = Math.pow(2, 34); // 17 GiB ought to be enough for anybody
533
-
534
- end -= 1;
535
- var l = 0;
536
- var t = 0;
537
- var s = this.minShift + this.depth * 3;
538
- var bins = [];
539
-
540
- for (; l <= this.depth; s -= 3, t += lshift(1, l * 3), l += 1) {
541
- var b = t + rshift(beg, s);
542
- var e = t + rshift(end, s);
543
- if (e - b + bins.length > this.maxBinNumber) throw new Error("query ".concat(beg, "-").concat(end, " is too large for current binning scheme (shift ").concat(this.minShift, ", depth ").concat(this.depth, "), try a smaller query or a coarser index binning scheme"));
544
- bins.push([b, e]);
545
- }
546
-
547
- return bins;
548
- }
549
- }]);
550
- return CSI;
551
- }(_indexFile.default);
552
-
324
+ CSI.prototype.reg2bins = function (beg, end) {
325
+ beg -= 1; // < convert to 1-based closed
326
+ if (beg < 1) {
327
+ beg = 1;
328
+ }
329
+ if (end > Math.pow(2, 50)) {
330
+ end = Math.pow(2, 34);
331
+ } // 17 GiB ought to be enough for anybody
332
+ end -= 1;
333
+ var l = 0;
334
+ var t = 0;
335
+ var s = this.minShift + this.depth * 3;
336
+ var bins = [];
337
+ for (; l <= this.depth; s -= 3, t += lshift(1, l * 3), l += 1) {
338
+ var b = t + rshift(beg, s);
339
+ var e = t + rshift(end, s);
340
+ if (e - b + bins.length > this.maxBinNumber) {
341
+ throw new Error("query ".concat(beg, "-").concat(end, " is too large for current binning scheme (shift ").concat(this.minShift, ", depth ").concat(this.depth, "), try a smaller query or a coarser index binning scheme"));
342
+ }
343
+ bins.push([b, e]);
344
+ }
345
+ return bins;
346
+ };
347
+ return CSI;
348
+ }(indexFile_1.default));
553
349
  exports.default = CSI;
554
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jc2kudHMiXSwibmFtZXMiOlsiQ1NJMV9NQUdJQyIsIkNTSTJfTUFHSUMiLCJsc2hpZnQiLCJudW0iLCJiaXRzIiwicnNoaWZ0IiwiTWF0aCIsImZsb29yIiwiQ1NJIiwiYXJncyIsIm1heEJpbk51bWJlciIsImRlcHRoIiwibWluU2hpZnQiLCJyZWZOYW1lIiwib3B0cyIsInBhcnNlIiwiaW5kZXhEYXRhIiwicmVmSWQiLCJyZWZOYW1lVG9JZCIsImlkeCIsImluZGljZXMiLCJzdGF0cyIsImxpbmVDb3VudCIsIkVycm9yIiwiYnl0ZXMiLCJvZmZzZXQiLCJhdXhMZW5ndGgiLCJyZWZJZFRvTmFtZSIsImZvcm1hdEZsYWdzIiwicmVhZEludDMyTEUiLCJjb29yZGluYXRlVHlwZSIsImZvcm1hdCIsImNvbHVtbk51bWJlcnMiLCJyZWYiLCJzdGFydCIsImVuZCIsIm1ldGFWYWx1ZSIsIm1ldGFDaGFyIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwic2tpcExpbmVzIiwibmFtZVNlY3Rpb25MZW5ndGgiLCJfcGFyc2VOYW1lQnl0ZXMiLCJzbGljZSIsIm5hbWVzQnl0ZXMiLCJjdXJyUmVmSWQiLCJjdXJyTmFtZVN0YXJ0IiwiaSIsImxlbmd0aCIsInRvU3RyaW5nIiwicmVuYW1lUmVmU2VxIiwidW56aXAiLCJmaWxlaGFuZGxlIiwicmVhZEZpbGUiLCJyZWFkVUludDMyTEUiLCJjc2lWZXJzaW9uIiwibWF4UmVmTGVuZ3RoIiwiYXV4IiwicGFyc2VBdXhEYXRhIiwicmVmQ291bnQiLCJjdXJyT2Zmc2V0IiwiQXJyYXkiLCJmaWxsIiwibWFwIiwiYmluQ291bnQiLCJiaW5JbmRleCIsImoiLCJiaW4iLCJwYXJzZVBzZXVkb0JpbiIsImxvZmZzZXQiLCJmaXJzdERhdGFMaW5lIiwiX2ZpbmRGaXJzdERhdGEiLCJjaHVua0NvdW50IiwiY2h1bmtzIiwiayIsInUiLCJ2IiwiQ2h1bmsiLCJjc2kiLCJtYXhCbG9ja1NpemUiLCJMb25nIiwiZnJvbUJ5dGVzTEUiLCJwcm90b3R5cGUiLCJjYWxsIiwibWluIiwibWF4IiwiYmEiLCJvdmVybGFwcGluZ0JpbnMiLCJyZWcyYmlucyIsImJpbkNodW5rcyIsImMiLCJwdXNoIiwibWludiIsIm1heHYiLCJWaXJ0dWFsT2Zmc2V0IiwiYmVnIiwibCIsInQiLCJzIiwiYmlucyIsImIiLCJlIiwiSW5kZXhGaWxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxVQUFVLEdBQUcsUUFBbkIsQyxDQUE0Qjs7QUFDNUIsSUFBTUMsVUFBVSxHQUFHLFFBQW5CLEMsQ0FBNEI7O0FBRTVCLFNBQVNDLE1BQVQsQ0FBZ0JDLEdBQWhCLEVBQTZCQyxJQUE3QixFQUEyQztBQUN6QyxTQUFPRCxHQUFHLFlBQUcsQ0FBSCxFQUFRQyxJQUFSLENBQVY7QUFDRDs7QUFDRCxTQUFTQyxNQUFULENBQWdCRixHQUFoQixFQUE2QkMsSUFBN0IsRUFBMkM7QUFDekMsU0FBT0UsSUFBSSxDQUFDQyxLQUFMLENBQVdKLEdBQUcsWUFBRyxDQUFILEVBQVFDLElBQVIsQ0FBZCxDQUFQO0FBQ0Q7O0lBRW9CSSxHOzs7OztBQUluQixlQUFZQyxJQUFaLEVBQXVCO0FBQUE7O0FBQUE7QUFDckIsOEJBQU1BLElBQU47QUFEcUI7QUFBQTtBQUFBO0FBRXJCLFVBQUtDLFlBQUwsR0FBb0IsQ0FBcEI7QUFDQSxVQUFLQyxLQUFMLEdBQWEsQ0FBYjtBQUNBLFVBQUtDLFFBQUwsR0FBZ0IsQ0FBaEI7QUFKcUI7QUFLdEI7Ozs7O2dIQUNlQyxPOzs7Ozs7Ozs7OztBQUFpQkMsZ0JBQUFBLEksMkRBQWdCLEU7O3VCQUN2QixLQUFLQyxLQUFMLENBQVdELElBQVgsQzs7O0FBQWxCRSxnQkFBQUEsUzs7b0JBQ0RBLFM7Ozs7O2lEQUFrQixDQUFDLEM7OztBQUNsQkMsZ0JB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T0YsSUFBUDtBQUNEOzs7RUFuUDhCRyxrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb25nIGZyb20gJ2xvbmcnXG5pbXBvcnQgeyB1bnppcCB9IGZyb20gJ0BnbW9kL2JnemYtZmlsZWhhbmRsZSdcblxuaW1wb3J0IFZpcnR1YWxPZmZzZXQsIHsgZnJvbUJ5dGVzIH0gZnJvbSAnLi92aXJ0dWFsT2Zmc2V0J1xuaW1wb3J0IENodW5rIGZyb20gJy4vY2h1bmsnXG5pbXBvcnQgeyBsb25nVG9OdW1iZXIsIG9wdGltaXplQ2h1bmtzIH0gZnJvbSAnLi91dGlsJ1xuXG5pbXBvcnQgSW5kZXhGaWxlLCB7IE9wdGlvbnMgfSBmcm9tICcuL2luZGV4RmlsZSdcblxuY29uc3QgQ1NJMV9NQUdJQyA9IDIxNTgyNjU5IC8vIENTSVxcMVxuY29uc3QgQ1NJMl9NQUdJQyA9IDM4MzU5ODc1IC8vIENTSVxcMlxuXG5mdW5jdGlvbiBsc2hpZnQobnVtOiBudW1iZXIsIGJpdHM6IG51bWJlcikge1xuICByZXR1cm4gbnVtICogMiAqKiBiaXRzXG59XG5mdW5jdGlvbiByc2hpZnQobnVtOiBudW1iZXIsIGJpdHM6IG51bWJlcikge1xuICByZXR1cm4gTWF0aC5mbG9vcihudW0gLyAyICoqIGJpdHMpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENTSSBleHRlbmRzIEluZGV4RmlsZSB7XG4gIHByaXZhdGUgbWF4QmluTnVtYmVyOiBudW1iZXJcbiAgcHJpdmF0ZSBkZXB0aDogbnVtYmVyXG4gIHByaXZhdGUgbWluU2hpZnQ6IG51bWJlclxuICBjb25zdHJ1Y3RvcihhcmdzOiBhbnkpIHtcbiAgICBzdXBlcihhcmdzKVxuICAgIHRoaXMubWF4QmluTnVtYmVyID0gMFxuICAgIHRoaXMuZGVwdGggPSAwXG4gICAgdGhpcy5taW5TaGlmdCA9IDBcbiAgfVxuICBhc3luYyBsaW5lQ291bnQocmVmTmFtZTogc3RyaW5nLCBvcHRzOiBPcHRpb25zID0ge30pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGluZGV4RGF0YSA9IGF3YWl0IHRoaXMucGFyc2Uob3B0cylcbiAgICBpZiAoIWluZGV4RGF0YSkgcmV0dXJuIC0xXG4gICAgY29uc3QgcmVmSWQgPSBpbmRleERhdGEucmVmTmFtZVRvSWRbcmVmTmFtZV1cbiAgICBjb25zdCBpZHggPSBpbmRleERhdGEuaW5kaWNlc1tyZWZJZF1cbiAgICBpZiAoIWlkeCkgcmV0dXJuIC0xXG4gICAgY29uc3QgeyBzdGF0cyB9ID0gaW5kZXhEYXRhLmluZGljZXNbcmVmSWRdXG4gICAgaWYgKHN0YXRzKSByZXR1cm4gc3RhdHMubGluZUNvdW50XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgYXN5bmMgaW5kZXhDb3YoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDU0kgaW5kZXhlcyBkbyBub3Qgc3VwcG9ydCBpbmRleGNvdicpXG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBwYXJzZUF1eERhdGEoYnl0ZXM6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGF1eExlbmd0aDogbnVtYmVyKSB7XG4gICAgaWYgKGF1eExlbmd0aCA8IDMwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWZJZFRvTmFtZTogW10sXG4gICAgICAgIHJlZk5hbWVUb0lkOiB7fSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmb3JtYXRGbGFncyA9IGJ5dGVzLnJlYWRJbnQzMkxFKG9mZnNldClcbiAgICBjb25zdCBjb29yZGluYXRlVHlwZSA9XG4gICAgICBmb3JtYXRGbGFncyAmIDB4MTAwMDAgPyAnemVyby1iYXNlZC1oYWxmLW9wZW4nIDogJzEtYmFzZWQtY2xvc2VkJ1xuICAgIGNvbnN0IGZvcm1hdCA9ICh7IDA6ICdnZW5lcmljJywgMTogJ1NBTScsIDI6ICdWQ0YnIH0gYXMge1xuICAgICAgW2tleTogbnVtYmVyXTogc3RyaW5nXG4gICAgfSlbZm9ybWF0RmxhZ3MgJiAweGZdXG4gICAgaWYgKCFmb3JtYXQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgVGFiaXggcHJlc2V0IGZvcm1hdCBmbGFncyAke2Zvcm1hdEZsYWdzfWApXG4gICAgY29uc3QgY29sdW1uTnVtYmVycyA9IHtcbiAgICAgIHJlZjogYnl0ZXMucmVhZEludDMyTEUob2Zmc2V0ICsgNCksXG4gICAgICBzdGFydDogYnl0ZXMucmVhZEludDMyTEUob2Zmc2V0ICsgOCksXG4gICAgICBlbmQ6IGJ5dGVzLnJlYWRJbnQzMkxFKG9mZnNldCArIDEyKSxcbiAgICB9XG4gICAgY29uc3QgbWV0YVZhbHVlID0gYnl0ZXMucmVhZEludDMyTEUob2Zmc2V0ICsgMTYpXG4gICAgY29uc3QgbWV0YUNoYXIgPSBtZXRhVmFsdWUgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKG1ldGFWYWx1ZSkgOiAnJ1xuICAgIGNvbnN0IHNraXBMaW5lcyA9IGJ5dGVzLnJlYWRJbnQzMkxFKG9mZnNldCArIDIwKVxuICAgIGNvbnN0IG5hbWVTZWN0aW9uTGVuZ3RoID0gYnl0ZXMucmVhZEludDMyTEUob2Zmc2V0ICsgMjQpXG5cbiAgICBjb25zdCB7IHJlZklkVG9OYW1lLCByZWZOYW1lVG9JZCB9ID0gdGhpcy5fcGFyc2VOYW1lQnl0ZXMoXG4gICAgICBieXRlcy5zbGljZShvZmZzZXQgKyAyOCwgb2Zmc2V0ICsgMjggKyBuYW1lU2VjdGlvbkxlbmd0aCksXG4gICAgKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZklkVG9OYW1lLFxuICAgICAgcmVmTmFtZVRvSWQsXG4gICAgICBza2lwTGluZXMsXG4gICAgICBtZXRhQ2hhcixcbiAgICAgIGNvbHVtbk51bWJlcnMsXG4gICAgICBmb3JtYXQsXG4gICAgICBjb29yZGluYXRlVHlwZSxcbiAgICB9XG4gIH1cblxuICBfcGFyc2VOYW1lQnl0ZXMobmFtZXNCeXRlczogQnVmZmVyKSB7XG4gICAgbGV0IGN1cnJSZWZJZCA9IDBcbiAgICBsZXQgY3Vyck5hbWVTdGFydCA9IDBcbiAgICBjb25zdCByZWZJZFRvTmFtZSA9IFtdXG4gICAgY29uc3QgcmVmTmFtZVRvSWQ6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXNCeXRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKCFuYW1lc0J5dGVzW2ldKSB7XG4gICAgICAgIGlmIChjdXJyTmFtZVN0YXJ0IDwgaSkge1xuICAgICAgICAgIGxldCByZWZOYW1lID0gbmFtZXNCeXRlcy50b1N0cmluZygndXRmOCcsIGN1cnJOYW1lU3RhcnQsIGkpXG4gICAgICAgICAgcmVmTmFtZSA9IHRoaXMucmVuYW1lUmVmU2VxKHJlZk5hbWUpXG4gICAgICAgICAgcmVmSWRUb05hbWVbY3VyclJlZklkXSA9IHJlZk5hbWVcbiAgICAgICAgICByZWZOYW1lVG9JZFtyZWZOYW1lXSA9IGN1cnJSZWZJZFxuICAgICAgICB9XG4gICAgICAgIGN1cnJOYW1lU3RhcnQgPSBpICsgMVxuICAgICAgICBjdXJyUmVmSWQgKz0gMVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyByZWZOYW1lVG9JZCwgcmVmSWRUb05hbWUgfVxuICB9XG5cbiAgLy8gZmV0Y2ggYW5kIHBhcnNlIHRoZSBpbmRleFxuXG4gIGFzeW5jIF9wYXJzZShvcHRzOiBPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBieXRlcyA9IGF3YWl0IHVuemlwKChhd2FpdCB0aGlzLmZpbGVoYW5kbGUucmVhZEZpbGUob3B0cykpIGFzIEJ1ZmZlcilcblxuICAgIC8vIGNoZWNrIFRCSSBtYWdpYyBudW1iZXJzXG4gICAgbGV0IGNzaVZlcnNpb25cbiAgICBpZiAoYnl0ZXMucmVhZFVJbnQzMkxFKDApID09PSBDU0kxX01BR0lDKSB7XG4gICAgICBjc2lWZXJzaW9uID0gMVxuICAgIH0gZWxzZSBpZiAoYnl0ZXMucmVhZFVJbnQzMkxFKDApID09PSBDU0kyX01BR0lDKSB7XG4gICAgICBjc2lWZXJzaW9uID0gMlxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhIENTSSBmaWxlJylcbiAgICAgIC8vIFRPRE86IGRvIHdlIG5lZWQgdG8gc3VwcG9ydCBiaWctZW5kaWFuIENTSSBmaWxlcz9cbiAgICB9XG5cbiAgICB0aGlzLm1pblNoaWZ0ID0gYnl0ZXMucmVhZEludDMyTEUoNClcbiAgICB0aGlzLmRlcHRoID0gYnl0ZXMucmVhZEludDMyTEUoOClcbiAgICB0aGlzLm1heEJpbk51bWJlciA9ICgoMSA8PCAoKHRoaXMuZGVwdGggKyAxKSAqIDMpKSAtIDEpIC8gN1xuICAgIGNvbnN0IG1heFJlZkxlbmd0aCA9IDIgKiogKHRoaXMubWluU2hpZnQgKyB0aGlzLmRlcHRoICogMylcblxuICAgIGNvbnN0IGF1eExlbmd0aCA9IGJ5dGVzLnJlYWRJbnQzMkxFKDEyKVxuICAgIGxldCBhdXg6IHtcbiAgICAgIHJlZklkVG9OYW1lOiBzdHJpbmdbXVxuICAgICAgcmVmTmFtZVRvSWQ6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH1cbiAgICB9ID0ge1xuICAgICAgcmVmSWRUb05hbWU6IFtdLFxuICAgICAgcmVmTmFtZVRvSWQ6IHt9LFxuICAgIH1cbiAgICBpZiAoYXV4TGVuZ3RoKSB7XG4gICAgICBhdXggPSB0aGlzLnBhcnNlQXV4RGF0YShieXRlcywgMTYsIGF1eExlbmd0aClcbiAgICB9XG4gICAgY29uc3QgcmVmQ291bnQgPSBieXRlcy5yZWFkSW50MzJMRSgxNiArIGF1eExlbmd0aClcblxuICAgIC8vIHJlYWQgdGhlIGluZGV4ZXMgZm9yIGVhY2ggcmVmZXJlbmNlIHNlcXVlbmNlXG4gICAgbGV0IGZpcnN0RGF0YUxpbmU6IFZpcnR1YWxPZmZzZXQgfCB1bmRlZmluZWRcbiAgICBsZXQgY3Vyck9mZnNldCA9IDE2ICsgYXV4TGVuZ3RoICsgNFxuICAgIGNvbnN0IGluZGljZXMgPSBuZXcgQXJyYXkocmVmQ291bnQpLmZpbGwoMCkubWFwKCgpID0+IHtcbiAgICAgIC8vIHRoZSBiaW5uaW5nIGluZGV4XG4gICAgICBjb25zdCBiaW5Db3VudCA9IGJ5dGVzLnJlYWRJbnQzMkxFKGN1cnJPZmZzZXQpXG4gICAgICBjdXJyT2Zmc2V0ICs9IDRcbiAgICAgIGNvbnN0IGJpbkluZGV4OiB7IFtrZXk6IHN0cmluZ106IENodW5rW10gfSA9IHt9XG4gICAgICBsZXQgc3RhdHMgLy8gPCBwcm92aWRlZCBieSBwYXJzaW5nIGEgcHNldWRvLWJpbiwgaWYgcHJlc2VudFxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBiaW5Db3VudDsgaiArPSAxKSB7XG4gICAgICAgIGNvbnN0IGJpbiA9IGJ5dGVzLnJlYWRVSW50MzJMRShjdXJyT2Zmc2V0KVxuICAgICAgICBpZiAoYmluID4gdGhpcy5tYXhCaW5OdW1iZXIpIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIGEgZmFrZSBiaW4gdGhhdCBhY3R1YWxseSBoYXMgc3RhdHMgaW5mb3JtYXRpb25cbiAgICAgICAgICAvLyBhYm91dCB0aGUgcmVmZXJlbmNlIHNlcXVlbmNlIGluIGl0XG4gICAgICAgICAgc3RhdHMgPSB0aGlzLnBhcnNlUHNldWRvQmluKGJ5dGVzLCBjdXJyT2Zmc2V0ICsgNClcbiAgICAgICAgICBjdXJyT2Zmc2V0ICs9IDQgKyA4ICsgNCArIDE2ICsgMTZcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBsb2Zmc2V0ID0gZnJvbUJ5dGVzKGJ5dGVzLCBjdXJyT2Zmc2V0ICsgNClcbiAgICAgICAgICBmaXJzdERhdGFMaW5lID0gdGhpcy5fZmluZEZpcnN0RGF0YShmaXJzdERhdGFMaW5lLCBsb2Zmc2V0KVxuICAgICAgICAgIGNvbnN0IGNodW5rQ291bnQgPSBieXRlcy5yZWFkSW50MzJMRShjdXJyT2Zmc2V0ICsgMTIpXG4gICAgICAgICAgY3Vyck9mZnNldCArPSAxNlxuICAgICAgICAgIGNvbnN0IGNodW5rcyA9IG5ldyBBcnJheShjaHVua0NvdW50KVxuICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY2h1bmtDb3VudDsgayArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCB1ID0gZnJvbUJ5dGVzKGJ5dGVzLCBjdXJyT2Zmc2V0KVxuICAgICAgICAgICAgY29uc3QgdiA9IGZyb21CeXRlcyhieXRlcywgY3Vyck9mZnNldCArIDgpXG4gICAgICAgICAgICBjdXJyT2Zmc2V0ICs9IDE2XG4gICAgICAgICAgICAvLyB0aGlzLl9maW5kRmlyc3REYXRhKGRhdGEsIHUpXG4gICAgICAgICAgICBjaHVua3Nba10gPSBuZXcgQ2h1bmsodSwgdiwgYmluKVxuICAgICAgICAgIH1cbiAgICAgICAgICBiaW5JbmRleFtiaW5dID0gY2h1bmtzXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgYmluSW5kZXgsIHN0YXRzIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmF1eCxcbiAgICAgIGNzaTogdHJ1ZSxcbiAgICAgIHJlZkNvdW50LFxuICAgICAgbWF4QmxvY2tTaXplOiAxIDw8IDE2LFxuICAgICAgZmlyc3REYXRhTGluZSxcbiAgICAgIGNzaVZlcnNpb24sXG4gICAgICBpbmRpY2VzLFxuICAgICAgZGVwdGg6IHRoaXMuZGVwdGgsXG4gICAgICBtYXhCaW5OdW1iZXI6IHRoaXMubWF4QmluTnVtYmVyLFxuICAgICAgbWF4UmVmTGVuZ3RoLFxuICAgIH1cbiAgfVxuXG4gIHBhcnNlUHNldWRvQmluKGJ5dGVzOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKSB7XG4gICAgY29uc3QgbGluZUNvdW50ID0gbG9uZ1RvTnVtYmVyKFxuICAgICAgTG9uZy5mcm9tQnl0ZXNMRShcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYnl0ZXMsIG9mZnNldCArIDI4LCBvZmZzZXQgKyAzNiksXG4gICAgICAgIHRydWUsXG4gICAgICApLFxuICAgIClcbiAgICByZXR1cm4geyBsaW5lQ291bnQgfVxuICB9XG5cbiAgYXN5bmMgYmxvY2tzRm9yUmFuZ2UoXG4gICAgcmVmTmFtZTogc3RyaW5nLFxuICAgIG1pbjogbnVtYmVyLFxuICAgIG1heDogbnVtYmVyLFxuICAgIG9wdHM6IE9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgaWYgKG1pbiA8IDApIHtcbiAgICAgIG1pbiA9IDBcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleERhdGEgPSBhd2FpdCB0aGlzLnBhcnNlKG9wdHMpXG4gICAgaWYgKCFpbmRleERhdGEpIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgICBjb25zdCByZWZJZCA9IGluZGV4RGF0YS5yZWZOYW1lVG9JZFtyZWZOYW1lXVxuICAgIGNvbnN0IGJhID0gaW5kZXhEYXRhLmluZGljZXNbcmVmSWRdXG4gICAgaWYgKCFiYSkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgLy8gY29uc3QgeyBsaW5lYXJJbmRleCwgYmluSW5kZXggfSA9IGluZGV4ZXNcblxuICAgIGNvbnN0IG92ZXJsYXBwaW5nQmlucyA9IHRoaXMucmVnMmJpbnMobWluLCBtYXgpIC8vIExpc3Qgb2YgYmluICNzIHRoYXQgb3ZlcmxhcCBtaW4sIG1heFxuICAgIGNvbnN0IGNodW5rczogQ2h1bmtbXSA9IFtdXG5cbiAgICAvLyBGaW5kIGNodW5rcyBpbiBvdmVybGFwcGluZyBiaW5zLiAgTGVhZiBiaW5zICg8IDQ2ODEpIGFyZSBub3QgcHJ1bmVkXG4gICAgZm9yIChjb25zdCBbc3RhcnQsIGVuZF0gb2Ygb3ZlcmxhcHBpbmdCaW5zKSB7XG4gICAgICBmb3IgKGxldCBiaW4gPSBzdGFydDsgYmluIDw9IGVuZDsgYmluKyspIHtcbiAgICAgICAgaWYgKGJhLmJpbkluZGV4W2Jpbl0pIHtcbiAgICAgICAgICBjb25zdCBiaW5DaHVua3MgPSBiYS5iaW5JbmRleFtiaW5dXG4gICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBiaW5DaHVua3MubGVuZ3RoOyArK2MpIHtcbiAgICAgICAgICAgIGNodW5rcy5wdXNoKG5ldyBDaHVuayhiaW5DaHVua3NbY10ubWludiwgYmluQ2h1bmtzW2NdLm1heHYsIGJpbikpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGltaXplQ2h1bmtzKGNodW5rcywgbmV3IFZpcnR1YWxPZmZzZXQoMCwgMCkpXG4gIH1cblxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBsaXN0IG9mIGJpbnMgdGhhdCBtYXkgb3ZlcmxhcCB3aXRoIHJlZ2lvbiBbYmVnLGVuZCkgKHplcm8tYmFzZWQgaGFsZi1vcGVuKVxuICAgKiBAcmV0dXJucyB7QXJyYXlbbnVtYmVyXX1cbiAgICovXG4gIHJlZzJiaW5zKGJlZzogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICAgIGJlZyAtPSAxIC8vIDwgY29udmVydCB0byAxLWJhc2VkIGNsb3NlZFxuICAgIGlmIChiZWcgPCAxKSBiZWcgPSAxXG4gICAgaWYgKGVuZCA+IDIgKiogNTApIGVuZCA9IDIgKiogMzQgLy8gMTcgR2lCIG91Z2h0IHRvIGJlIGVub3VnaCBmb3IgYW55Ym9keVxuICAgIGVuZCAtPSAxXG4gICAgbGV0IGwgPSAwXG4gICAgbGV0IHQgPSAwXG4gICAgbGV0IHMgPSB0aGlzLm1pblNoaWZ0ICsgdGhpcy5kZXB0aCAqIDNcbiAgICBjb25zdCBiaW5zID0gW11cbiAgICBmb3IgKDsgbCA8PSB0aGlzLmRlcHRoOyBzIC09IDMsIHQgKz0gbHNoaWZ0KDEsIGwgKiAzKSwgbCArPSAxKSB7XG4gICAgICBjb25zdCBiID0gdCArIHJzaGlmdChiZWcsIHMpXG4gICAgICBjb25zdCBlID0gdCArIHJzaGlmdChlbmQsIHMpXG4gICAgICBpZiAoZSAtIGIgKyBiaW5zLmxlbmd0aCA+IHRoaXMubWF4QmluTnVtYmVyKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHF1ZXJ5ICR7YmVnfS0ke2VuZH0gaXMgdG9vIGxhcmdlIGZvciBjdXJyZW50IGJpbm5pbmcgc2NoZW1lIChzaGlmdCAke3RoaXMubWluU2hpZnR9LCBkZXB0aCAke3RoaXMuZGVwdGh9KSwgdHJ5IGEgc21hbGxlciBxdWVyeSBvciBhIGNvYXJzZXIgaW5kZXggYmlubmluZyBzY2hlbWVgLFxuICAgICAgICApXG4gICAgICBiaW5zLnB1c2goW2IsIGVdKVxuICAgIH1cbiAgICByZXR1cm4gYmluc1xuICB9XG59XG4iXX0=
350
+ //# sourceMappingURL=csi.js.map