UNPKG

browserfs

Version:

A filesystem in your browser!

291 lines 40.1 kB
"use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var file_system = require('../core/file_system'); var InMemory_1 = require('./InMemory'); var api_error_1 = require('../core/api_error'); var fs = require('../core/node_fs'); var path = require('path'); var util_1 = require('../core/util'); var MountableFileSystem = (function (_super) { __extends(MountableFileSystem, _super); function MountableFileSystem() { _super.call(this); this.mountList = []; this.mntMap = {}; this.rootFs = new InMemory_1["default"](); } MountableFileSystem.prototype.mount = function (mountPoint, fs) { if (mountPoint[0] !== '/') { mountPoint = "/" + mountPoint; } mountPoint = path.resolve(mountPoint); if (this.mntMap[mountPoint]) { throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "Mount point " + mountPoint + " is already taken."); } util_1.mkdirpSync(mountPoint, 0x1ff, this.rootFs); this.mntMap[mountPoint] = fs; this.mountList.push(mountPoint); this.mountList = this.mountList.sort(function (a, b) { return b.length - a.length; }); }; MountableFileSystem.prototype.umount = function (mountPoint) { if (mountPoint[0] !== '/') { mountPoint = "/" + mountPoint; } mountPoint = path.resolve(mountPoint); if (!this.mntMap[mountPoint]) { throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "Mount point " + mountPoint + " is already unmounted."); } delete this.mntMap[mountPoint]; this.mountList.splice(this.mountList.indexOf(mountPoint), 1); while (mountPoint !== '/') { if (this.rootFs.readdirSync(mountPoint).length === 0) { this.rootFs.rmdirSync(mountPoint); mountPoint = path.dirname(mountPoint); } else { break; } } }; MountableFileSystem.prototype._getFs = function (path) { var mountList = this.mountList, len = mountList.length; for (var i_1 = 0; i_1 < len; i_1++) { var mountPoint = mountList[i_1]; if (mountPoint.length <= path.length && path.indexOf(mountPoint) === 0) { path = path.substr(mountPoint.length > 1 ? mountPoint.length : 0); if (path === '') { path = '/'; } return { fs: this.mntMap[mountPoint], path: path }; } } return { fs: this.rootFs, path: path }; }; MountableFileSystem.prototype.getName = function () { return 'MountableFileSystem'; }; MountableFileSystem.isAvailable = function () { return true; }; MountableFileSystem.prototype.diskSpace = function (path, cb) { cb(0, 0); }; MountableFileSystem.prototype.isReadOnly = function () { return false; }; MountableFileSystem.prototype.supportsLinks = function () { return false; }; MountableFileSystem.prototype.supportsProps = function () { return false; }; MountableFileSystem.prototype.supportsSynch = function () { return true; }; MountableFileSystem.prototype.standardizeError = function (err, path, realPath) { var index; if (-1 !== (index = err.message.indexOf(path))) { err.message = err.message.substr(0, index) + realPath + err.message.substr(index + path.length); err.path = realPath; } return err; }; MountableFileSystem.prototype.rename = function (oldPath, newPath, cb) { var fs1_rv = this._getFs(oldPath); var fs2_rv = this._getFs(newPath); if (fs1_rv.fs === fs2_rv.fs) { var _this = this; return fs1_rv.fs.rename(fs1_rv.path, fs2_rv.path, function (e) { if (e) _this.standardizeError(_this.standardizeError(e, fs1_rv.path, oldPath), fs2_rv.path, newPath); cb(e); }); } return fs.readFile(oldPath, function (err, data) { if (err) { return cb(err); } fs.writeFile(newPath, data, function (err) { if (err) { return cb(err); } fs.unlink(oldPath, cb); }); }); }; MountableFileSystem.prototype.renameSync = function (oldPath, newPath) { var fs1_rv = this._getFs(oldPath); var fs2_rv = this._getFs(newPath); if (fs1_rv.fs === fs2_rv.fs) { try { return fs1_rv.fs.renameSync(fs1_rv.path, fs2_rv.path); } catch (e) { this.standardizeError(this.standardizeError(e, fs1_rv.path, oldPath), fs2_rv.path, newPath); throw e; } } var data = fs.readFileSync(oldPath); fs.writeFileSync(newPath, data); return fs.unlinkSync(oldPath); }; MountableFileSystem.prototype.readdirSync = function (p) { var fsInfo = this._getFs(p); var rv = null; if (fsInfo.fs !== this.rootFs) { try { rv = this.rootFs.readdirSync(p); } catch (e) { } } try { var rv2_1 = fsInfo.fs.readdirSync(fsInfo.path); if (rv === null) { return rv2_1; } else { return rv2_1.concat(rv.filter(function (val) { return rv2_1.indexOf(val) === -1; })); } } catch (e) { if (rv === null) { throw this.standardizeError(e, fsInfo.path, p); } else { return rv; } } }; MountableFileSystem.prototype.readdir = function (p, cb) { var _this = this; var fsInfo = this._getFs(p); fsInfo.fs.readdir(fsInfo.path, function (err, files) { if (fsInfo.fs !== _this.rootFs) { try { var rv = _this.rootFs.readdirSync(p); if (files) { files = files.concat(rv.filter(function (val) { return files.indexOf(val) === -1; })); } else { files = rv; } } catch (e) { if (err) { return cb(_this.standardizeError(err, fsInfo.path, p)); } } } else if (err) { return cb(_this.standardizeError(err, fsInfo.path, p)); } cb(null, files); }); }; MountableFileSystem.prototype.rmdirSync = function (p) { var fsInfo = this._getFs(p); if (this._containsMountPt(p)) { throw api_error_1.ApiError.ENOTEMPTY(p); } else { try { fsInfo.fs.rmdirSync(fsInfo.path); } catch (e) { throw this.standardizeError(e, fsInfo.path, p); } } }; MountableFileSystem.prototype._containsMountPt = function (p) { var mountPoints = this.mountList, len = mountPoints.length; for (var i_2 = 0; i_2 < len; i_2++) { var pt = mountPoints[i_2]; if (pt.length >= p.length && pt.slice(0, p.length) === p) { return true; } } return false; }; MountableFileSystem.prototype.rmdir = function (p, cb) { var _this = this; var fsInfo = this._getFs(p); if (this._containsMountPt(p)) { cb(api_error_1.ApiError.ENOTEMPTY(p)); } else { fsInfo.fs.rmdir(fsInfo.path, function (err) { cb(err ? _this.standardizeError(err, fsInfo.path, p) : null); }); } }; return MountableFileSystem; }(file_system.BaseFileSystem)); exports.__esModule = true; exports["default"] = MountableFileSystem; function defineFcn(name, isSync, numArgs) { if (isSync) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i - 0] = arguments[_i]; } var self = this; var path = args[0]; var rv = self._getFs(path); args[0] = rv.path; try { return rv.fs[name].apply(rv.fs, args); } catch (e) { self.standardizeError(e, rv.path, path); throw e; } }; } else { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i - 0] = arguments[_i]; } var self = this; var path = args[0]; var rv = self._getFs(path); args[0] = rv.path; if (typeof args[args.length - 1] === 'function') { var cb = args[args.length - 1]; args[args.length - 1] = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i - 0] = arguments[_i]; } if (args.length > 0 && args[0] instanceof api_error_1.ApiError) { self.standardizeError(args[0], rv.path, path); } cb.apply(null, args); }; } return rv.fs[name].apply(rv.fs, args); }; } } var fsCmdMap = [ ['exists', 'unlink', 'readlink'], ['stat', 'mkdir', 'realpath', 'truncate'], ['open', 'readFile', 'chmod', 'utimes'], ['chown'], ['writeFile', 'appendFile']]; for (var i = 0; i < fsCmdMap.length; i++) { var cmds = fsCmdMap[i]; for (var j = 0; j < cmds.length; j++) { var fnName = cmds[j]; MountableFileSystem.prototype[fnName] = defineFcn(fnName, false, i + 1); MountableFileSystem.prototype[fnName + 'Sync'] = defineFcn(fnName + 'Sync', true, i + 1); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW91bnRhYmxlRmlsZVN5c3RlbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kL01vdW50YWJsZUZpbGVTeXN0ZW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBTyxXQUFXLFdBQVcscUJBQXFCLENBQUMsQ0FBQztBQUNwRCx5QkFBK0IsWUFBWSxDQUFDLENBQUE7QUFDNUMsMEJBQWtDLG1CQUFtQixDQUFDLENBQUE7QUFDdEQsSUFBTyxFQUFFLFdBQVcsaUJBQWlCLENBQUMsQ0FBQztBQUN2QyxJQUFPLElBQUksV0FBVyxNQUFNLENBQUMsQ0FBQztBQUM5QixxQkFBeUIsY0FBYyxDQUFDLENBQUE7QUFXeEM7SUFBaUQsdUNBQTBCO0lBT3pFO1FBQ0UsaUJBQU8sQ0FBQztRQUhGLGNBQVMsR0FBYSxFQUFFLENBQUM7UUFJL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFHakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLHFCQUFrQixFQUFFLENBQUM7SUFDekMsQ0FBQztJQUtNLG1DQUFLLEdBQVosVUFBYSxVQUFrQixFQUFFLEVBQTBCO1FBQ3pELEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFCLFVBQVUsR0FBRyxNQUFJLFVBQVksQ0FBQztRQUNoQyxDQUFDO1FBQ0QsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsTUFBTSxJQUFJLG9CQUFRLENBQUMscUJBQVMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxHQUFHLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzNGLENBQUM7UUFDRCxpQkFBVSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUs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QUMsQ0FBQztRQUNkLG1CQUFtQixDQUFDLFNBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDekUsbUJBQW1CLENBQUMsU0FBVSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25HLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZpbGVfc3lzdGVtID0gcmVxdWlyZSgnLi4vY29yZS9maWxlX3N5c3RlbScpO1xuaW1wb3J0IEluTWVtb3J5RmlsZVN5c3RlbSBmcm9tICcuL0luTWVtb3J5JztcbmltcG9ydCB7QXBpRXJyb3IsIEVycm9yQ29kZX0gZnJvbSAnLi4vY29yZS9hcGlfZXJyb3InO1xuaW1wb3J0IGZzID0gcmVxdWlyZSgnLi4vY29yZS9ub2RlX2ZzJyk7XG5pbXBvcnQgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmltcG9ydCB7bWtkaXJwU3luY30gZnJvbSAnLi4vY29yZS91dGlsJztcblxuLyoqXG4gKiBUaGUgTW91bnRhYmxlRmlsZVN5c3RlbSBhbGxvd3MgeW91IHRvIG1vdW50IG11bHRpcGxlIGJhY2tlbmQgdHlwZXMgb3JcbiAqIG11bHRpcGxlIGluc3RhbnRpYXRpb25zIG9mIHRoZSBzYW1lIGJhY2tlbmQgaW50byBhIHNpbmdsZSBmaWxlIHN5c3RlbSB0cmVlLlxuICogVGhlIGZpbGUgc3lzdGVtcyBkbyBub3QgbmVlZCB0byBrbm93IGFib3V0IGVhY2ggb3RoZXI7IGFsbCBpbnRlcmFjdGlvbnMgYXJlXG4gKiBhdXRvbWF0aWNhbGx5IGZhY2lsaXRhdGVkIHRocm91Z2ggdGhpcyBpbnRlcmZhY2UuXG4gKlxuICogRm9yIGV4YW1wbGUsIGlmIGEgZmlsZSBzeXN0ZW0gaXMgbW91bnRlZCBhdCAvbW50L2JsYWgsIGFuZCBhIHJlcXVlc3QgY2FtZSBpblxuICogZm9yIC9tbnQvYmxhaC9mb28udHh0LCB0aGUgZmlsZSBzeXN0ZW0gd291bGQgc2VlIGEgcmVxdWVzdCBmb3IgL2Zvby50eHQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vdW50YWJsZUZpbGVTeXN0ZW0gZXh0ZW5kcyBmaWxlX3N5c3RlbS5CYXNlRmlsZVN5c3RlbSBpbXBsZW1lbnRzIGZpbGVfc3lzdGVtLkZpbGVTeXN0ZW0ge1xuICBwcml2YXRlIG1udE1hcDoge1twYXRoOiBzdHJpbmddOiBmaWxlX3N5c3RlbS5GaWxlU3lzdGVtfTtcbiAgLy8gQ29udGFpbnMgdGhlIGxpc3Qgb2YgbW91bnQgcG9pbnRzIGluIG1udE1hcCwgc29ydGVkIGJ5IHN0cmluZyBsZW5ndGggaW4gZGVjcmVhc2luZyBvcmRlci5cbiAgLy8gRW5zdXJlcyB0aGF0IHdlIHNjYW4gdGhlIG1vc3Qgc3BlY2lmaWMgbW91bnQgcG9pbnRzIGZvciBhIG1hdGNoIGZpcnN0LCB3aGljaCBsZXRzIHVzXG4gIC8vIG5lc3QgbW91bnQgcG9pbnRzLlxuICBwcml2YXRlIG1vdW50TGlzdDogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSByb290RnM6IGZpbGVfc3lzdGVtLkZpbGVTeXN0ZW07XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5tbnRNYXAgPSB7fTtcbiAgICAvLyBUaGUgSW5NZW1vcnkgZmlsZSBzeXN0ZW0gc2VydmVzIHB1cmVseSB0byBwcm92aWRlIGRpcmVjdG9yeSBsaXN0aW5ncyBmb3JcbiAgICAvLyBtb3VudGVkIGZpbGUgc3lzdGVtcy5cbiAgICB0aGlzLnJvb3RGcyA9IG5ldyBJbk1lbW9yeUZpbGVTeXN0ZW0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudHMgdGhlIGZpbGUgc3lzdGVtIGF0IHRoZSBnaXZlbiBtb3VudCBwb2ludC5cbiAgICovXG4gIHB1YmxpYyBtb3VudChtb3VudFBvaW50OiBzdHJpbmcsIGZzOiBmaWxlX3N5c3RlbS5GaWxlU3lzdGVtKTogdm9pZCB7XG4gICAgaWYgKG1vdW50UG9pbnRbMF0gIT09ICcvJykge1xuICAgICAgbW91bnRQb2ludCA9IGAvJHttb3VudFBvaW50fWA7XG4gICAgfVxuICAgIG1vdW50UG9pbnQgPSBwYXRoLnJlc29sdmUobW91bnRQb2ludCk7XG4gICAgaWYgKHRoaXMubW50TWFwW21vdW50UG9pbnRdKSB7XG4gICAgICB0aHJvdyBuZXcgQXBpRXJyb3IoRXJyb3JDb2RlLkVJTlZBTCwgXCJNb3VudCBwb2ludCBcIiArIG1vdW50UG9pbnQgKyBcIiBpcyBhbHJlYWR5IHRha2VuLlwiKTtcbiAgICB9XG4gICAgbWtkaXJwU3luYyhtb3VudFBvaW50LCAweDFmZiwgdGhpcy5yb290RnMpO1xuICAgIHRoaXMubW50TWFwW21vdW50UG9pbnRdID0gZnM7XG4gICAgdGhpcy5tb3VudExpc3QucHVzaChtb3VudFBvaW50KTtcbiAgICB0aGlzLm1vdW50TGlzdCA9IHRoaXMubW91bnRMaXN0LnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpO1xuICB9XG5cbiAgcHVibGljIHVtb3VudChtb3VudFBvaW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobW91bnRQb2ludFswXSAhPT0gJy8nKSB7XG4gICAgICBtb3VudFBvaW50ID0gYC8ke21vdW50UG9pbnR9YDtcbiAgICB9XG4gICAgbW91bnRQb2ludCA9IHBhdGgucmVzb2x2ZShtb3VudFBvaW50KTtcbiAgICBpZiAoIXRoaXMubW50TWFwW21vdW50UG9pbnRdKSB7XG4gICAgICB0aHJvdyBuZXcgQXBpRXJyb3IoRXJyb3JDb2RlLkVJTlZBTCwgXCJNb3VudCBwb2ludCBcIiArIG1vdW50UG9pbnQgKyBcIiBpcyBhbHJlYWR5IHVubW91bnRlZC5cIik7XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLm1udE1hcFttb3VudFBvaW50XTtcbiAgICB0aGlzLm1vdW50TGlzdC5zcGxpY2UodGhpcy5tb3VudExpc3QuaW5kZXhPZihtb3VudFBvaW50KSwgMSk7XG5cbiAgICB3aGlsZSAobW91bnRQb2ludCAhPT0gJy8nKSB7XG4gICAgICBpZiAodGhpcy5yb290RnMucmVhZGRpclN5bmMobW91bnRQb2ludCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMucm9vdEZzLnJtZGlyU3luYyhtb3VudFBvaW50KTtcbiAgICAgICAgbW91bnRQb2ludCA9IHBhdGguZGlybmFtZShtb3VudFBvaW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmaWxlIHN5c3RlbSB0aGF0IHRoZSBwYXRoIHBvaW50cyB0by5cbiAgICovXG4gIHB1YmxpYyBfZ2V0RnMocGF0aDogc3RyaW5nKToge2ZzOiBmaWxlX3N5c3RlbS5GaWxlU3lzdGVtOyBwYXRoOiBzdHJpbmd9IHtcbiAgICBsZXQgbW91bnRMaXN0ID0gdGhpcy5tb3VudExpc3QsIGxlbiA9IG1vdW50TGlzdC5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgbGV0IG1vdW50UG9pbnQgPSBtb3VudExpc3RbaV07XG4gICAgICAvLyBXZSBrbm93IHBhdGggaXMgbm9ybWFsaXplZCwgc28gaXQgaXMgYSBzdWJzdHJpbmcgb2YgdGhlIG1vdW50IHBvaW50LlxuICAgICAgaWYgKG1vdW50UG9pbnQubGVuZ3RoIDw9IHBhdGgubGVuZ3RoICYmIHBhdGguaW5kZXhPZihtb3VudFBvaW50KSA9PT0gMCkge1xuICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHIobW91bnRQb2ludC5sZW5ndGggPiAxID8gbW91bnRQb2ludC5sZW5ndGggOiAwKTtcbiAgICAgICAgaWYgKHBhdGggPT09ICcnKSB7XG4gICAgICAgICAgcGF0aCA9ICcvJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge2ZzOiB0aGlzLm1udE1hcFttb3VudFBvaW50XSwgcGF0aDogcGF0aH07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFF1ZXJ5IG91ciByb290IGZpbGUgc3lzdGVtLlxuICAgIHJldHVybiB7ZnM6IHRoaXMucm9vdEZzLCBwYXRoOiBwYXRofTtcbiAgfVxuXG4gIC8vIEdsb2JhbCBpbmZvcm1hdGlvbiBtZXRob2RzXG5cbiAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ01vdW50YWJsZUZpbGVTeXN0ZW0nO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0F2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNrU3BhY2UocGF0aDogc3RyaW5nLCBjYjogKHRvdGFsOiBudW1iZXIsIGZyZWU6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNiKDAsIDApO1xuICB9XG5cbiAgcHVibGljIGlzUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHN1cHBvcnRzTGlua3MoKTogYm9vbGVhbiB7XG4gICAgLy8gSSdtIG5vdCByZWFkeSBmb3IgY3Jvc3MtRlMgbGlua3MgeWV0LlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBzdXBwb3J0c1Byb3BzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBzdXBwb3J0c1N5bmNoKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpeGVzIHVwIGVycm9yIG1lc3NhZ2VzIHNvIHRoZXkgbWVudGlvbiB0aGUgbW91bnRlZCBmaWxlIGxvY2F0aW9uIHJlbGF0aXZlXG4gICAqIHRvIHRoZSBNRlMgcm9vdCwgbm90IHRvIHRoZSBwYXJ0aWN1bGFyIEZTJ3Mgcm9vdC5cbiAgICogTXV0YXRlcyB0aGUgaW5wdXQgZXJyb3IsIGFuZCByZXR1cm5zIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFuZGFyZGl6ZUVycm9yKGVycjogQXBpRXJyb3IsIHBhdGg6IHN0cmluZywgcmVhbFBhdGg6IHN0cmluZyk6IEFwaUVycm9yIHtcbiAgICB2YXIgaW5kZXg6IG51bWJlcjtcbiAgICBpZiAoLTEgIT09IChpbmRleCA9IGVyci5tZXNzYWdlLmluZGV4T2YocGF0aCkpKSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGVyci5tZXNzYWdlLnN1YnN0cigwLCBpbmRleCkgKyByZWFsUGF0aCArIGVyci5tZXNzYWdlLnN1YnN0cihpbmRleCArIHBhdGgubGVuZ3RoKTtcbiAgICAgIGVyci5wYXRoID0gcmVhbFBhdGg7XG4gICAgfVxuICAgIHJldHVybiBlcnI7XG4gIH1cblxuICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgaW52b2x2ZSBtdWx0aXBsZSBmaWxlIHN5c3RlbXMsIGFuZCB0aHVzIGhhdmUgY3VzdG9tXG4gIC8vIGxvZ2ljLlxuICAvLyBOb3RlIHRoYXQgd2UgZ28gdGhyb3VnaCB0aGUgTm9kZSBBUEkgdG8gdXNlIGl0cyByb2J1c3QgZGVmYXVsdCBhcmd1bWVudFxuICAvLyBwcm9jZXNzaW5nLlxuXG4gIHB1YmxpYyByZW5hbWUob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcsIGNiOiAoZT86IEFwaUVycm9yKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgLy8gU2NlbmFyaW8gMTogb2xkIGFuZCBuZXcgYXJlIG9uIHNhbWUgRlMuXG4gICAgdmFyIGZzMV9ydiA9IHRoaXMuX2dldEZzKG9sZFBhdGgpO1xuICAgIHZhciBmczJfcnYgPSB0aGlzLl9nZXRGcyhuZXdQYXRoKTtcbiAgICBpZiAoZnMxX3J2LmZzID09PSBmczJfcnYuZnMpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICByZXR1cm4gZnMxX3J2LmZzLnJlbmFtZShmczFfcnYucGF0aCwgZnMyX3J2LnBhdGgsIGZ1bmN0aW9uKGU/OiBBcGlFcnJvcikge1xuICAgICAgICBpZiAoZSkgX3RoaXMuc3RhbmRhcmRpemVFcnJvcihfdGhpcy5zdGFuZGFyZGl6ZUVycm9yKGUsIGZzMV9ydi5wYXRoLCBvbGRQYXRoKSwgZnMyX3J2LnBhdGgsIG5ld1BhdGgpO1xuICAgICAgICBjYihlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFNjZW5hcmlvIDI6IERpZmZlcmVudCBmaWxlIHN5c3RlbXMuXG4gICAgLy8gUmVhZCBvbGQgZmlsZSwgd3JpdGUgbmV3IGZpbGUsIGRlbGV0ZSBvbGQgZmlsZS5cbiAgICByZXR1cm4gZnMucmVhZEZpbGUob2xkUGF0aCwgZnVuY3Rpb24oZXJyOiBBcGlFcnJvciwgZGF0YT86IGFueSkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgIH1cbiAgICAgIGZzLndyaXRlRmlsZShuZXdQYXRoLCBkYXRhLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGZzLnVubGluayhvbGRQYXRoLCBjYik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWVTeW5jKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gU2NlbmFyaW8gMTogb2xkIGFuZCBuZXcgYXJlIG9uIHNhbWUgRlMuXG4gICAgdmFyIGZzMV9ydiA9IHRoaXMuX2dldEZzKG9sZFBhdGgpO1xuICAgIHZhciBmczJfcnYgPSB0aGlzLl9nZXRGcyhuZXdQYXRoKTtcbiAgICBpZiAoZnMxX3J2LmZzID09PSBmczJfcnYuZnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmczFfcnYuZnMucmVuYW1lU3luYyhmczFfcnYucGF0aCwgZnMyX3J2LnBhdGgpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHRoaXMuc3RhbmRhcmRpemVFcnJvcih0aGlzLnN0YW5kYXJkaXplRXJyb3IoZSwgZnMxX3J2LnBhdGgsIG9sZFBhdGgpLCBmczJfcnYucGF0aCwgbmV3UGF0aCk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNjZW5hcmlvIDI6IERpZmZlcmVudCBmaWxlIHN5c3RlbXMuXG4gICAgdmFyIGRhdGEgPSBmcy5yZWFkRmlsZVN5bmMob2xkUGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhuZXdQYXRoLCBkYXRhKTtcbiAgICByZXR1cm4gZnMudW5saW5rU3luYyhvbGRQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkZGlyU3luYyhwOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgbGV0IGZzSW5mbyA9IHRoaXMuX2dldEZzKHApO1xuXG4gICAgLy8gSWYgbnVsbCwgcm9vdGZzIGRpZCBub3QgaGF2ZSB0aGUgZGlyZWN0b3J5XG4gICAgLy8gKG9yIHRoZSB0YXJnZXQgRlMgaXMgdGhlIHJvb3QgZnMpLlxuICAgIGxldCBydiA9IG51bGw7XG4gICAgLy8gTW91bnQgcG9pbnRzIGFyZSBhbGwgZGVmaW5lZCBpbiB0aGUgcm9vdCBGUy5cbiAgICAvLyBFbnN1cmUgdGhhdCB3ZSBsaXN0IHRob3NlLCB0b28uXG4gICAgaWYgKGZzSW5mby5mcyAhPT0gdGhpcy5yb290RnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJ2ID0gdGhpcy5yb290RnMucmVhZGRpclN5bmMocCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElnbm9yZS5cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbGV0IHJ2MiA9IGZzSW5mby5mcy5yZWFkZGlyU3luYyhmc0luZm8ucGF0aCk7XG4gICAgICBpZiAocnYgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJ2MjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZpbHRlciBvdXQgZHVwbGljYXRlcy5cbiAgICAgICAgcmV0dXJuIHJ2Mi5jb25jYXQocnYuZmlsdGVyKCh2YWwpID0+IHJ2Mi5pbmRleE9mKHZhbCkgPT09IC0xKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBpZiAocnYgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5zdGFuZGFyZGl6ZUVycm9yKGUsIGZzSW5mby5wYXRoLCBwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSByb290IEZTIGhhZCBzb21ldGhpbmcuXG4gICAgICAgIHJldHVybiBydjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVhZGRpcihwOiBzdHJpbmcsIGNiOiAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24sIGxpc3Rpbmc/OiBzdHJpbmdbXSkgPT4gYW55KTogdm9pZCB7XG4gICAgbGV0IGZzSW5mbyA9IHRoaXMuX2dldEZzKHApO1xuICAgIGZzSW5mby5mcy5yZWFkZGlyKGZzSW5mby5wYXRoLCAoZXJyLCBmaWxlcykgPT4ge1xuICAgICAgaWYgKGZzSW5mby5mcyAhPT0gdGhpcy5yb290RnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsZXQgcnYgPSB0aGlzLnJvb3RGcy5yZWFkZGlyU3luYyhwKTtcbiAgICAgICAgICBpZiAoZmlsZXMpIHtcbiAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgZHVwbGljYXRlcy5cbiAgICAgICAgICAgIGZpbGVzID0gZmlsZXMuY29uY2F0KHJ2LmZpbHRlcigodmFsKSA9PiBmaWxlcy5pbmRleE9mKHZhbCkgPT09IC0xKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbGVzID0gcnY7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gUm9vdCBGUyBhbmQgdGFyZ2V0IEZTIGRpZCBub3QgaGF2ZSBkaXJlY3RvcnkuXG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGNiKHRoaXMuc3RhbmRhcmRpemVFcnJvcihlcnIsIGZzSW5mby5wYXRoLCBwKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgICAvLyBSb290IEZTIGFuZCB0YXJnZXQgRlMgYXJlIHRoZSBzYW1lLCBhbmQgZGlkIG5vdCBoYXZlIGRpcmVjdG9yeS5cbiAgICAgICAgcmV0dXJuIGNiKHRoaXMuc3RhbmRhcmRpemVFcnJvcihlcnIsIGZzSW5mby5wYXRoLCBwKSk7XG4gICAgICB9XG5cbiAgICAgIGNiKG51bGwsIGZpbGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBybWRpclN5bmMocDogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IGZzSW5mbyA9IHRoaXMuX2dldEZzKHApO1xuICAgIGlmICh0aGlzLl9jb250YWluc01vdW50UHQocCkpIHtcbiAgICAgIHRocm93IEFwaUVycm9yLkVOT1RFTVBUWShwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZnNJbmZvLmZzLnJtZGlyU3luYyhmc0luZm8ucGF0aCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IHRoaXMuc3RhbmRhcmRpemVFcnJvcihlLCBmc0luZm8ucGF0aCwgcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gcGF0aCBjb250YWlucyBhIG1vdW50IHBvaW50LlxuICAgKi9cbiAgcHJpdmF0ZSBfY29udGFpbnNNb3VudFB0KHA6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCBtb3VudFBvaW50cyA9IHRoaXMubW91bnRMaXN0LCBsZW4gPSBtb3VudFBvaW50cy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgbGV0IHB0ID0gbW91bnRQb2ludHNbaV07XG4gICAgICBpZiAocHQubGVuZ3RoID49IHAubGVuZ3RoICYmIHB0LnNsaWNlKDAsIHAubGVuZ3RoKSA9PT0gcCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHJtZGlyKHA6IHN0cmluZywgY2I6IChlcnI/OiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IGFueSk6IHZvaWQge1xuICAgIGxldCBmc0luZm8gPSB0aGlzLl9nZXRGcyhwKTtcbiAgICBpZiAodGhpcy5fY29udGFpbnNNb3VudFB0KHApKSB7XG4gICAgICBjYihBcGlFcnJvci5FTk9URU1QVFkocCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmc0luZm8uZnMucm1kaXIoZnNJbmZvLnBhdGgsIChlcnI/KSA9PiB7XG4gICAgICAgIGNiKGVyciA/IHRoaXMuc3RhbmRhcmRpemVFcnJvcihlcnIsIGZzSW5mby5wYXRoLCBwKSA6IG51bGwpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVHJpY2t5OiBEZWZpbmUgYWxsIG9mIHRoZSBmdW5jdGlvbnMgdGhhdCBtZXJlbHkgZm9yd2FyZCBhcmd1bWVudHMgdG8gdGhlXG4gKiByZWxldmFudCBmaWxlIHN5c3RlbSwgb3IgcmV0dXJuL3Rocm93IGFuIGVycm9yLlxuICogVGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGUgKmZpcnN0KiBhcmd1bWVudCBpcyBhbHdheXMgdGhlIHBhdGgsIGFuZFxuICogdGhlICpsYXN0KiBpcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKGlmIGFzeW5jKS5cbiAqIEB0b2RvIENhbiB1c2UgbnVtQXJncyB0byBtYWtlIHByb3h5aW5nIG1vcmUgZWZmaWNpZW50LlxuICovXG5mdW5jdGlvbiBkZWZpbmVGY24obmFtZTogc3RyaW5nLCBpc1N5bmM6IGJvb2xlYW4sIG51bUFyZ3M6IG51bWJlcik6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55IHtcbiAgaWYgKGlzU3luYykge1xuICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgbGV0IHNlbGY6IE1vdW50YWJsZUZpbGVTeXN0ZW0gPSB0aGlzO1xuICAgICAgdmFyIHBhdGggPSBhcmdzWzBdO1xuICAgICAgdmFyIHJ2ID0gc2VsZi5fZ2V0RnMocGF0aCk7XG4gICAgICBhcmdzWzBdID0gcnYucGF0aDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBydi5mc1tuYW1lXS5hcHBseShydi5mcywgYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICg8YW55PiBzZWxmKS5zdGFuZGFyZGl6ZUVycm9yKGUsIHJ2LnBhdGgsIHBhdGgpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBsZXQgc2VsZjogTW91bnRhYmxlRmlsZVN5c3RlbSA9IHRoaXM7XG4gICAgICB2YXIgcGF0aCA9IGFyZ3NbMF07XG4gICAgICB2YXIgcnYgPSBzZWxmLl9nZXRGcyhwYXRoKTtcbiAgICAgIGFyZ3NbMF0gPSBydi5wYXRoO1xuICAgICAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoLTFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBjYiA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAgICAgYXJnc1thcmdzLmxlbmd0aCAtIDFdID0gZnVuY3Rpb24oLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwICYmIGFyZ3NbMF0gaW5zdGFuY2VvZiBBcGlFcnJvcikge1xuICAgICAgICAgICAgKDxhbnk+IHNlbGYpLnN0YW5kYXJkaXplRXJyb3IoYXJnc1swXSwgcnYucGF0aCwgcGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNiLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcnYuZnNbbmFtZV0uYXBwbHkocnYuZnMsIGFyZ3MpO1xuICAgIH07XG4gIH1cbn1cblxudmFyIGZzQ21kTWFwID0gW1xuICAgLy8gMSBhcmcgZnVuY3Rpb25zXG4gICBbJ2V4aXN0cycsICd1bmxpbmsnLCAncmVhZGxpbmsnXSxcbiAgIC8vIDIgYXJnIGZ1bmN0aW9uc1xuICAgWydzdGF0JywgJ21rZGlyJywgJ3JlYWxwYXRoJywgJ3RydW5jYXRlJ10sXG4gICAvLyAzIGFyZyBmdW5jdGlvbnNcbiAgIFsnb3BlbicsICdyZWFkRmlsZScsICdjaG1vZCcsICd1dGltZXMnXSxcbiAgIC8vIDQgYXJnIGZ1bmN0aW9uc1xuICAgWydjaG93biddLFxuICAgLy8gNSBhcmcgZnVuY3Rpb25zXG4gICBbJ3dyaXRlRmlsZScsICdhcHBlbmRGaWxlJ11dO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IGZzQ21kTWFwLmxlbmd0aDsgaSsrKSB7XG4gIHZhciBjbWRzID0gZnNDbWRNYXBbaV07XG4gIGZvciAodmFyIGogPSAwOyBqIDwgY21kcy5sZW5ndGg7IGorKykge1xuICAgIHZhciBmbk5hbWUgPSBjbWRzW2pdO1xuICAgICg8YW55PiBNb3VudGFibGVGaWxlU3lzdGVtLnByb3RvdHlwZSlbZm5OYW1lXSA9IGRlZmluZUZjbihmbk5hbWUsIGZhbHNlLCBpICsgMSk7XG4gICAgKDxhbnk+IE1vdW50YWJsZUZpbGVTeXN0ZW0ucHJvdG90eXBlKVtmbk5hbWUgKyAnU3luYyddID0gZGVmaW5lRmNuKGZuTmFtZSArICdTeW5jJywgdHJ1ZSwgaSArIDEpO1xuICB9XG59XG4iXX0=