UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

251 lines (249 loc) 22.7 kB
import { __assign, __awaiter, __generator } from "tslib"; /* * Copyright (c) 2019 by Filestack. * Some rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { md5, sanitizeName } from './../../utils'; /** * File representation to unify file object in nodejs and browser * * @export * @class File */ var File = /** @class */ (function () { function File(_file, _sanitizeOptions) { this._file = _file; this._sanitizeOptions = _sanitizeOptions; this._file.name = sanitizeName(this._file.name, this._sanitizeOptions); } Object.defineProperty(File.prototype, "name", { /** * Returns file name * * @returns {string} * @memberof File */ get: function () { return this._file.name; }, /** * Sets new file name and cleanup extra chars * * @memberof File */ set: function (val) { this._file.name = sanitizeName(val, this._sanitizeOptions); }, enumerable: false, configurable: true }); Object.defineProperty(File.prototype, "filename", { /** * Alias for name getter * * @readonly * @type {string} * @memberof File */ get: function () { return this.name; }, enumerable: false, configurable: true }); Object.defineProperty(File.prototype, "customName", { /** * Sets custom name using string or function * Name will be sanitized * * @memberof File */ set: function (val) { switch (typeof val) { case 'string': this.name = val; break; case 'function': var newName = val(this); if (typeof newName !== 'string') { throw new Error("Name function must return a string. Current return type is ".concat(typeof val)); } this.name = val(this); break; } }, enumerable: false, configurable: true }); Object.defineProperty(File.prototype, "type", { /** * Returns file type * * @default 'application/octet-stream' * @returns {string} * @memberof File */ get: function () { /* istanbul ignore next */ return this._file.type || 'application/octet-stream'; }, enumerable: false, configurable: true }); Object.defineProperty(File.prototype, "mimetype", { /** * Alias for file type * * @readonly * @type {string} * @memberof File */ get: function () { return this.type; }, enumerable: false, configurable: true }); Object.defineProperty(File.prototype, "size", { /** * Returns file size * * @returns {number} * @memberof File */ get: function () { return this._file.size; }, enumerable: false, configurable: true }); /** * Returns number of parts and part size according to max limit * @param {number} size - part size in bytes * @returns {PartSize} * @memberof File */ File.prototype.getPartsCount = function (size, intelligentChunk) { var DEFAULT_FILE_SIZE_LIMIT = 59 * 1024 * 1024 * 1024; var INTELLIGENT_FILE_SIZE_LIMIT = 79 * 1024 * 1024 * 1024; var FILE_SIZE_LIMIT = intelligentChunk ? INTELLIGENT_FILE_SIZE_LIMIT : DEFAULT_FILE_SIZE_LIMIT; var MAX_S3_CHUNKS_ALLOWED = 10000; // When file size is greater than 60GB, chunk size is calculated dynamically // Chunk count is set to the max number of chunks allowed over s3 if (this._file.size >= FILE_SIZE_LIMIT) { var dynamicPartSize = Math.ceil(this._file.size / MAX_S3_CHUNKS_ALLOWED); // size is set in bytes return { partsCount: Math.ceil(this._file.size / dynamicPartSize), chunkSize: dynamicPartSize, }; } return { partsCount: Math.ceil(this._file.size / size), chunkSize: size, }; }; /** * Returns part metadata * * @param {number} [partNum=0] * @param {*} size * @returns {FilePartMetadata} * @memberof File */ File.prototype.getPartMetadata = function (partNum, size) { var startByte = size * partNum; if (startByte > this._file.size) { throw new Error("Start byte of the part is higher than buffer size"); } var endByte = Math.min(startByte + size, this._file.size); return { partNumber: partNum, startByte: startByte, endByte: endByte, size: endByte - startByte, }; }; /** * Returns part metadata + buffer * * @param {FilePartMetadata} meta * @returns {FilePart} * @memberof File */ File.prototype.getPartByMetadata = function (meta, md5Enabled) { if (md5Enabled === void 0) { md5Enabled = true; } return __awaiter(this, void 0, void 0, function () { var slice; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this._file.slice(meta.startByte, meta.endByte)]; case 1: slice = _a.sent(); return [2 /*return*/, Promise.resolve(__assign(__assign({}, meta), { buffer: slice, md5: md5Enabled ? md5(slice) : undefined }))]; } }); }); }; /** * Returns part chunk * * @param {FilePartMetadata} meta * @param {number} offset * @param {number} chunkSize * @returns {FilePart} * @memberof File */ File.prototype.getChunkByMetadata = function (meta, offset, chunkSize, md5Enabled) { if (md5Enabled === void 0) { md5Enabled = true; } return __awaiter(this, void 0, void 0, function () { var startByte, endByte, slice; return __generator(this, function (_a) { switch (_a.label) { case 0: startByte = meta.startByte + offset; endByte = Math.min(startByte + chunkSize, meta.endByte); return [4 /*yield*/, this._file.slice(startByte, endByte)]; case 1: slice = _a.sent(); return [2 /*return*/, Promise.resolve(__assign(__assign({}, meta), { buffer: slice, md5: md5Enabled ? md5(slice) : undefined, size: slice.byteLength, startByte: startByte, endByte: endByte, offset: offset }))]; } }); }); }; /** * Cleanup file buffer to release memory * * @memberof File */ File.prototype.release = function () { if (this._file.release) { this._file.release(); } }; File.prototype.toJSON = function () { return { name: this.name, status: this.status, type: this.type, size: this.size, url: this.url, handle: this.handle, uploadTags: this.uploadTags, }; }; return File; }()); export { File }; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL3VwbG9hZC9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBbUIsTUFBTSxlQUFlLENBQUM7QUEyQ25FOzs7OztHQUtHO0FBQ0g7SUFrQkUsY0FBNkIsS0FBbUIsRUFBbUIsZ0JBQWtDO1FBQXhFLFVBQUssR0FBTCxLQUFLLENBQWM7UUFBbUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNuRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDekUsQ0FBQztJQVFELHNCQUFXLHNCQUFJO1FBTmY7Ozs7O1dBS0c7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDekIsQ0FBQztRQWFEOzs7O1dBSUc7YUFDSCxVQUFnQixHQUFXO1lBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDN0QsQ0FBQzs7O09BcEJBO0lBU0Qsc0JBQVcsMEJBQVE7UUFQbkI7Ozs7OztXQU1HO2FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkIsQ0FBQzs7O09BQUE7SUFpQkQsc0JBQVcsNEJBQVU7UUFOckI7Ozs7O1dBS0c7YUFDSCxVQUFzQixHQUFzQztZQUMxRCxRQUFRLE9BQU8sR0FBRyxFQUFFO2dCQUNsQixLQUFLLFFBQVE7b0JBQ1gsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7b0JBQ2hCLE1BQU07Z0JBQ1IsS0FBSyxVQUFVO29CQUNiLElBQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDMUIsSUFB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LEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtTQUM1QixDQUFDO0lBQ0osQ0FBQztJQUNILFdBQUM7QUFBRCxDQWxPQSxBQWtPQyxJQUFBIiwiZmlsZSI6ImxpYi9hcGkvdXBsb2FkL2ZpbGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IGJ5IEZpbGVzdGFjay5cbiAqIFNvbWUgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgbWQ1LCBzYW5pdGl6ZU5hbWUsIFNhbml0aXplT3B0aW9ucyB9IGZyb20gJy4vLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZFRhZ3Mge1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUluc3RhbmNlIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHNpemU6IG51bWJlcjtcbiAgc2xpY2U6IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4gUHJvbWlzZTxBcnJheUJ1ZmZlcj47XG4gIHJlbGVhc2U/OiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBGaWxlU3RhdGUge1xuICBJTklUID0gJ0luaXRpYWxpemVkJyxcbiAgUFJPR1JFU1MgPSAnUHJvZ3Jlc3MnLFxuICBTVE9SRUQgPSAnU3RvcmVkJyxcbiAgSU5UUkFOU0lUID0gJ0luVHJhbnNpdCcsXG4gIEZBSUxFRCA9ICdGYWlsZWQnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVQYXJ0TWV0YWRhdGEge1xuICBzdGFydEJ5dGU6IG51bWJlcjtcbiAgZW5kQnl0ZTogbnVtYmVyO1xuICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlUGFydCBleHRlbmRzIEZpbGVQYXJ0TWV0YWRhdGEge1xuICBidWZmZXI6IEJ1ZmZlciB8IEFycmF5QnVmZmVyO1xuICBtZDU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUNodW5rIGV4dGVuZHMgRmlsZVBhcnQge1xuICBvZmZzZXQ6IG51bWJlcjsgLy8gb2Zmc2V0IGZvciBjaHVuayAtIGZyb20gcGFydCBzdGFydFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRTaXplIHtcbiAgcGFydHNDb3VudDogbnVtYmVyO1xuICBjaHVua1NpemU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGaWxlIHJlcHJlc2VudGF0aW9uIHRvIHVuaWZ5IGZpbGUgb2JqZWN0IGluIG5vZGVqcyBhbmQgYnJvd3NlclxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBGaWxlXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWxlIHtcblxuICBwdWJsaWMgc3RhdHVzOiBGaWxlU3RhdGU7XG5cbiAgcHVibGljIGhhbmRsZTogc3RyaW5nO1xuXG4gIHB1YmxpYyB1cmw6IHN0cmluZztcblxuICBwdWJsaWMgY29udGFpbmVyOiBzdHJpbmc7XG5cbiAgcHVibGljIGtleTogc3RyaW5nO1xuXG4gIHB1YmxpYyB3b3JrZmxvd3M6IGFueVtdO1xuXG4gIHB1YmxpYyB1cGxvYWRUYWdzOiBVcGxvYWRUYWdzO1xuXG4gIHB1YmxpYyBhbHQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IF9maWxlOiBGaWxlSW5zdGFuY2UsIHByaXZhdGUgcmVhZG9ubHkgX3Nhbml0aXplT3B0aW9ucz86IFNhbml0aXplT3B0aW9ucykge1xuICAgIHRoaXMuX2ZpbGUubmFtZSA9IHNhbml0aXplTmFtZSh0aGlzLl9maWxlLm5hbWUsIHRoaXMuX3Nhbml0aXplT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBmaWxlIG5hbWVcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICogQG1lbWJlcm9mIEZpbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWxlLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQWxpYXMgZm9yIG5hbWUgZ2V0dGVyXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgRmlsZVxuICAgKi9cbiAgcHVibGljIGdldCBmaWxlbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBuZXcgZmlsZSBuYW1lICBhbmQgY2xlYW51cCBleHRyYSBjaGFyc1xuICAgKlxuICAgKiBAbWVtYmVyb2YgRmlsZVxuICAgKi9cbiAgcHVibGljIHNldCBuYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5fZmlsZS5uYW1lID0gc2FuaXRpemVOYW1lKHZhbCwgdGhpcy5fc2FuaXRpemVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGN1c3RvbSBuYW1lIHVzaW5nIHN0cmluZyBvciBmdW5jdGlvblxuICAgKiBOYW1lIHdpbGwgYmUgc2FuaXRpemVkXG4gICAqXG4gICAqIEBtZW1iZXJvZiBGaWxlXG4gICAqL1xuICBwdWJsaWMgc2V0IGN1c3RvbU5hbWUodmFsOiAoKGZpbGU6IHRoaXMpID0+IHN0cmluZykgfCBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHRoaXMubmFtZSA9IHZhbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgIGNvbnN0IG5ld05hbWUgPSB2YWwodGhpcyk7XG4gICAgICAgIGlmICh0eXBlb2YgbmV3TmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5hbWUgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSBzdHJpbmcuIEN1cnJlbnQgcmV0dXJuIHR5cGUgaXMgJHt0eXBlb2YgdmFsfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uYW1lID0gdmFsKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBmaWxlIHR5cGVcbiAgICpcbiAgICogQGRlZmF1bHQgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICogQG1lbWJlcm9mIEZpbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHRoaXMuX2ZpbGUudHlwZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGlhcyBmb3IgZmlsZSB0eXBlXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgRmlsZVxuICAgKi9cbiAgcHVibGljIGdldCBtaW1ldHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBmaWxlIHNpemVcbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICogQG1lbWJlcm9mIEZpbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9maWxlLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBudW1iZXIgb2YgcGFydHMgYW5kIHBhcnQgc2l6ZSBhY2NvcmRpbmcgdG8gbWF4IGxpbWl0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gcGFydCBzaXplIGluIGJ5dGVzXG4gICAqIEByZXR1cm5zIHtQYXJ0U2l6ZX1cbiAgICogQG1lbWJlcm9mIEZpbGVcbiAgICovXG4gIHB1YmxpYyBnZXRQYXJ0c0NvdW50IChzaXplOiBudW1iZXIsIGludGVsbGlnZW50Q2h1bms6IGJvb2xlYW4pOiBQYXJ0U2l6ZSB7XG4gICAgY29uc3QgREVGQVVMVF9GSUxFX1NJWkVfTElNSVQgPSA1OSAqIDEwMjQgKiAxMDI0ICogMTAyNDtcbiAgICBjb25zdCBJTlRFTExJR0VOVF9GSUxFX1NJWkVfTElNSVQgPSA3OSAqIDEwMjQgKiAxMDI0ICogMTAyNDtcbiAgICBjb25zdCBGSUxFX1NJWkVfTElNSVQgPSBpbnRlbGxpZ2VudENodW5rID8gSU5URUxMSUdFTlRfRklMRV9TSVpFX0xJTUlUIDogREVGQVVMVF9GSUxFX1NJWkVfTElNSVQ7XG4gICAgY29uc3QgTUFYX1MzX0NIVU5LU19BTExPV0VEID0gMTAwMDA7XG5cbiAgICAvLyBXaGVuIGZpbGUgc2l6ZSBpcyBncmVhdGVyIHRoYW4gNjBHQiwgY2h1bmsgc2l6ZSBpcyBjYWxjdWxhdGVkIGR5bmFtaWNhbGx5XG4gICAgLy8gQ2h1bmsgY291bnQgaXMgc2V0IHRvIHRoZSBtYXggbnVtYmVyIG9mIGNodW5rcyBhbGxvd2VkIG92ZXIgczNcbiAgICBpZiAodGhpcy5fZmlsZS5zaXplID49IEZJTEVfU0laRV9MSU1JVCkge1xuICAgICAgY29uc3QgZHluYW1pY1BhcnRTaXplID0gTWF0aC5jZWlsKHRoaXMuX2ZpbGUuc2l6ZSAvIE1BWF9TM19DSFVOS1NfQUxMT1dFRCk7IC8vIHNpemUgaXMgc2V0IGluIGJ5dGVzXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhcnRzQ291bnQ6IE1hdGguY2VpbCh0aGlzLl9maWxlLnNpemUgLyBkeW5hbWljUGFydFNpemUpLFxuICAgICAgICBjaHVua1NpemU6IGR5bmFtaWNQYXJ0U2l6ZSxcbiAgICAgIH07XG5cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGFydHNDb3VudDogTWF0aC5jZWlsKHRoaXMuX2ZpbGUuc2l6ZSAvIHNpemUpLFxuICAgICAgY2h1bmtTaXplOiBzaXplLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBwYXJ0IG1ldGFkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFydE51bT0wXVxuICAgKiBAcGFyYW0geyp9IHNpemVcbiAgICogQHJldHVybnMge0ZpbGVQYXJ0TWV0YWRhdGF9XG4gICAqIEBtZW1iZXJvZiBGaWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFydE1ldGFkYXRhIChwYXJ0TnVtOiBudW1iZXIsIHNpemU6IG51bWJlcik6IEZpbGVQYXJ0TWV0YWRhdGEge1xuICAgIGNvbnN0IHN0YXJ0Qnl0ZSA9IHNpemUgKiBwYXJ0TnVtO1xuXG4gICAgaWYgKHN0YXJ0Qnl0ZSA+IHRoaXMuX2ZpbGUuc2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGFydCBieXRlIG9mIHRoZSBwYXJ0IGlzIGhpZ2hlciB0aGFuIGJ1ZmZlciBzaXplYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kQnl0ZSA9IE1hdGgubWluKHN0YXJ0Qnl0ZSArIHNpemUsIHRoaXMuX2ZpbGUuc2l6ZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGFydE51bWJlcjogcGFydE51bSxcbiAgICAgIHN0YXJ0Qnl0ZSxcbiAgICAgIGVuZEJ5dGUsXG4gICAgICBzaXplOiBlbmRCeXRlIC0gc3RhcnRCeXRlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBwYXJ0IG1ldGFkYXRhICsgYnVmZmVyXG4gICAqXG4gICAqIEBwYXJhbSB7RmlsZVBhcnRNZXRhZGF0YX0gbWV0YVxuICAgKiBAcmV0dXJucyB7RmlsZVBhcnR9XG4gICAqIEBtZW1iZXJvZiBGaWxlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UGFydEJ5TWV0YWRhdGEobWV0YTogRmlsZVBhcnRNZXRhZGF0YSwgbWQ1RW5hYmxlZDogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPEZpbGVQYXJ0PiB7XG4gICAgbGV0IHNsaWNlID0gYXdhaXQgdGhpcy5fZmlsZS5zbGljZShtZXRhLnN0YXJ0Qnl0ZSwgbWV0YS5lbmRCeXRlKTtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgLi4ubWV0YSxcbiAgICAgIGJ1ZmZlcjogc2xpY2UsXG4gICAgICBtZDU6IG1kNUVuYWJsZWQgPyBtZDUoc2xpY2UpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcGFydCBjaHVua1xuICAgKlxuICAgKiBAcGFyYW0ge0ZpbGVQYXJ0TWV0YWRhdGF9IG1ldGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICAgKiBAcGFyYW0ge251bWJlcn0gY2h1bmtTaXplXG4gICAqIEByZXR1cm5zIHtGaWxlUGFydH1cbiAgICogQG1lbWJlcm9mIEZpbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaHVua0J5TWV0YWRhdGEobWV0YTogRmlsZVBhcnRNZXRhZGF0YSwgb2Zmc2V0OiBudW1iZXIsIGNodW5rU2l6ZTogbnVtYmVyLCBtZDVFbmFibGVkOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8RmlsZUNodW5rPiB7XG4gICAgY29uc3Qgc3RhcnRCeXRlID0gbWV0YS5zdGFydEJ5dGUgKyBvZmZzZXQ7XG4gICAgY29uc3QgZW5kQnl0ZSA9IE1hdGgubWluKHN0YXJ0Qnl0ZSArIGNodW5rU2l6ZSwgbWV0YS5lbmRCeXRlKTtcblxuICAgIGxldCBzbGljZSA9IGF3YWl0IHRoaXMuX2ZpbGUuc2xpY2Uoc3RhcnRCeXRlLCBlbmRCeXRlKTtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgLi4ubWV0YSxcbiAgICAgIGJ1ZmZlcjogc2xpY2UsXG4gICAgICBtZDU6IG1kNUVuYWJsZWQgPyBtZDUoc2xpY2UpIDogdW5kZWZpbmVkLFxuICAgICAgc2l6ZTogc2xpY2UuYnl0ZUxlbmd0aCxcbiAgICAgIHN0YXJ0Qnl0ZSxcbiAgICAgIGVuZEJ5dGUsXG4gICAgICBvZmZzZXQsXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIENsZWFudXAgZmlsZSBidWZmZXIgdG8gcmVsZWFzZSBtZW1vcnlcbiAgICpcbiAgICogQG1lbWJlcm9mIEZpbGVcbiAgICovXG4gIHB1YmxpYyByZWxlYXNlKCkge1xuICAgIGlmICh0aGlzLl9maWxlLnJlbGVhc2UpIHtcbiAgICAgIHRoaXMuX2ZpbGUucmVsZWFzZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBzaXplOiB0aGlzLnNpemUsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgaGFuZGxlOiB0aGlzLmhhbmRsZSxcbiAgICAgIHVwbG9hZFRhZ3M6IHRoaXMudXBsb2FkVGFncyxcbiAgICB9O1xuICB9XG59XG4iXX0=