browserfs
Version:
A filesystem in your browser!
291 lines • 40.1 kB
JavaScript
"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=