browserfs
Version:
A filesystem in your browser!
844 lines • 113 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_1 = require('../core/file_system');
var api_error_1 = require('../core/api_error');
var file_flag_1 = require('../core/file_flag');
var preload_file_1 = require('../generic/preload_file');
var locked_fs_1 = require('../generic/locked_fs');
var path = require('path');
var deletionLogPath = '/.deletedFiles.log';
function makeModeWritable(mode) {
return 146 | mode;
}
function getFlag(f) {
return file_flag_1.FileFlag.getFileFlag(f);
}
var OverlayFile = (function (_super) {
__extends(OverlayFile, _super);
function OverlayFile(fs, path, flag, stats, data) {
_super.call(this, fs, path, flag, stats, data);
}
OverlayFile.prototype.sync = function (cb) {
var _this = this;
if (!this.isDirty()) {
cb(null);
return;
}
this._fs._syncAsync(this, function (err) {
_this.resetDirty();
cb(err);
});
};
OverlayFile.prototype.syncSync = function () {
if (this.isDirty()) {
this._fs._syncSync(this);
this.resetDirty();
}
};
OverlayFile.prototype.close = function (cb) {
this.sync(cb);
};
OverlayFile.prototype.closeSync = function () {
this.syncSync();
};
return OverlayFile;
}(preload_file_1.PreloadFile));
var UnlockedOverlayFS = (function (_super) {
__extends(UnlockedOverlayFS, _super);
function UnlockedOverlayFS(writable, readable) {
_super.call(this);
this._isInitialized = false;
this._initializeCallbacks = [];
this._deletedFiles = {};
this._deleteLog = '';
this._deleteLogUpdatePending = false;
this._deleteLogUpdateNeeded = false;
this._deleteLogError = null;
this._writable = writable;
this._readable = readable;
if (this._writable.isReadOnly()) {
throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "Writable file system must be writable.");
}
}
UnlockedOverlayFS.prototype.checkInitialized = function () {
if (!this._isInitialized) {
throw new api_error_1.ApiError(api_error_1.ErrorCode.EPERM, "OverlayFS is not initialized. Please initialize OverlayFS using its initialize() method before using it.");
}
else if (this._deleteLogError !== null) {
var e = this._deleteLogError;
this._deleteLogError = null;
throw e;
}
};
UnlockedOverlayFS.prototype.checkInitAsync = function (cb) {
if (!this._isInitialized) {
cb(new api_error_1.ApiError(api_error_1.ErrorCode.EPERM, "OverlayFS is not initialized. Please initialize OverlayFS using its initialize() method before using it."));
return false;
}
else if (this._deleteLogError !== null) {
var e = this._deleteLogError;
this._deleteLogError = null;
cb(e);
return false;
}
return true;
};
UnlockedOverlayFS.prototype.checkPath = function (p) {
if (p === deletionLogPath) {
throw api_error_1.ApiError.EPERM(p);
}
};
UnlockedOverlayFS.prototype.checkPathAsync = function (p, cb) {
if (p === deletionLogPath) {
cb(api_error_1.ApiError.EPERM(p));
return true;
}
return false;
};
UnlockedOverlayFS.prototype.getOverlayedFileSystems = function () {
return {
readable: this._readable,
writable: this._writable
};
};
UnlockedOverlayFS.prototype.createParentDirectoriesAsync = function (p, cb) {
var parent = path.dirname(p);
var toCreate = [];
var _this = this;
this._writable.stat(parent, false, statDone);
function statDone(err, stat) {
if (err) {
toCreate.push(parent);
parent = path.dirname(parent);
_this._writable.stat(parent, false, statDone);
}
else {
createParents();
}
}
function createParents() {
if (!toCreate.length) {
return cb();
}
var dir = toCreate.pop();
_this._readable.stat(dir, false, function (err, stats) {
if (!stats) {
return cb();
}
_this._writable.mkdir(dir, stats.mode, function (err) {
if (err) {
return cb(err);
}
createParents();
});
});
}
};
UnlockedOverlayFS.prototype.createParentDirectories = function (p) {
var _this = this;
var parent = path.dirname(p), toCreate = [];
while (!this._writable.existsSync(parent)) {
toCreate.push(parent);
parent = path.dirname(parent);
}
toCreate = toCreate.reverse();
toCreate.forEach(function (p) {
_this._writable.mkdirSync(p, _this.statSync(p, false).mode);
});
};
UnlockedOverlayFS.isAvailable = function () {
return true;
};
UnlockedOverlayFS.prototype._syncAsync = function (file, cb) {
var _this = this;
this.createParentDirectoriesAsync(file.getPath(), function (err) {
if (err) {
return cb(err);
}
_this._writable.writeFile(file.getPath(), file.getBuffer(), null, getFlag('w'), file.getStats().mode, cb);
});
};
UnlockedOverlayFS.prototype._syncSync = function (file) {
this.createParentDirectories(file.getPath());
this._writable.writeFileSync(file.getPath(), file.getBuffer(), null, getFlag('w'), file.getStats().mode);
};
UnlockedOverlayFS.prototype.getName = function () {
return "OverlayFS";
};
UnlockedOverlayFS.prototype.initialize = function (cb) {
var _this = this;
var callbackArray = this._initializeCallbacks;
var end = function (e) {
_this._isInitialized = !e;
_this._initializeCallbacks = [];
callbackArray.forEach((function (cb) { return cb(e); }));
};
if (this._isInitialized) {
return cb();
}
callbackArray.push(cb);
if (callbackArray.length !== 1) {
return;
}
this._writable.readFile(deletionLogPath, 'utf8', getFlag('r'), function (err, data) {
if (err) {
if (err.errno !== api_error_1.ErrorCode.ENOENT) {
return end(err);
}
}
else {
_this._deleteLog = data;
}
_this._reparseDeletionLog();
end(null);
});
};
UnlockedOverlayFS.prototype.isReadOnly = function () { return false; };
UnlockedOverlayFS.prototype.supportsSynch = function () { return this._readable.supportsSynch() && this._writable.supportsSynch(); };
UnlockedOverlayFS.prototype.supportsLinks = function () { return false; };
UnlockedOverlayFS.prototype.supportsProps = function () { return this._readable.supportsProps() && this._writable.supportsProps(); };
UnlockedOverlayFS.prototype.deletePath = function (p) {
this._deletedFiles[p] = true;
this.updateLog("d" + p + "\n");
};
UnlockedOverlayFS.prototype.updateLog = function (addition) {
var _this = this;
this._deleteLog += addition;
if (this._deleteLogUpdatePending) {
this._deleteLogUpdateNeeded = true;
}
else {
this._deleteLogUpdatePending = true;
this._writable.writeFile(deletionLogPath, this._deleteLog, 'utf8', file_flag_1.FileFlag.getFileFlag('w'), 420, function (e) {
_this._deleteLogUpdatePending = false;
if (e) {
_this._deleteLogError = e;
}
else if (_this._deleteLogUpdateNeeded) {
_this._deleteLogUpdateNeeded = false;
_this.updateLog('');
}
});
}
};
UnlockedOverlayFS.prototype.getDeletionLog = function () {
return this._deleteLog;
};
UnlockedOverlayFS.prototype._reparseDeletionLog = function () {
var _this = this;
this._deletedFiles = {};
this._deleteLog.split('\n').forEach(function (path) {
_this._deletedFiles[path.slice(1)] = path.slice(0, 1) === 'd';
});
};
UnlockedOverlayFS.prototype.restoreDeletionLog = function (log) {
this._deleteLog = log;
this._reparseDeletionLog();
this.updateLog('');
};
UnlockedOverlayFS.prototype.rename = function (oldPath, newPath, cb) {
var _this = this;
if (!this.checkInitAsync(cb) || this.checkPathAsync(oldPath, cb) || this.checkPathAsync(newPath, cb))
return;
if (oldPath === deletionLogPath || newPath === deletionLogPath) {
return cb(api_error_1.ApiError.EPERM('Cannot rename deletion log.'));
}
if (oldPath === newPath) {
return cb();
}
this.stat(oldPath, false, function (oldErr, oldStats) {
if (oldErr) {
return cb(oldErr);
}
return _this.stat(newPath, false, function (newErr, newStats) {
function copyDirContents(files) {
var file = files.shift();
if (!file) {
return cb();
}
var oldFile = path.resolve(oldPath, file);
var newFile = path.resolve(newPath, file);
this.rename(oldFile, newFile, function (err) {
if (err) {
return cb(err);
}
copyDirContents(files);
});
}
var mode = 511;
if (oldStats.isDirectory()) {
if (newErr) {
if (newErr.errno !== api_error_1.ErrorCode.ENOENT) {
return cb(newErr);
}
return _this._writable.exists(oldPath, function (exists) {
if (exists) {
return _this._writable.rename(oldPath, newPath, cb);
}
_this._writable.mkdir(newPath, mode, function (mkdirErr) {
if (mkdirErr) {
return cb(mkdirErr);
}
_this._readable.readdir(oldPath, function (err, files) {
if (err) {
return cb();
}
copyDirContents(files);
});
});
});
}
mode = newStats.mode;
if (!newStats.isDirectory()) {
return cb(api_error_1.ApiError.ENOTDIR(newPath));
}
_this.readdir(newPath, function (readdirErr, files) {
if (files && files.length) {
return cb(api_error_1.ApiError.ENOTEMPTY(newPath));
}
_this._readable.readdir(oldPath, function (err, files) {
if (err) {
return cb();
}
copyDirContents(files);
});
});
}
if (newStats && newStats.isDirectory()) {
return cb(api_error_1.ApiError.EISDIR(newPath));
}
_this.readFile(oldPath, null, getFlag('r'), function (err, data) {
if (err) {
return cb(err);
}
return _this.writeFile(newPath, data, null, getFlag('w'), oldStats.mode, function (err) {
if (err) {
return cb(err);
}
return _this.unlink(oldPath, cb);
});
});
});
});
};
UnlockedOverlayFS.prototype.renameSync = function (oldPath, newPath) {
var _this = this;
this.checkInitialized();
this.checkPath(oldPath);
this.checkPath(newPath);
if (oldPath === deletionLogPath || newPath === deletionLogPath) {
throw api_error_1.ApiError.EPERM('Cannot rename deletion log.');
}
var oldStats = this.statSync(oldPath, false);
if (oldStats.isDirectory()) {
if (oldPath === newPath) {
return;
}
var mode = 511;
if (this.existsSync(newPath)) {
var stats = this.statSync(newPath, false), mode = stats.mode;
if (stats.isDirectory()) {
if (this.readdirSync(newPath).length > 0) {
throw api_error_1.ApiError.ENOTEMPTY(newPath);
}
}
else {
throw api_error_1.ApiError.ENOTDIR(newPath);
}
}
if (this._writable.existsSync(oldPath)) {
this._writable.renameSync(oldPath, newPath);
}
else if (!this._writable.existsSync(newPath)) {
this._writable.mkdirSync(newPath, mode);
}
if (this._readable.existsSync(oldPath)) {
this._readable.readdirSync(oldPath).forEach(function (name) {
_this.renameSync(path.resolve(oldPath, name), path.resolve(newPath, name));
});
}
}
else {
if (this.existsSync(newPath) && this.statSync(newPath, false).isDirectory()) {
throw api_error_1.ApiError.EISDIR(newPath);
}
this.writeFileSync(newPath, this.readFileSync(oldPath, null, getFlag('r')), null, getFlag('w'), oldStats.mode);
}
if (oldPath !== newPath && this.existsSync(oldPath)) {
this.unlinkSync(oldPath);
}
};
UnlockedOverlayFS.prototype.stat = function (p, isLstat, cb) {
var _this = this;
if (!this.checkInitAsync(cb))
return;
this._writable.stat(p, isLstat, function (err, stat) {
if (err && err.errno === api_error_1.ErrorCode.ENOENT) {
if (_this._deletedFiles[p]) {
cb(api_error_1.ApiError.ENOENT(p));
}
_this._readable.stat(p, isLstat, function (err, stat) {
if (stat) {
stat = stat.clone();
stat.mode = makeModeWritable(stat.mode);
}
cb(err, stat);
});
}
else {
cb(err, stat);
}
});
};
UnlockedOverlayFS.prototype.statSync = function (p, isLstat) {
this.checkInitialized();
try {
return this._writable.statSync(p, isLstat);
}
catch (e) {
if (this._deletedFiles[p]) {
throw api_error_1.ApiError.ENOENT(p);
}
var oldStat = this._readable.statSync(p, isLstat).clone();
oldStat.mode = makeModeWritable(oldStat.mode);
return oldStat;
}
};
UnlockedOverlayFS.prototype.open = function (p, flag, mode, cb) {
var _this = this;
if (!this.checkInitAsync(cb) || this.checkPathAsync(p, cb))
return;
this.stat(p, false, function (err, stats) {
if (stats) {
switch (flag.pathExistsAction()) {
case file_flag_1.ActionType.TRUNCATE_FILE:
return _this.createParentDirectoriesAsync(p, function (err) {
if (err) {
return cb(err);
}
_this._writable.open(p, flag, mode, cb);
});
case file_flag_1.ActionType.NOP:
return _this._writable.exists(p, function (exists) {
if (exists) {
_this._writable.open(p, flag, mode, cb);
}
else {
stats = stats.clone();
stats.mode = mode;
_this._readable.readFile(p, null, getFlag('r'), function (readFileErr, data) {
if (readFileErr) {
return cb(readFileErr);
}
if (stats.size === -1) {
stats.size = data.length;
}
var f = new OverlayFile(_this, p, flag, stats, data);
cb(null, f);
});
}
});
default:
return cb(api_error_1.ApiError.EEXIST(p));
}
}
else {
switch (flag.pathNotExistsAction()) {
case file_flag_1.ActionType.CREATE_FILE:
return _this.createParentDirectoriesAsync(p, function (err) {
if (err) {
return cb(err);
}
return _this._writable.open(p, flag, mode, cb);
});
default:
return cb(api_error_1.ApiError.ENOENT(p));
}
}
});
};
UnlockedOverlayFS.prototype.openSync = function (p, flag, mode) {
this.checkInitialized();
this.checkPath(p);
if (p === deletionLogPath) {
throw api_error_1.ApiError.EPERM('Cannot open deletion log.');
}
if (this.existsSync(p)) {
switch (flag.pathExistsAction()) {
case file_flag_1.ActionType.TRUNCATE_FILE:
this.createParentDirectories(p);
return this._writable.openSync(p, flag, mode);
case file_flag_1.ActionType.NOP:
if (this._writable.existsSync(p)) {
return this._writable.openSync(p, flag, mode);
}
else {
var buf = this._readable.readFileSync(p, null, getFlag('r'));
var stats = this._readable.statSync(p, false).clone();
stats.mode = mode;
return new OverlayFile(this, p, flag, stats, buf);
}
default:
throw api_error_1.ApiError.EEXIST(p);
}
}
else {
switch (flag.pathNotExistsAction()) {
case file_flag_1.ActionType.CREATE_FILE:
this.createParentDirectories(p);
return this._writable.openSync(p, flag, mode);
default:
throw api_error_1.ApiError.ENOENT(p);
}
}
};
UnlockedOverlayFS.prototype.unlink = function (p, cb) {
var _this = this;
if (!this.checkInitAsync(cb) || this.checkPathAsync(p, cb))
return;
this.exists(p, function (exists) {
if (!exists)
return cb(api_error_1.ApiError.ENOENT(p));
_this._writable.exists(p, function (writableExists) {
if (writableExists) {
return _this._writable.unlink(p, function (err) {
if (err) {
return cb(err);
}
_this.exists(p, function (readableExists) {
if (readableExists) {
_this.deletePath(p);
}
cb(null);
});
});
}
else {
_this.deletePath(p);
cb(null);
}
});
});
};
UnlockedOverlayFS.prototype.unlinkSync = function (p) {
this.checkInitialized();
this.checkPath(p);
if (this.existsSync(p)) {
if (this._writable.existsSync(p)) {
this._writable.unlinkSync(p);
}
if (this.existsSync(p)) {
this.deletePath(p);
}
}
else {
throw api_error_1.ApiError.ENOENT(p);
}
};
UnlockedOverlayFS.prototype.rmdir = function (p, cb) {
var _this = this;
if (!this.checkInitAsync(cb))
return;
var rmdirLower = function () {
_this.readdir(p, function (err, files) {
if (err) {
return cb(err);
}
if (files.length) {
return cb(api_error_1.ApiError.ENOTEMPTY(p));
}
_this.deletePath(p);
cb(null);
});
};
this.exists(p, function (exists) {
if (!exists) {
return cb(api_error_1.ApiError.ENOENT(p));
}
_this._writable.exists(p, function (writableExists) {
if (writableExists) {
_this._writable.rmdir(p, function (err) {
if (err) {
return cb(err);
}
_this._readable.exists(p, function (readableExists) {
if (readableExists) {
rmdirLower();
}
else {
cb();
}
});
});
}
else {
rmdirLower();
}
});
});
};
UnlockedOverlayFS.prototype.rmdirSync = function (p) {
this.checkInitialized();
if (this.existsSync(p)) {
if (this._writable.existsSync(p)) {
this._writable.rmdirSync(p);
}
if (this.existsSync(p)) {
if (this.readdirSync(p).length > 0) {
throw api_error_1.ApiError.ENOTEMPTY(p);
}
else {
this.deletePath(p);
}
}
}
else {
throw api_error_1.ApiError.ENOENT(p);
}
};
UnlockedOverlayFS.prototype.mkdir = function (p, mode, cb) {
var _this = this;
if (!this.checkInitAsync(cb))
return;
this.exists(p, function (exists) {
if (exists) {
return cb(api_error_1.ApiError.EEXIST(p));
}
_this.createParentDirectoriesAsync(p, function (err) {
if (err) {
return cb(err);
}
_this._writable.mkdir(p, mode, cb);
});
});
};
UnlockedOverlayFS.prototype.mkdirSync = function (p, mode) {
this.checkInitialized();
if (this.existsSync(p)) {
throw api_error_1.ApiError.EEXIST(p);
}
else {
this.createParentDirectories(p);
this._writable.mkdirSync(p, mode);
}
};
UnlockedOverlayFS.prototype.readdir = function (p, cb) {
var _this = this;
if (!this.checkInitAsync(cb))
return;
this.stat(p, false, function (err, dirStats) {
if (err) {
return cb(err);
}
if (!dirStats.isDirectory()) {
return cb(api_error_1.ApiError.ENOTDIR(p));
}
_this._writable.readdir(p, function (err, wFiles) {
if (err && err.code !== 'ENOENT') {
return cb(err);
}
else if (err || !wFiles) {
wFiles = [];
}
_this._readable.readdir(p, function (err, rFiles) {
if (err || !rFiles) {
rFiles = [];
}
var seenMap = {};
var filtered = wFiles.concat(rFiles.filter(function (fPath) {
return !_this._deletedFiles[(p + "/" + fPath)];
})).filter(function (fPath) {
var result = !seenMap[fPath];
seenMap[fPath] = true;
return result;
});
cb(null, filtered);
});
});
});
};
UnlockedOverlayFS.prototype.readdirSync = function (p) {
var _this = this;
this.checkInitialized();
var dirStats = this.statSync(p, false);
if (!dirStats.isDirectory()) {
throw api_error_1.ApiError.ENOTDIR(p);
}
var contents = [];
try {
contents = contents.concat(this._writable.readdirSync(p));
}
catch (e) {
}
try {
contents = contents.concat(this._readable.readdirSync(p).filter(function (fPath) {
return !_this._deletedFiles[(p + "/" + fPath)];
}));
}
catch (e) {
}
var seenMap = {};
return contents.filter(function (fileP) {
var result = !seenMap[fileP];
seenMap[fileP] = true;
return result;
});
};
UnlockedOverlayFS.prototype.exists = function (p, cb) {
var _this = this;
this.checkInitialized();
this._writable.exists(p, function (existsWritable) {
if (existsWritable) {
return cb(true);
}
_this._readable.exists(p, function (existsReadable) {
cb(existsReadable && _this._deletedFiles[p] !== true);
});
});
};
UnlockedOverlayFS.prototype.existsSync = function (p) {
this.checkInitialized();
return this._writable.existsSync(p) || (this._readable.existsSync(p) && this._deletedFiles[p] !== true);
};
UnlockedOverlayFS.prototype.chmod = function (p, isLchmod, mode, cb) {
var _this = this;
if (!this.checkInitAsync(cb))
return;
this.operateOnWritableAsync(p, function (err) {
if (err) {
return cb(err);
}
else {
_this._writable.chmod(p, isLchmod, mode, cb);
}
});
};
UnlockedOverlayFS.prototype.chmodSync = function (p, isLchmod, mode) {
var _this = this;
this.checkInitialized();
this.operateOnWritable(p, function () {
_this._writable.chmodSync(p, isLchmod, mode);
});
};
UnlockedOverlayFS.prototype.chown = function (p, isLchmod, uid, gid, cb) {
var _this = this;
if (!this.checkInitAsync(cb))
return;
this.operateOnWritableAsync(p, function (err) {
if (err) {
return cb(err);
}
else {
_this._writable.chown(p, isLchmod, uid, gid, cb);
}
});
};
UnlockedOverlayFS.prototype.chownSync = function (p, isLchown, uid, gid) {
var _this = this;
this.checkInitialized();
this.operateOnWritable(p, function () {
_this._writable.chownSync(p, isLchown, uid, gid);
});
};
UnlockedOverlayFS.prototype.utimes = function (p, atime, mtime, cb) {
var _this = this;
if (!this.checkInitAsync(cb))
return;
this.operateOnWritableAsync(p, function (err) {
if (err) {
return cb(err);
}
else {
_this._writable.utimes(p, atime, mtime, cb);
}
});
};
UnlockedOverlayFS.prototype.utimesSync = function (p, atime, mtime) {
var _this = this;
this.checkInitialized();
this.operateOnWritable(p, function () {
_this._writable.utimesSync(p, atime, mtime);
});
};
UnlockedOverlayFS.prototype.operateOnWritable = function (p, f) {
if (this.existsSync(p)) {
if (!this._writable.existsSync(p)) {
this.copyToWritable(p);
}
f();
}
else {
throw api_error_1.ApiError.ENOENT(p);
}
};
UnlockedOverlayFS.prototype.operateOnWritableAsync = function (p, cb) {
var _this = this;
this.exists(p, function (exists) {
if (!exists) {
return cb(api_error_1.ApiError.ENOENT(p));
}
_this._writable.exists(p, function (existsWritable) {
if (existsWritable) {
cb();
}
else {
return _this.copyToWritableAsync(p, cb);
}
});
});
};
UnlockedOverlayFS.prototype.copyToWritable = function (p) {
var pStats = this.statSync(p, false);
if (pStats.isDirectory()) {
this._writable.mkdirSync(p, pStats.mode);
}
else {
this.writeFileSync(p, this._readable.readFileSync(p, null, getFlag('r')), null, getFlag('w'), this.statSync(p, false).mode);
}
};
UnlockedOverlayFS.prototype.copyToWritableAsync = function (p, cb) {
var _this = this;
this.stat(p, false, function (err, pStats) {
if (err) {
return cb(err);
}
if (pStats.isDirectory()) {
return _this._writable.mkdir(p, pStats.mode, cb);
}
_this._readable.readFile(p, null, getFlag('r'), function (err, data) {
if (err) {
return cb(err);
}
_this.writeFile(p, data, null, getFlag('w'), pStats.mode, cb);
});
});
};
return UnlockedOverlayFS;
}(file_system_1.BaseFileSystem));
exports.UnlockedOverlayFS = UnlockedOverlayFS;
var OverlayFS = (function (_super) {
__extends(OverlayFS, _super);
function OverlayFS(writable, readable) {
_super.call(this, new UnlockedOverlayFS(writable, readable));
}
OverlayFS.prototype.initialize = function (cb) {
_super.prototype.initialize.call(this, cb);
};
OverlayFS.isAvailable = function () {
return UnlockedOverlayFS.isAvailable();
};
OverlayFS.prototype.getOverlayedFileSystems = function () {
return _super.prototype.getFSUnlocked.call(this).getOverlayedFileSystems();
};
OverlayFS.prototype.unwrap = function () {
return _super.prototype.getFSUnlocked.call(this);
};
return OverlayFS;
}(locked_fs_1["default"]));
exports.__esModule = true;
exports["default"] = OverlayFS;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3ZlcmxheUZTLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmQvT3ZlcmxheUZTLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRCQUF5QyxxQkFBcUIsQ0FBQyxDQUFBO0FBQy9ELDBCQUFrQyxtQkFBbUIsQ0FBQyxDQUFBO0FBQ3RELDBCQUFtQyxtQkFBbUIsQ0FBQyxDQUFBO0FBSXZELDZCQUEwQix5QkFBeUIsQ0FBQyxDQUFBO0FBQ3BELDBCQUFxQixzQkFBc0IsQ0FBQyxDQUFBO0FBQzVDLElBQU8sSUFBSSxXQUFXLE1BQU0sQ0FBQyxDQUFDO0FBQzlCLElBQU0sZUFBZSxHQUFHLG9CQUFvQixDQUFDO0FBSzdDLDBCQUEwQixJQUFZO0lBQ3BDLE1BQU0sQ0FBQyxHQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxpQkFBaUIsQ0FBUztJQUN4QixNQUFNLENBQUMsb0JBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUtEO0lBQTBCLCtCQUE4QjtJQUN0RCxxQkFBWSxFQUFxQixFQUFFLElBQVksRUFBRSxJQUFjLEVBQUUsS0FBWSxFQUFFLElBQVk7UUFDekYsa0JBQU0sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSwwQkFBSSxHQUFYLFVBQVksRUFBMEI7UUFBdEMsaUJBVUM7UUFUQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEIsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ1QsTUFBTSxDQUFDO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFDLEdBQWE7WUFDdEMsS0FBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLEVBQUUsQ0FB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