browserfs
Version:
A filesystem in your browser!
224 lines • 34.7 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 = require('../core/file');
var api_error_1 = require('../core/api_error');
var fs = require('../core/node_fs');
var PreloadFile = (function (_super) {
__extends(PreloadFile, _super);
function PreloadFile(_fs, _path, _flag, _stat, contents) {
_super.call(this);
this._pos = 0;
this._dirty = false;
this._fs = _fs;
this._path = _path;
this._flag = _flag;
this._stat = _stat;
if (contents != null) {
this._buffer = contents;
}
else {
this._buffer = new Buffer(0);
}
if (this._stat.size !== this._buffer.length && this._flag.isReadable()) {
throw new Error("Invalid buffer: Buffer is " + this._buffer.length + " long, yet Stats object specifies that file is " + this._stat.size + " long.");
}
}
PreloadFile.prototype.isDirty = function () {
return this._dirty;
};
PreloadFile.prototype.resetDirty = function () {
this._dirty = false;
};
PreloadFile.prototype.getBuffer = function () {
return this._buffer;
};
PreloadFile.prototype.getStats = function () {
return this._stat;
};
PreloadFile.prototype.getFlag = function () {
return this._flag;
};
PreloadFile.prototype.getPath = function () {
return this._path;
};
PreloadFile.prototype.getPos = function () {
if (this._flag.isAppendable()) {
return this._stat.size;
}
return this._pos;
};
PreloadFile.prototype.advancePos = function (delta) {
return this._pos += delta;
};
PreloadFile.prototype.setPos = function (newPos) {
return this._pos = newPos;
};
PreloadFile.prototype.sync = function (cb) {
try {
this.syncSync();
cb();
}
catch (e) {
cb(e);
}
};
PreloadFile.prototype.syncSync = function () {
throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP);
};
PreloadFile.prototype.close = function (cb) {
try {
this.closeSync();
cb();
}
catch (e) {
cb(e);
}
};
PreloadFile.prototype.closeSync = function () {
throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP);
};
PreloadFile.prototype.stat = function (cb) {
try {
cb(null, this._stat.clone());
}
catch (e) {
cb(e);
}
};
PreloadFile.prototype.statSync = function () {
return this._stat.clone();
};
PreloadFile.prototype.truncate = function (len, cb) {
try {
this.truncateSync(len);
if (this._flag.isSynchronous() && !fs.getRootFS().supportsSynch()) {
this.sync(cb);
}
cb();
}
catch (e) {
return cb(e);
}
};
PreloadFile.prototype.truncateSync = function (len) {
this._dirty = true;
if (!this._flag.isWriteable()) {
throw new api_error_1.ApiError(api_error_1.ErrorCode.EPERM, 'File not opened with a writeable mode.');
}
this._stat.mtime = new Date();
if (len > this._buffer.length) {
var buf = new Buffer(len - this._buffer.length);
buf.fill(0);
this.writeSync(buf, 0, buf.length, this._buffer.length);
if (this._flag.isSynchronous() && fs.getRootFS().supportsSynch()) {
this.syncSync();
}
return;
}
this._stat.size = len;
var newBuff = new Buffer(len);
this._buffer.copy(newBuff, 0, 0, len);
this._buffer = newBuff;
if (this._flag.isSynchronous() && fs.getRootFS().supportsSynch()) {
this.syncSync();
}
};
PreloadFile.prototype.write = function (buffer, offset, length, position, cb) {
try {
cb(null, this.writeSync(buffer, offset, length, position), buffer);
}
catch (e) {
cb(e);
}
};
PreloadFile.prototype.writeSync = function (buffer, offset, length, position) {
this._dirty = true;
if (position == null) {
position = this.getPos();
}
if (!this._flag.isWriteable()) {
throw new api_error_1.ApiError(api_error_1.ErrorCode.EPERM, 'File not opened with a writeable mode.');
}
var endFp = position + length;
if (endFp > this._stat.size) {
this._stat.size = endFp;
if (endFp > this._buffer.length) {
var newBuff = new Buffer(endFp);
this._buffer.copy(newBuff);
this._buffer = newBuff;
}
}
var len = buffer.copy(this._buffer, position, offset, offset + length);
this._stat.mtime = new Date();
if (this._flag.isSynchronous()) {
this.syncSync();
return len;
}
this.setPos(position + len);
return len;
};
PreloadFile.prototype.read = function (buffer, offset, length, position, cb) {
try {
cb(null, this.readSync(buffer, offset, length, position), buffer);
}
catch (e) {
cb(e);
}
};
PreloadFile.prototype.readSync = function (buffer, offset, length, position) {
if (!this._flag.isReadable()) {
throw new api_error_1.ApiError(api_error_1.ErrorCode.EPERM, 'File not opened with a readable mode.');
}
if (position == null) {
position = this.getPos();
}
var endRead = position + length;
if (endRead > this._stat.size) {
length = this._stat.size - position;
}
var rv = this._buffer.copy(buffer, offset, position, position + length);
this._stat.atime = new Date();
this._pos = position + length;
return rv;
};
PreloadFile.prototype.chmod = function (mode, cb) {
try {
this.chmodSync(mode);
cb();
}
catch (e) {
cb(e);
}
};
PreloadFile.prototype.chmodSync = function (mode) {
if (!this._fs.supportsProps()) {
throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP);
}
this._dirty = true;
this._stat.chmod(mode);
this.syncSync();
};
return PreloadFile;
}(file.BaseFile));
exports.PreloadFile = PreloadFile;
var NoSyncFile = (function (_super) {
__extends(NoSyncFile, _super);
function NoSyncFile(_fs, _path, _flag, _stat, contents) {
_super.call(this, _fs, _path, _flag, _stat, contents);
}
NoSyncFile.prototype.sync = function (cb) {
cb();
};
NoSyncFile.prototype.syncSync = function () { };
NoSyncFile.prototype.close = function (cb) {
cb();
};
NoSyncFile.prototype.closeSync = function () { };
return NoSyncFile;
}(PreloadFile));
exports.NoSyncFile = NoSyncFile;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlbG9hZF9maWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2dlbmVyaWMvcHJlbG9hZF9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQU8sSUFBSSxXQUFXLGNBQWMsQ0FBQyxDQUFDO0FBSXRDLDBCQUFrQyxtQkFBbUIsQ0FBQyxDQUFBO0FBQ3RELElBQU8sRUFBRSxXQUFXLGlCQUFpQixDQUFDLENBQUM7QUFXdkM7SUFBbUUsK0JBQWE7SUFzQjlFLHFCQUFZLEdBQU0sRUFBRSxLQUFhLEVBQUUsS0FBZSxFQUFFLEtBQVksRUFBRSxRQUFxQjtRQUNyRixpQkFBTyxDQUFDO1FBdEJGLFNBQUksR0FBVyxDQUFDLENBQUM7UUFNakIsV0FBTSxHQUFZLEtBQUssQ0FBQztRQWlCOUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztRQUMxQixDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFFTixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFLRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2RSxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxH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S00seUJBQUksR0FBWCxVQUFZLEVBQTBCO1FBQ3BDLEVBQUUsRUFBRSxDQUFDO0lBQ1AsQ0FBQztJQUlNLDZCQUFRLEdBQWYsY0FBeUIsQ0FBQztJQUtuQiwwQkFBSyxHQUFaLFVBQWEsRUFBMEI7UUFDckMsRUFBRSxFQUFFLENBQUM7SUFDUCxDQUFDO0lBSU0sOEJBQVMsR0FBaEIsY0FBMEIsQ0FBQztJQUM3QixpQkFBQztBQUFELENBQUMsQUExQkQsQ0FBa0UsV0FBVyxHQTBCNUU7QUExQlksa0JBQVUsYUEwQnRCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZmlsZSA9IHJlcXVpcmUoJy4uL2NvcmUvZmlsZScpO1xuaW1wb3J0IGZpbGVfc3lzdGVtID0gcmVxdWlyZSgnLi4vY29yZS9maWxlX3N5c3RlbScpO1xuaW1wb3J0IFN0YXRzIGZyb20gJy4uL2NvcmUvbm9kZV9mc19zdGF0cyc7XG5pbXBvcnQge0ZpbGVGbGFnfSBmcm9tICcuLi9jb3JlL2ZpbGVfZmxhZyc7XG5pbXBvcnQge0FwaUVycm9yLCBFcnJvckNvZGV9IGZyb20gJy4uL2NvcmUvYXBpX2Vycm9yJztcbmltcG9ydCBmcyA9IHJlcXVpcmUoJy4uL2NvcmUvbm9kZV9mcycpO1xuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBGaWxlIGludGVyZmFjZSB0aGF0IG9wZXJhdGVzIG9uIGEgZmlsZSB0aGF0IGlzXG4gKiBjb21wbGV0ZWx5IGluLW1lbW9yeS4gUHJlbG9hZEZpbGVzIGFyZSBiYWNrZWQgYnkgYSBCdWZmZXIuXG4gKlxuICogVGhpcyBpcyBhbHNvIGFuIGFic3RyYWN0IGNsYXNzLCBhcyBpdCBsYWNrcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiAnc3luYycgYW5kXG4gKiAnY2xvc2UnLiBFYWNoIGZpbGVzeXN0ZW0gdGhhdCB3aXNoZXMgdG8gdXNlIHRoaXMgZmlsZSByZXByZXNlbnRhdGlvbiBtdXN0XG4gKiBleHRlbmQgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50IHRob3NlIHR3byBtZXRob2RzLlxuICogQHRvZG8gJ2Nsb3NlJyBsZXZlciB0aGF0IGRpc2FibGVzIGZ1bmN0aW9uYWxpdHkgb25jZSBjbG9zZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmVsb2FkRmlsZTxUIGV4dGVuZHMgZmlsZV9zeXN0ZW0uRmlsZVN5c3RlbT4gZXh0ZW5kcyBmaWxlLkJhc2VGaWxlIHtcbiAgcHJpdmF0ZSBfcG9zOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9wYXRoOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfZnM6IFQ7XG4gIHByaXZhdGUgX3N0YXQ6IFN0YXRzO1xuICBwcml2YXRlIF9mbGFnOiBGaWxlRmxhZztcbiAgcHJpdmF0ZSBfYnVmZmVyOiBOb2RlQnVmZmVyO1xuICBwcml2YXRlIF9kaXJ0eTogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gcGF0aCBhbmQsIG9wdGlvbmFsbHksIHRoZSBnaXZlbiBjb250ZW50cy4gTm90ZVxuICAgKiB0aGF0LCBpZiBjb250ZW50cyBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgbXV0YXRlZCBieSB0aGUgZmlsZSFcbiAgICogQHBhcmFtIFtCcm93c2VyRlMuRmlsZVN5c3RlbV0gX2ZzIFRoZSBmaWxlIHN5c3RlbSB0aGF0IGNyZWF0ZWQgdGhlIGZpbGUuXG4gICAqIEBwYXJhbSBbU3RyaW5nXSBfcGF0aFxuICAgKiBAcGFyYW0gW0Jyb3dzZXJGUy5GaWxlTW9kZV0gX21vZGUgVGhlIG1vZGUgdGhhdCB0aGUgZmlsZSB3YXMgb3BlbmVkIHVzaW5nLlxuICAgKiAgIERpY3RhdGVzIHBlcm1pc3Npb25zIGFuZCB3aGVyZSB0aGUgZmlsZSBwb2ludGVyIHN0YXJ0cy5cbiAgICogQHBhcmFtIFtCcm93c2VyRlMubm9kZS5mcy5TdGF0c10gX3N0YXQgVGhlIHN0YXRzIG9iamVjdCBmb3IgdGhlIGdpdmVuIGZpbGUuXG4gICAqICAgUHJlbG9hZEZpbGUgd2lsbCBtdXRhdGUgdGhpcyBvYmplY3QuIE5vdGUgdGhhdCB0aGlzIG9iamVjdCBtdXN0IGNvbnRhaW5cbiAgICogICB0aGUgYXBwcm9wcmlhdGUgbW9kZSB0aGF0IHRoZSBmaWxlIHdhcyBvcGVuZWQgYXMuXG4gICAqIEBwYXJhbSBbQnJvd3NlckZTLm5vZGUuQnVmZmVyP10gY29udGVudHMgQSBidWZmZXIgY29udGFpbmluZyB0aGUgZW50aXJlXG4gICAqICAgY29udGVudHMgb2YgdGhlIGZpbGUuIFByZWxvYWRGaWxlIHdpbGwgbXV0YXRlIHRoaXMgYnVmZmVyLiBJZiBub3RcbiAgICogICBzcGVjaWZpZWQsIHdlIGFzc3VtZSBpdCBpcyBhIG5ldyBmaWxlLlxuICAgKi9cbiAgY29uc3RydWN0b3IoX2ZzOiBULCBfcGF0aDogc3RyaW5nLCBfZmxhZzogRmlsZUZsYWcsIF9zdGF0OiBTdGF0cywgY29udGVudHM/OiBOb2RlQnVmZmVyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9mcyA9IF9mcztcbiAgICB0aGlzLl9wYXRoID0gX3BhdGg7XG4gICAgdGhpcy5fZmxhZyA9IF9mbGFnO1xuICAgIHRoaXMuX3N0YXQgPSBfc3RhdDtcbiAgICBpZiAoY29udGVudHMgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fYnVmZmVyID0gY29udGVudHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEVtcHR5IGJ1ZmZlci4gSXQnbGwgZXhwYW5kIG9uY2Ugd2Ugd3JpdGUgc3R1ZmYgdG8gaXQuXG4gICAgICB0aGlzLl9idWZmZXIgPSBuZXcgQnVmZmVyKDApO1xuICAgIH1cbiAgICAvLyBOb3RlOiBUaGlzIGludmFyaWFudCBpcyAqbm90KiBtYWludGFpbmVkIG9uY2UgdGhlIGZpbGUgc3RhcnRzIGdldHRpbmdcbiAgICAvLyBtb2RpZmllZC5cbiAgICAvLyBOb3RlOiBPbmx5IGFjdHVhbGx5IG1hdHRlcnMgaWYgZmlsZSBpcyByZWFkYWJsZSwgYXMgd3JpdGVhYmxlIG1vZGVzIG1heVxuICAgIC8vIHRydW5jYXRlL2FwcGVuZCB0byBmaWxlLlxuICAgIGlmICh0aGlzLl9zdGF0LnNpemUgIT09IHRoaXMuX2J1ZmZlci5sZW5ndGggJiYgdGhpcy5fZmxhZy5pc1JlYWRhYmxlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYnVmZmVyOiBCdWZmZXIgaXMgXCIgKyB0aGlzLl9idWZmZXIubGVuZ3RoICsgXCIgbG9uZywgeWV0IFN0YXRzIG9iamVjdCBzcGVjaWZpZXMgdGhhdCBmaWxlIGlzIFwiICsgdGhpcy5fc3RhdC5zaXplICsgXCIgbG9uZy5cIik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGlzRGlydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2RpcnR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgZGlydHkgYml0LiBTaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgYSBzeW5jIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc2V0RGlydHkoKSB7XG4gICAgdGhpcy5fZGlydHkgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOT05TVEFOREFSRDogR2V0IHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBmb3IgdGhpcyBmaWxlLiAhIURPIE5PVCBNVVRBVEUhISBXaWxsIG1lc3MgdXAgZGlydHkgdHJhY2tpbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0QnVmZmVyKCk6IE5vZGVCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLl9idWZmZXI7XG4gIH1cblxuICAvKipcbiAgICogTk9OU1RBTkRBUkQ6IEdldCB1bmRlcmx5aW5nIHN0YXRzIGZvciB0aGlzIGZpbGUuICEhRE8gTk9UIE1VVEFURSEhXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhdHMoKTogU3RhdHMge1xuICAgIHJldHVybiB0aGlzLl9zdGF0O1xuICB9XG5cbiAgcHVibGljIGdldEZsYWcoKTogRmlsZUZsYWcge1xuICAgIHJldHVybiB0aGlzLl9mbGFnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGF0aCB0byB0aGlzIGZpbGUuXG4gICAqIEByZXR1cm4gW1N0cmluZ10gVGhlIHBhdGggdG8gdGhlIGZpbGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0UGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uLlxuICAgKlxuICAgKiBXZSBlbXVsYXRlIHRoZSBmb2xsb3dpbmcgYnVnIG1lbnRpb25lZCBpbiB0aGUgTm9kZSBkb2N1bWVudGF0aW9uOlxuICAgKiA+IE9uIExpbnV4LCBwb3NpdGlvbmFsIHdyaXRlcyBkb24ndCB3b3JrIHdoZW4gdGhlIGZpbGUgaXMgb3BlbmVkIGluIGFwcGVuZFxuICAgKiAgIG1vZGUuIFRoZSBrZXJuZWwgaWdub3JlcyB0aGUgcG9zaXRpb24gYXJndW1lbnQgYW5kIGFsd2F5cyBhcHBlbmRzIHRoZSBkYXRhXG4gICAqICAgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS5cbiAgICogQHJldHVybiBbTnVtYmVyXSBUaGUgY3VycmVudCBmaWxlIHBvc2l0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldFBvcygpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLl9mbGFnLmlzQXBwZW5kYWJsZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhdC5zaXplO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcG9zO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkdmFuY2UgdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiBieSB0aGUgaW5kaWNhdGVkIG51bWJlciBvZiBwb3NpdGlvbnMuXG4gICAqIEBwYXJhbSBbTnVtYmVyXSBkZWx0YVxuICAgKi9cbiAgcHVibGljIGFkdmFuY2VQb3MoZGVsdGE6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3BvcyArPSBkZWx0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZpbGUgcG9zaXRpb24uXG4gICAqIEBwYXJhbSBbTnVtYmVyXSBuZXdQb3NcbiAgICovXG4gIHB1YmxpYyBzZXRQb3MobmV3UG9zOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9wb3MgPSBuZXdQb3M7XG4gIH1cblxuICAvKipcbiAgICogKipDb3JlKio6IEFzeW5jaHJvbm91cyBzeW5jLiBNdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgb2YgdGhpc1xuICAgKiBjbGFzcy5cbiAgICogQHBhcmFtIFtGdW5jdGlvbihCcm93c2VyRlMuQXBpRXJyb3IpXSBjYlxuICAgKi9cbiAgcHVibGljIHN5bmMoY2I6IChlPzogQXBpRXJyb3IpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zeW5jU3luYygpO1xuICAgICAgY2IoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjYihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogKipDb3JlKio6IFN5bmNocm9ub3VzIHN5bmMuXG4gICAqL1xuICBwdWJsaWMgc3luY1N5bmMoKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEFwaUVycm9yKEVycm9yQ29kZS5FTk9UU1VQKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAqKkNvcmUqKjogQXN5bmNocm9ub3VzIGNsb3NlLiBNdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgb2YgdGhpc1xuICAgKiBjbGFzcy5cbiAgICogQHBhcmFtIFtGdW5jdGlvbihCcm93c2VyRlMuQXBpRXJyb3IpXSBjYlxuICAgKi9cbiAgcHVibGljIGNsb3NlKGNiOiAoZT86IEFwaUVycm9yKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2xvc2VTeW5jKCk7XG4gICAgICBjYigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNiKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiAqKkNvcmUqKjogU3luY2hyb25vdXMgY2xvc2UuXG4gICAqL1xuICBwdWJsaWMgY2xvc2VTeW5jKCk6IHZvaWQge1xuICAgIHRocm93IG5ldyBBcGlFcnJvcihFcnJvckNvZGUuRU5PVFNVUCk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzIGBzdGF0YC5cbiAgICogQHBhcmFtIFtGdW5jdGlvbihCcm93c2VyRlMuQXBpRXJyb3IsIEJyb3dzZXJGUy5ub2RlLmZzLlN0YXRzKV0gY2JcbiAgICovXG4gIHB1YmxpYyBzdGF0KGNiOiAoZTogQXBpRXJyb3IsIHN0YXQ/OiBTdGF0cykgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjYihudWxsLCB0aGlzLl9zdGF0LmNsb25lKCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNiKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyBgc3RhdGAuXG4gICAqL1xuICBwdWJsaWMgc3RhdFN5bmMoKTogU3RhdHMge1xuICAgIHJldHVybiB0aGlzLl9zdGF0LmNsb25lKCk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzIHRydW5jYXRlLlxuICAgKiBAcGFyYW0gW051bWJlcl0gbGVuXG4gICAqIEBwYXJhbSBbRnVuY3Rpb24oQnJvd3NlckZTLkFwaUVycm9yKV0gY2JcbiAgICovXG4gIHB1YmxpYyB0cnVuY2F0ZShsZW46IG51bWJlciwgY2I6IChlPzogQXBpRXJyb3IpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy50cnVuY2F0ZVN5bmMobGVuKTtcbiAgICAgIGlmICh0aGlzLl9mbGFnLmlzU3luY2hyb25vdXMoKSAmJiAhZnMuZ2V0Um9vdEZTKCkuc3VwcG9ydHNTeW5jaCgpKSB7XG4gICAgICAgIHRoaXMuc3luYyhjYik7XG4gICAgICB9XG4gICAgICBjYigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBjYihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXMgdHJ1bmNhdGUuXG4gICAqIEBwYXJhbSBbTnVtYmVyXSBsZW5cbiAgICovXG4gIHB1YmxpYyB0cnVuY2F0ZVN5bmMobGVuOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgaWYgKCF0aGlzLl9mbGFnLmlzV3JpdGVhYmxlKCkpIHtcbiAgICAgIHRocm93IG5ldyBBcGlFcnJvcihFcnJvckNvZGUuRVBFUk0sICdGaWxlIG5vdCBvcGVuZWQgd2l0aCBhIHdyaXRlYWJsZSBtb2RlLicpO1xuICAgIH1cbiAgICB0aGlzLl9zdGF0Lm10aW1lID0gbmV3IERhdGUoKTtcbiAgICBpZiAobGVuID4gdGhpcy5fYnVmZmVyLmxlbmd0aCkge1xuICAgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIobGVuIC0gdGhpcy5fYnVmZmVyLmxlbmd0aCk7XG4gICAgICBidWYuZmlsbCgwKTtcbiAgICAgIC8vIFdyaXRlIHdpbGwgc2V0IEBfc3RhdC5zaXplIGZvciB1cy5cbiAgICAgIHRoaXMud3JpdGVTeW5jKGJ1ZiwgMCwgYnVmLmxlbmd0aCwgdGhpcy5fYnVmZmVyLmxlbmd0aCk7XG4gICAgICBpZiAodGhpcy5fZmxhZy5pc1N5bmNocm9ub3VzKCkgJiYgZnMuZ2V0Um9vdEZTKCkuc3VwcG9ydHNTeW5jaCgpKSB7XG4gICAgICAgIHRoaXMuc3luY1N5bmMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc3RhdC5zaXplID0gbGVuO1xuICAgIC8vIFRydW5jYXRlIGJ1ZmZlciB0byAnbGVuJy5cbiAgICB2YXIgbmV3QnVmZiA9IG5ldyBCdWZmZXIobGVuKTtcbiAgICB0aGlzLl9idWZmZXIuY29weShuZXdCdWZmLCAwLCAwLCBsZW4pO1xuICAgIHRoaXMuX2J1ZmZlciA9IG5ld0J1ZmY7XG4gICAgaWYgKHRoaXMuX2ZsYWcuaXNTeW5jaHJvbm91cygpICYmIGZzLmdldFJvb3RGUygpLnN1cHBvcnRzU3luY2goKSkge1xuICAgICAgdGhpcy5zeW5jU3luYygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBidWZmZXIgdG8gdGhlIGZpbGUuXG4gICAqIE5vdGUgdGhhdCBpdCBpcyB1bnNhZmUgdG8gdXNlIGZzLndyaXRlIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGZpbGVcbiAgICogd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgY2FsbGJhY2suXG4gICAqIEBwYXJhbSBbQnJvd3NlckZTLm5vZGUuQnVmZmVyXSBidWZmZXIgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gd3JpdGUgdG9cbiAgICogIHRoZSBmaWxlLlxuICAgKiBAcGFyYW0gW051bWJlcl0gb2Zmc2V0IE9mZnNldCBpbiB0aGUgYnVmZmVyIHRvIHN0YXJ0IHJlYWRpbmcgZGF0YSBmcm9tLlxuICAgKiBAcGFyYW0gW051bWJlcl0gbGVuZ3RoIFRoZSBhbW91bnQgb2YgYnl0ZXMgdG8gd3JpdGUgdG8gdGhlIGZpbGUuXG4gICAqIEBwYXJhbSBbTnVtYmVyXSBwb3NpdGlvbiBPZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIHdoZXJlIHRoaXNcbiAgICogICBkYXRhIHNob3VsZCBiZSB3cml0dGVuLiBJZiBwb3NpdGlvbiBpcyBudWxsLCB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gYXRcbiAgICogICB0aGUgY3VycmVudCBwb3NpdGlvbi5cbiAgICogQHBhcmFtIFtGdW5jdGlvbihCcm93c2VyRlMuQXBpRXJyb3IsIE51bWJlciwgQnJvd3NlckZTLm5vZGUuQnVmZmVyKV1cbiAgICogICBjYiBUaGUgbnVtYmVyIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW50byB0aGUgZmlsZS5cbiAgICovXG4gIHB1YmxpYyB3cml0ZShidWZmZXI6IE5vZGVCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBsZW5ndGg6IG51bWJlciwgcG9zaXRpb246IG51bWJlciwgY2I6IChlOiBBcGlFcnJvciwgbGVuPzogbnVtYmVyLCBidWZmPzogTm9kZUJ1ZmZlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjYihudWxsLCB0aGlzLndyaXRlU3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiksIGJ1ZmZlcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY2IoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGJ1ZmZlciB0byB0aGUgZmlsZS5cbiAgICogTm90ZSB0aGF0IGl0IGlzIHVuc2FmZSB0byB1c2UgZnMud3JpdGVTeW5jIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGZpbGVcbiAgICogd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgY2FsbGJhY2suXG4gICAqIEBwYXJhbSBbQnJvd3NlckZTLm5vZGUuQnVmZmVyXSBidWZmZXIgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gd3JpdGUgdG9cbiAgICogIHRoZSBmaWxlLlxuICAgKiBAcGFyYW0gW051bWJlcl0gb2Zmc2V0IE9mZnNldCBpbiB0aGUgYnVmZmVyIHRvIHN0YXJ0IHJlYWRpbmcgZGF0YSBmcm9tLlxuICAgKiBAcGFyYW0gW051bWJlcl0gbGVuZ3RoIFRoZSBhbW91bnQgb2YgYnl0ZXMgdG8gd3JpdGUgdG8gdGhlIGZpbGUuXG4gICAqIEBwYXJhbSBbTnVtYmVyXSBwb3NpdGlvbiBPZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIHdoZXJlIHRoaXNcbiAgICogICBkYXRhIHNob3VsZCBiZSB3cml0dGVuLiBJZiBwb3NpdGlvbiBpcyBudWxsLCB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gYXRcbiAgICogICB0aGUgY3VycmVudCBwb3NpdGlvbi5cbiAgICogQHJldHVybiBbTnVtYmVyXVxuICAgKi9cbiAgcHVibGljIHdyaXRlU3luYyhidWZmZXI6IE5vZGVCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBsZW5ndGg6IG51bWJlciwgcG9zaXRpb246IG51bWJlcik6IG51bWJlciB7XG4gICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgIGlmIChwb3NpdGlvbiA9PSBudWxsKSB7XG4gICAgICBwb3NpdGlvbiA9IHRoaXMuZ2V0UG9zKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fZmxhZy5pc1dyaXRlYWJsZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgQXBpRXJyb3IoRXJyb3JDb2RlLkVQRVJNLCAnRmlsZSBub3Qgb3BlbmVkIHdpdGggYSB3cml0ZWFibGUgbW9kZS4nKTtcbiAgICB9XG4gICAgdmFyIGVuZEZwID0gcG9zaXRpb24gKyBsZW5ndGg7XG4gICAgaWYgKGVuZEZwID4gdGhpcy5fc3RhdC5zaXplKSB7XG4gICAgICB0aGlzLl9zdGF0LnNpemUgPSBlbmRGcDtcbiAgICAgIGlmIChlbmRGcCA+IHRoaXMuX2J1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgLy8gRXh0ZW5kIHRoZSBidWZmZXIhXG4gICAgICAgIHZhciBuZXdCdWZmID0gbmV3IEJ1ZmZlcihlbmRGcCk7XG4gICAgICAgIHRoaXMuX2J1ZmZlci5jb3B5KG5ld0J1ZmYpO1xuICAgICAgICB0aGlzLl9idWZmZXIgPSBuZXdCdWZmO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgbGVuID0gYnVmZmVyLmNvcHkodGhpcy5fYnVmZmVyLCBwb3NpdGlvbiwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpO1xuICAgIHRoaXMuX3N0YXQubXRpbWUgPSBuZXcgRGF0ZSgpO1xuICAgIGlmICh0aGlzLl9mbGFnLmlzU3luY2hyb25vdXMoKSkge1xuICAgICAgdGhpcy5zeW5jU3luYygpO1xuICAgICAgcmV0dXJuIGxlbjtcbiAgICB9XG4gICAgdGhpcy5zZXRQb3MocG9zaXRpb24gKyBsZW4pO1xuICAgIHJldHVybiBsZW47XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBkYXRhIGZyb20gdGhlIGZpbGUuXG4gICAqIEBwYXJhbSBbQnJvd3NlckZTLm5vZGUuQnVmZmVyXSBidWZmZXIgVGhlIGJ1ZmZlciB0aGF0IHRoZSBkYXRhIHdpbGwgYmVcbiAgICogICB3cml0dGVuIHRvLlxuICAgKiBAcGFyYW0gW051bWJlcl0gb2Zmc2V0IFRoZSBvZmZzZXQgd2l0aGluIHRoZSBidWZmZXIgd2hlcmUgd3JpdGluZyB3aWxsXG4gICAqICAgc3RhcnQuXG4gICAqIEBwYXJhbSBbTnVtYmVyXSBsZW5ndGggQW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAgICogQHBhcmFtIFtOdW1iZXJdIHBvc2l0aW9uIEFuIGludGVnZXIgc3BlY2lmeWluZyB3aGVyZSB0byBiZWdpbiByZWFkaW5nIGZyb21cbiAgICogICBpbiB0aGUgZmlsZS4gSWYgcG9zaXRpb24gaXMgbnVsbCwgZGF0YSB3aWxsIGJlIHJlYWQgZnJvbSB0aGUgY3VycmVudCBmaWxlXG4gICAqICAgcG9zaXRpb24uXG4gICAqIEBwYXJhbSBbRnVuY3Rpb24oQnJvd3NlckZTLkFwaUVycm9yLCBOdW1iZXIsIEJyb3dzZXJGUy5ub2RlLkJ1ZmZlcildIGNiIFRoZVxuICAgKiAgIG51bWJlciBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWRcbiAgICovXG4gIHB1YmxpYyByZWFkKGJ1ZmZlcjogTm9kZUJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBwb3NpdGlvbjogbnVtYmVyLCBjYjogKGU6IEFwaUVycm9yLCBsZW4/OiBudW1iZXIsIGJ1ZmY/OiBOb2RlQnVmZmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNiKG51bGwsIHRoaXMucmVhZFN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pLCBidWZmZXIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNiKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGRhdGEgZnJvbSB0aGUgZmlsZS5cbiAgICogQHBhcmFtIFtCcm93c2VyRlMubm9kZS5CdWZmZXJdIGJ1ZmZlciBUaGUgYnVmZmVyIHRoYXQgdGhlIGRhdGEgd2lsbCBiZVxuICAgKiAgIHdyaXR0ZW4gdG8uXG4gICAqIEBwYXJhbSBbTnVtYmVyXSBvZmZzZXQgVGhlIG9mZnNldCB3aXRoaW4gdGhlIGJ1ZmZlciB3aGVyZSB3cml0aW5nIHdpbGxcbiAgICogICBzdGFydC5cbiAgICogQHBhcmFtIFtOdW1iZXJdIGxlbmd0aCBBbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICAgKiBAcGFyYW0gW051bWJlcl0gcG9zaXRpb24gQW4gaW50ZWdlciBzcGVjaWZ5aW5nIHdoZXJlIHRvIGJlZ2luIHJlYWRpbmcgZnJvbVxuICAgKiAgIGluIHRoZSBmaWxlLiBJZiBwb3NpdGlvbiBpcyBudWxsLCBkYXRhIHdpbGwgYmUgcmVhZCBmcm9tIHRoZSBjdXJyZW50IGZpbGVcbiAgICogICBwb3NpdGlvbi5cbiAgICogQHJldHVybiBbTnVtYmVyXVxuICAgKi9cbiAgcHVibGljIHJlYWRTeW5jKGJ1ZmZlcjogTm9kZUJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBwb3NpdGlvbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuX2ZsYWcuaXNSZWFkYWJsZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgQXBpRXJyb3IoRXJyb3JDb2RlLkVQRVJNLCAnRmlsZSBub3Qgb3BlbmVkIHdpdGggYSByZWFkYWJsZSBtb2RlLicpO1xuICAgIH1cbiAgICBpZiAocG9zaXRpb24gPT0gbnVsbCkge1xuICAgICAgcG9zaXRpb24gPSB0aGlzLmdldFBvcygpO1xuICAgIH1cbiAgICB2YXIgZW5kUmVhZCA9IHBvc2l0aW9uICsgbGVuZ3RoO1xuICAgIGlmIChlbmRSZWFkID4gdGhpcy5fc3RhdC5zaXplKSB7XG4gICAgICBsZW5ndGggPSB0aGlzLl9zdGF0LnNpemUgLSBwb3NpdGlvbjtcbiAgICB9XG4gICAgdmFyIHJ2ID0gdGhpcy5fYnVmZmVyLmNvcHkoYnVmZmVyLCBvZmZzZXQsIHBvc2l0aW9uLCBwb3NpdGlvbiArIGxlbmd0aCk7XG4gICAgdGhpcy5fc3RhdC5hdGltZSA9IG5ldyBEYXRlKCk7XG4gICAgdGhpcy5fcG9zID0gcG9zaXRpb24gKyBsZW5ndGg7XG4gICAgcmV0dXJuIHJ2O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91cyBgZmNobW9kYC5cbiAgICogQHBhcmFtIFtOdW1iZXJ8U3RyaW5nXSBtb2RlXG4gICAqIEBwYXJhbSBbRnVuY3Rpb24oQnJvd3NlckZTLkFwaUVycm9yKV0gY2JcbiAgICovXG4gIHB1YmxpYyBjaG1vZChtb2RlOiBudW1iZXIsIGNiOiAoZT86IEFwaUVycm9yKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2htb2RTeW5jKG1vZGUpO1xuICAgICAgY2IoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjYihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzIGBmY2htb2RgLlxuICAgKiBAcGFyYW0gW051bWJlcl0gbW9kZVxuICAgKi9cbiAgcHVibGljIGNobW9kU3luYyhtb2RlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2ZzLnN1cHBvcnRzUHJvcHMoKSkge1xuICAgICAgdGhyb3cgbmV3IEFwaUVycm9yKEVycm9yQ29kZS5FTk9UU1VQKTtcbiAgICB9XG4gICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgIHRoaXMuX3N0YXQuY2htb2QobW9kZSk7XG4gICAgdGhpcy5zeW5jU3luYygpO1xuICB9XG59XG5cbi8qKlxuICogRmlsZSBjbGFzcyBmb3IgdGhlIEluTWVtb3J5IGFuZCBYSFIgZmlsZSBzeXN0ZW1zLlxuICogRG9lc24ndCBzeW5jIHRvIGFueXRoaW5nLCBzbyBpdCB3b3JrcyBuaWNlbHkgZm9yIG1lbW9yeS1vbmx5IGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgTm9TeW5jRmlsZTxUIGV4dGVuZHMgZmlsZV9zeXN0ZW0uRmlsZVN5c3RlbT4gZXh0ZW5kcyBQcmVsb2FkRmlsZTxUPiBpbXBsZW1lbnRzIGZpbGUuRmlsZSB7XG4gIGNvbnN0cnVjdG9yKF9mczogVCwgX3BhdGg6IHN0cmluZywgX2ZsYWc6IEZpbGVGbGFnLCBfc3RhdDogU3RhdHMsIGNvbnRlbnRzPzogTm9kZUJ1ZmZlcikge1xuICAgIHN1cGVyKF9mcywgX3BhdGgsIF9mbGFnLCBfc3RhdCwgY29udGVudHMpO1xuICB9XG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXMgc3luYy4gRG9lc24ndCBkbyBhbnl0aGluZywgc2ltcGx5IGNhbGxzIHRoZSBjYi5cbiAgICogQHBhcmFtIFtGdW5jdGlvbihCcm93c2VyRlMuQXBpRXJyb3IpXSBjYlxuICAgKi9cbiAgcHVibGljIHN5bmMoY2I6IChlPzogQXBpRXJyb3IpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjYigpO1xuICB9XG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyBzeW5jLiBEb2Vzbid0IGRvIGFueXRoaW5nLlxuICAgKi9cbiAgcHVibGljIHN5bmNTeW5jKCk6IHZvaWQge31cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91cyBjbG9zZS4gRG9lc24ndCBkbyBhbnl0aGluZywgc2ltcGx5IGNhbGxzIHRoZSBjYi5cbiAgICogQHBhcmFtIFtGdW5jdGlvbihCcm93c2VyRlMuQXBpRXJyb3IpXSBjYlxuICAgKi9cbiAgcHVibGljIGNsb3NlKGNiOiAoZT86IEFwaUVycm9yKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY2IoKTtcbiAgfVxuICAvKipcbiAgICogU3luY2hyb25vdXMgY2xvc2UuIERvZXNuJ3QgZG8gYW55dGhpbmcuXG4gICAqL1xuICBwdWJsaWMgY2xvc2VTeW5jKCk6IHZvaWQge31cbn1cbiJdfQ==