filestack-js
Version:
Official JavaScript library for Filestack
165 lines (163 loc) • 18.3 kB
JavaScript
import { __extends } 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 Debug from 'debug';
import EventEmitter from 'eventemitter3';
import { isMobile } from './../../../utils';
import { FilestackError } from './../../../../filestack_error';
// regular part size
export var DEFAULT_PART_SIZE = 6 * 1024 * 1024;
// Minimum part size for upload by multipart
export var MIN_PART_SIZE = 5 * 1024 * 1024;
// when mode is set to fallback or intelligent, this part size is required
export var INTELLIGENT_CHUNK_SIZE = 8 * 1024 * 1024;
// Mobile Chunk size for ii
export var INTELLIGENT_MOBILE_CHUNK_SIZE = 1024 * 1024;
// minimum intelligent chunk size
export var MIN_CHUNK_SIZE = 32 * 1024;
export var DEFAULT_STORE_LOCATION = 's3';
var debug = Debug('fs:upload:abstract');
var UploaderAbstract = /** @class */ (function (_super) {
__extends(UploaderAbstract, _super);
function UploaderAbstract(storeOptions, concurrency) {
if (concurrency === void 0) { concurrency = 3; }
var _this = _super.call(this) || this;
_this.storeOptions = storeOptions;
_this.concurrency = concurrency;
// Parts size options
_this.partSize = DEFAULT_PART_SIZE;
// chunk size for ii uploads
_this.intelligentChunkSize = isMobile() ? INTELLIGENT_MOBILE_CHUNK_SIZE : INTELLIGENT_CHUNK_SIZE;
_this.timeout = 30 * 1000;
_this.uploadMode = "default" /* UploadMode.DEFAULT */;
_this.isModeLocked = false; // if account does not support ii in fallback mode we should abort
_this.integrityCheck = true;
_this.uploadTags = null;
return _this;
}
UploaderAbstract.prototype.setSecurity = function (security) {
debug('Set security %O', security);
this.security = security;
};
UploaderAbstract.prototype.setApikey = function (apikey) {
debug("Set apikey to ".concat(apikey));
this.apikey = apikey;
};
UploaderAbstract.prototype.setTimeout = function (timeout) {
debug("Set request timeout to ".concat(timeout));
this.timeout = timeout;
};
UploaderAbstract.prototype.setRetryConfig = function (cfg) {
debug("Set retry config to ".concat(cfg));
this.retryConfig = cfg;
};
UploaderAbstract.prototype.setUrl = function (url) {
debug("Set upload url to ".concat(url));
this.url = url;
};
UploaderAbstract.prototype.setUploadTags = function (tags) {
debug("Set tags to %O", tags);
this.uploadTags = tags;
};
/**
* Set state of checking file integrity
* @param state
*/
UploaderAbstract.prototype.setIntegrityCheck = function (state) {
this.integrityCheck = state;
};
/**
* Sets upload mode
*
* @param {UploadMode} mode
* @param {boolean} [lock=false]
* @returns
* @memberof MultipartUploader
*/
UploaderAbstract.prototype.setUploadMode = function (mode, lock) {
if (lock === void 0) { lock = false; }
// this shouldnt happend but for safety reasons if will stay
/* istanbul ignore next */
if (this.isModeLocked === true) {
debug("Cannot switch mode to ".concat(mode, ". Locked! Probably mode is not supported at this apikey"));
return;
}
this.isModeLocked = lock;
debug("Set upload mode to ".concat(mode));
this.uploadMode = mode;
};
/**
* Set upload part size
* if part size is smaller than minimum 5mb it will throw error
*
* @param {number} size
* @returns {void}
* @memberof S3Uploader
*/
UploaderAbstract.prototype.setPartSize = function (size) {
if (this.uploadMode !== "default" /* UploadMode.DEFAULT */) {
debug('Cannot set part size because upload mode is other than default. ');
return;
}
debug("Set part size to ".concat(size));
if (size < MIN_PART_SIZE) {
throw new FilestackError('Minimum part size is 5MB');
}
this.partSize = size;
};
/**
* Returns current part size
*/
UploaderAbstract.prototype.getPartSize = function () {
return this.partSize;
};
/**
* Set start part size for ii
*
* @param {number} size
* @memberof S3Uploader
*/
UploaderAbstract.prototype.setIntelligentChunkSize = function (size) {
debug("Set inteligent chunk size to ".concat(size));
if (size < MIN_CHUNK_SIZE) {
throw new FilestackError("Minimum intelligent chunk size is ".concat(MIN_CHUNK_SIZE));
}
this.intelligentChunkSize = size;
};
/**
* Returns intelligent chunk size
*/
UploaderAbstract.prototype.getIntelligentChunkSize = function () {
return this.intelligentChunkSize;
};
/**
* Returns filestack upload url
*
* @private
* @returns
* @memberof MultipartUploader
*/
UploaderAbstract.prototype.getUrl = function () {
if (!this.url) {
throw new FilestackError('Upload url not set');
}
return this.url;
};
return UploaderAbstract;
}(EventEmitter));
export { UploaderAbstract };
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL3VwbG9hZC91cGxvYWRlcnMvYWJzdHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLFlBQVksTUFBTSxlQUFlLENBQUM7QUFNekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUUvRCxvQkFBb0I7QUFDcEIsTUFBTSxDQUFDLElBQU0saUJBQWlCLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFakQsNENBQTRDO0FBQzVDLE1BQU0sQ0FBQyxJQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUU3QywwRUFBMEU7QUFDMUUsTUFBTSxDQUFDLElBQU0sc0JBQXNCLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFdEQsMkJBQTJCO0FBQzNCLE1BQU0sQ0FBQyxJQUFNLDZCQUE2QixHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFekQsaUNBQWlDO0FBQ2pDLE1BQU0sQ0FBQyxJQUFNLGNBQWMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRXhDLE1BQU0sQ0FBQyxJQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQztBQUUzQyxJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQVExQztJQUErQyxvQ0FBWTtJQXNCekQsMEJBQStCLFlBQWdDLEVBQXFCLFdBQXVCO1FBQXZCLDRCQUFBLEVBQUEsZUFBdUI7UUFBM0csWUFDRSxpQkFBTyxTQUNSO1FBRjhCLGtCQUFZLEdBQVosWUFBWSxDQUFvQjtRQUFxQixpQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQXJCM0cscUJBQXFCO1FBQ1gsY0FBUSxHQUFXLGlCQUFp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ekMsS0FBSyxDQUFDLHVDQUFnQyxJQUFJLENBQUUsQ0FBQyxDQUFDO1FBQzlDLElBQUksSUFBSSxHQUFHLGNBQWMsRUFBRTtZQUN6QixNQUFNLElBQUksY0FBYyxDQUFDLDRDQUFxQyxjQUFjLENBQUUsQ0FBQyxDQUFDO1NBQ2pGO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxrREFBdUIsR0FBOUI7UUFDRSxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksaUNBQU0sR0FBYjtRQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2IsTUFBTSxJQUFJLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUF5QkgsdUJBQUM7QUFBRCxDQWhMQSxBQWdMQyxDQWhMOEMsWUFBWSxHQWdMMUQiLCJmaWxlIjoibGliL2FwaS91cGxvYWQvdXBsb2FkZXJzL2Fic3RyYWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOSBieSBGaWxlc3RhY2suXG4gKiBTb21lIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBEZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuXG5pbXBvcnQgeyBGaWxlLCBVcGxvYWRUYWdzIH0gZnJvbSAnLi8uLi9maWxlJztcbmltcG9ydCB7IFN0b3JlVXBsb2FkT3B0aW9ucyB9IGZyb20gJy4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgU2VjdXJpdHkgfSBmcm9tICcuLy4uLy4uLy4uL2NsaWVudCc7XG5pbXBvcnQgeyBGc1JldHJ5Q29uZmlnIH0gZnJvbSAnLi8uLi8uLi8uLi9yZXF1ZXN0JztcbmltcG9ydCB7IGlzTW9iaWxlIH0gZnJvbSAnLi8uLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBGaWxlc3RhY2tFcnJvciB9IGZyb20gJy4vLi4vLi4vLi4vLi4vZmlsZXN0YWNrX2Vycm9yJztcblxuLy8gcmVndWxhciBwYXJ0IHNpemVcbmV4cG9ydCBjb25zdCBERUZBVUxUX1BBUlRfU0laRSA9IDYgKiAxMDI0ICogMTAyNDtcblxuLy8gTWluaW11bSBwYXJ0IHNpemUgZm9yIHVwbG9hZCBieSBtdWx0aXBhcnRcbmV4cG9ydCBjb25zdCBNSU5fUEFSVF9TSVpFID0gNSAqIDEwMjQgKiAxMDI0O1xuXG4vLyB3aGVuIG1vZGUgaXMgc2V0IHRvIGZhbGxiYWNrIG9yIGludGVsbGlnZW50LCB0aGlzIHBhcnQgc2l6ZSBpcyByZXF1aXJlZFxuZXhwb3J0IGNvbnN0IElOVEVMTElHRU5UX0NIVU5LX1NJWkUgPSA4ICogMTAyNCAqIDEwMjQ7XG5cbi8vIE1vYmlsZSBDaHVuayBzaXplIGZvciBpaVxuZXhwb3J0IGNvbnN0IElOVEVMTElHRU5UX01PQklMRV9DSFVOS19TSVpFID0gMTAyNCAqIDEwMjQ7XG5cbi8vIG1pbmltdW0gaW50ZWxsaWdlbnQgY2h1bmsgc2l6ZVxuZXhwb3J0IGNvbnN0IE1JTl9DSFVOS19TSVpFID0gMzIgKiAxMDI0O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TVE9SRV9MT0NBVElPTiA9ICdzMyc7XG5cbmNvbnN0IGRlYnVnID0gRGVidWcoJ2ZzOnVwbG9hZDphYnN0cmFjdCcpO1xuXG5leHBvcnQgY29uc3QgZW51bSBVcGxvYWRNb2RlIHtcbiAgREVGQVVMVCA9ICdkZWZhdWx0JyxcbiAgSU5URUxMSUdFTlQgPSAnaW50ZWxsaWdlbnQnLFxuICBGQUxMQkFDSyA9ICdmYWxsYmFjaycsXG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBVcGxvYWRlckFic3RyYWN0IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLy8gUGFydHMgc2l6ZSBvcHRpb25zXG4gIHByb3RlY3RlZCBwYXJ0U2l6ZTogbnVtYmVyID0gREVGQVVMVF9QQVJUX1NJWkU7XG5cbiAgLy8gY2h1bmsgc2l6ZSBmb3IgaWkgdXBsb2Fkc1xuICBwcm90ZWN0ZWQgaW50ZWxsaWdlbnRDaHVua1NpemU6IG51bWJlciA9IGlzTW9iaWxlKCkgPyBJTlRFTExJR0VOVF9NT0JJTEVfQ0hVTktfU0laRSA6IElOVEVMTElHRU5UX0NIVU5LX1NJWkU7XG5cbiAgLy8gdXBsb2FkIG9wdGlvbnNcbiAgcHJvdGVjdGVkIHVybDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgdGltZW91dDogbnVtYmVyID0gMzAgKiAxMDAwO1xuICBwcm90ZWN0ZWQgdXBsb2FkTW9kZTogVXBsb2FkTW9kZSA9IFVwbG9hZE1vZGUuREVGQVVMVDtcblxuICAvLyBhcHBsaWNhdGlvbiBzZXR0aW5nc1xuICBwcm90ZWN0ZWQgYXBpa2V5OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBzZWN1cml0eTogU2VjdXJpdHk7XG5cbiAgcHJvdGVjdGVkIGlzTW9kZUxvY2tlZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBpZiBhY2NvdW50IGRvZXMgbm90IHN1cHBvcnQgaWkgaW4gZmFsbGJhY2sgbW9kZSB3ZSBzaG91bGQgYWJvcnRcbiAgcHJvdGVjdGVkIHJldHJ5Q29uZmlnOiBGc1JldHJ5Q29uZmlnO1xuICBwcm90ZWN0ZWQgaW50ZWdyaXR5Q2hlY2s6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByb3RlY3RlZCB1cGxvYWRUYWdzOiBVcGxvYWRUYWdzID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgc3RvcmVPcHRpb25zOiBTdG9yZVVwbG9hZE9wdGlvbnMsIHByb3RlY3RlZCByZWFkb25seSBjb25jdXJyZW5jeTogbnVtYmVyID0gMykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0U2VjdXJpdHkoc2VjdXJpdHk6IFNlY3VyaXR5KTogdm9pZCB7XG4gICAgZGVidWcoJ1NldCBzZWN1cml0eSAlTycsIHNlY3VyaXR5KTtcbiAgICB0aGlzLnNlY3VyaXR5ID0gc2VjdXJpdHk7XG4gIH1cblxuICBwdWJsaWMgc2V0QXBpa2V5KGFwaWtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgZGVidWcoYFNldCBhcGlrZXkgdG8gJHthcGlrZXl9YCk7XG4gICAgdGhpcy5hcGlrZXkgPSBhcGlrZXk7XG4gIH1cblxuICBwdWJsaWMgc2V0VGltZW91dCh0aW1lb3V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBkZWJ1ZyhgU2V0IHJlcXVlc3QgdGltZW91dCB0byAke3RpbWVvdXR9YCk7XG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRSZXRyeUNvbmZpZyhjZmc6IEZzUmV0cnlDb25maWcpIHtcbiAgICBkZWJ1ZyhgU2V0IHJldHJ5IGNvbmZpZyB0byAke2NmZ31gKTtcbiAgICB0aGlzLnJldHJ5Q29uZmlnID0gY2ZnO1xuICB9XG5cbiAgcHVibGljIHNldFVybCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGRlYnVnKGBTZXQgdXBsb2FkIHVybCB0byAke3VybH1gKTtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRVcGxvYWRUYWdzKHRhZ3M6IFVwbG9hZFRhZ3MpIHtcbiAgICBkZWJ1ZyhgU2V0IHRhZ3MgdG8gJU9gLCB0YWdzKTtcbiAgICB0aGlzLnVwbG9hZFRhZ3MgPSB0YWdzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzdGF0ZSBvZiBjaGVja2luZyBmaWxlIGludGVncml0eVxuICAgKiBAcGFyYW0gc3RhdGVcbiAgICovXG4gIHB1YmxpYyBzZXRJbnRlZ3JpdHlDaGVjayhzdGF0ZSkge1xuICAgIHRoaXMuaW50ZWdyaXR5Q2hlY2sgPSBzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwbG9hZCBtb2RlXG4gICAqXG4gICAqIEBwYXJhbSB7VXBsb2FkTW9kZX0gbW9kZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtsb2NrPWZhbHNlXVxuICAgKiBAcmV0dXJuc1xuICAgKiBAbWVtYmVyb2YgTXVsdGlwYXJ0VXBsb2FkZXJcbiAgICovXG4gIHB1YmxpYyBzZXRVcGxvYWRNb2RlKG1vZGU6IFVwbG9hZE1vZGUsIGxvY2s6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIC8vIHRoaXMgc2hvdWxkbnQgaGFwcGVuZCBidXQgZm9yIHNhZmV0eSByZWFzb25zIGlmIHdpbGwgc3RheVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuaXNNb2RlTG9ja2VkID09PSB0cnVlKSB7XG4gICAgICBkZWJ1ZyhgQ2Fubm90IHN3aXRjaCBtb2RlIHRvICR7bW9kZX0uIExvY2tlZCEgUHJvYmFibHkgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgYXBpa2V5YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc01vZGVMb2NrZWQgPSBsb2NrO1xuXG4gICAgZGVidWcoYFNldCB1cGxvYWQgbW9kZSB0byAke21vZGV9YCk7XG5cbiAgICB0aGlzLnVwbG9hZE1vZGUgPSBtb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cGxvYWQgcGFydCBzaXplXG4gICAqIGlmIHBhcnQgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gbWluaW11bSA1bWIgaXQgd2lsbCB0aHJvdyBlcnJvclxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlcm9mIFMzVXBsb2FkZXJcbiAgICovXG4gIHB1YmxpYyBzZXRQYXJ0U2l6ZShzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy51cGxvYWRNb2RlICE9PSBVcGxvYWRNb2RlLkRFRkFVTFQpIHtcbiAgICAgIGRlYnVnKCdDYW5ub3Qgc2V0IHBhcnQgc2l6ZSBiZWNhdXNlIHVwbG9hZCBtb2RlIGlzIG90aGVyIHRoYW4gZGVmYXVsdC4gJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGVidWcoYFNldCBwYXJ0IHNpemUgdG8gJHtzaXplfWApO1xuXG4gICAgaWYgKHNpemUgPCBNSU5fUEFSVF9TSVpFKSB7XG4gICAgICB0aHJvdyBuZXcgRmlsZXN0YWNrRXJyb3IoJ01pbmltdW0gcGFydCBzaXplIGlzIDVNQicpO1xuICAgIH1cblxuICAgIHRoaXMucGFydFNpemUgPSBzaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VycmVudCBwYXJ0IHNpemVcbiAgICovXG4gIHB1YmxpYyBnZXRQYXJ0U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJ0U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc3RhcnQgcGFydCBzaXplIGZvciBpaVxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICAgKiBAbWVtYmVyb2YgUzNVcGxvYWRlclxuICAgKi9cbiAgcHVibGljIHNldEludGVsbGlnZW50Q2h1bmtTaXplKHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgIGRlYnVnKGBTZXQgaW50ZWxpZ2VudCBjaHVuayBzaXplIHRvICR7c2l6ZX1gKTtcbiAgICBpZiAoc2l6ZSA8IE1JTl9DSFVOS19TSVpFKSB7XG4gICAgICB0aHJvdyBuZXcgRmlsZXN0YWNrRXJyb3IoYE1pbmltdW0gaW50ZWxsaWdlbnQgY2h1bmsgc2l6ZSBpcyAke01JTl9DSFVOS19TSVpFfWApO1xuICAgIH1cbiAgICB0aGlzLmludGVsbGlnZW50Q2h1bmtTaXplID0gc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGludGVsbGlnZW50IGNodW5rIHNpemVcbiAgICovXG4gIHB1YmxpYyBnZXRJbnRlbGxpZ2VudENodW5rU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmludGVsbGlnZW50Q2h1bmtTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZmlsZXN0YWNrIHVwbG9hZCB1cmxcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnNcbiAgICogQG1lbWJlcm9mIE11bHRpcGFydFVwbG9hZGVyXG4gICAqL1xuICBwdWJsaWMgZ2V0VXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnVybCkge1xuICAgICAgdGhyb3cgbmV3IEZpbGVzdGFja0Vycm9yKCdVcGxvYWQgdXJsIG5vdCBzZXQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy51cmw7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgdXBsb2FkIHF1ZXVlXG4gICAqXG4gICAqIEBtZW1iZXJvZiBNdWx0aXBhcnRVcGxvYWRlclxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHBhdXNlKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiByZXN1bWUgdXBsb2FkIHF1ZXVlIGlmIGl0cyBwYXVzZWRcbiAgICpcbiAgICogQG1lbWJlcm9mIE11bHRpcGFydFVwbG9hZGVyXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVzdW1lKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFib3J0cyBxdWV1ZSAoYWxsIHBlbmRpbmcgcmVxdWVzdHMgd2l0aCB3aWxsIGJlIGFib3J0ZWQpXG4gICAqXG4gICAqIEBtZW1iZXJvZiBNdWx0aXBhcnRVcGxvYWRlclxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGFib3J0KG1zZz86IHN0cmluZyk6IHZvaWQ7XG5cbiAgcHVibGljIGFic3RyYWN0IGFkZEZpbGUoZmlsZTogRmlsZSk6IHN0cmluZztcblxuICBwdWJsaWMgYWJzdHJhY3QgZXhlY3V0ZSgpOiBQcm9taXNlPGFueT47XG59XG4iXX0=