filestack-adaptive
Version:
HTML5 picture elements powered by Filestack
219 lines (217 loc) • 32.1 kB
JavaScript
import { __assign } from "tslib";
import { Filelink } from 'filestack-js';
import utils from './utils';
function isFileHandleByStorageAlias(handle) {
return handle.srcHandle !== undefined;
}
var defaultResolutions = [
180,
360,
540,
720,
900,
1080,
1296,
1512,
1728,
1944,
2160,
2376,
2592,
2808,
3024,
];
/**
* Based on the provided transform options object create filestack filelink
*/
var createFileLink = function (handle, fileLinkOptions) {
var fileLink;
// Use storage alias handle
if (isFileHandleByStorageAlias(handle)) {
fileLink = new Filelink(handle.srcHandle, handle.apiKey);
}
else {
fileLink = new Filelink(handle);
}
// If validator is enabled use only for the first filelink in set
if (!fileLinkOptions.useValidator || (fileLinkOptions.indexInSet && fileLinkOptions.indexInSet > 0)) {
fileLink.setUseValidator(false);
}
Object.keys(fileLinkOptions.transform).sort(outputFirstSort).forEach(function (key) {
fileLink = fileLink.addTask(key, fileLinkOptions.transform[key]);
});
if (fileLinkOptions.cname) {
fileLink.setCname(fileLinkOptions.cname);
}
return fileLink.toString();
};
/**
* Sort array of keys in a way that 'output' is always the first
* @param previousKey - First key to be compared in a sort function
*/
var outputFirstSort = function (previousKey, nextKey) {
return previousKey === 'output' ? -1 : nextKey === 'output' ? 1 : 0;
};
var getWidth = function (width) { return function (resolution) {
if (typeof resolution === 'number') {
return resolution;
}
var unit = utils.getUnit(resolution);
if (unit === 'w') {
return utils.getNumber(resolution);
}
// Pixel density (2x == 2 * size)
return utils.getNumber(width) * utils.getNumber(resolution);
}; };
/**
* Construct Filestack URL out of CDN base and handle, with optional security
*/
var getCdnUrl = function (handle, options) {
var fileLinkOptions = {
transform: Object.assign({}, options.transforms),
useValidator: options.useValidator,
cname: options.cname,
};
return createFileLink(handle, fileLinkOptions);
};
/**
* Constructs a srcset attribute for source and img elements.
* Will use resolution descriptors or pixel densities to construct
* the proper URLs based on the width of the image.
*/
var makeSrcSet = function (handle, options, width, format) {
var fileLinkOptions = {
transform: Object.assign({}, options.transforms),
useValidator: options.useValidator,
cname: options.cname,
};
if (format) {
fileLinkOptions.transform.output = { format: format };
}
if (!width && format) {
return createFileLink(handle, fileLinkOptions);
}
var resolutions = options.resolutions.map(function (val) { return typeof val === 'number' ? val + "w" : val; });
var widths = options.resolutions.map(function (val) {
return getWidth(width)(val);
});
var urls = widths.map(function (width, index) {
fileLinkOptions.indexInSet = index;
fileLinkOptions.transform.resize = { width: width };
return createFileLink(handle, fileLinkOptions);
}, widths);
return urls.map(function (url, index) { return url + " " + resolutions[index]; }).join(', ');
};
/**
* Construct src attribute for img element.
* This may contain a resized URL if a fallback size is provided.
*/
var makeSrc = function (handle, fallback, options) {
var unit = utils.getUnit(fallback);
if (unit === 'vw') {
return getCdnUrl(handle, options);
}
var fileLinkOptions = {
transform: Object.assign({}, options.transforms),
useValidator: options.useValidator,
cname: options.cname,
};
fileLinkOptions.transform.resize = { width: utils.getNumber(fallback) };
return createFileLink(handle, fileLinkOptions);
};
/**
* A source element contains many possible hints for the browser.
* For each media query + size pair we can construct a source
* with the proper srcset using the size as the width parameter.
* For each format a source element can be constructed as well.
* This means there are (sizes × formats) sources.
*
* R.xprod lets us compute the Cartesian product of two lists.
*/
var makeSourcesTree = function (handle, options) {
var makeSource = function (media, width, format) {
if (!format && media === 'fallback') {
return undefined;
}
return utils.removeEmpty({
media: media === 'fallback' ? undefined : media,
sizes: width,
srcSet: makeSrcSet(handle, options, width, format),
type: format ? "image/" + format : undefined,
});
};
// Handle three cases -- sizes + type, just sizes, just type
if (!options.sizes && options.formats) {
var sources_1 = options.formats.map(function (format) { return makeSource(null, null, format); }).filter(function (source) { return !!source; });
return sources_1;
}
var sources = Object.entries(options.sizes);
if (options.formats) {
sources = utils.arrToChunks(utils.flat(utils.cartesian([sources, options.formats]), 2), 3);
}
var sourcesTree = sources.map(function (source) {
return makeSource.apply(null, source);
}).filter(function (source) { return !!source; });
return sourcesTree;
};
/**
* Just your basic HTML img element. However we can let the user specify
* a specific width which will incorporate pixel resolutions options in a srcset.
*/
var makeImgTree = function (handle, options) {
if (options.width) {
return utils.removeEmpty({
src: makeSrc(handle, options.width, options),
srcSet: makeSrcSet(handle, options, options.width),
alt: options.alt,
width: utils.getNumber(options.width),
});
}
var fallback = options.sizes && options.sizes.fallback;
return utils.removeEmpty({
src: fallback ? makeSrc(handle, fallback, options) : getCdnUrl(handle, options),
srcSet: options.sizes ? makeSrcSet(handle, options, fallback) : undefined,
alt: options.alt,
width: options.width,
sizes: fallback || undefined,
});
};
/**
* Represent a picture element as a tree where leaf nodes are attributes
* of one img element and zero or more source elements.
*
* This allows passing the structure into hyperscript-like virtual DOM generators.
* For example see https://github.com/choojs/hyperx
*/
export var makePictureTree = function (handle, opts) {
if (typeof handle !== 'string' && !isFileHandleByStorageAlias(handle)) {
throw new TypeError('Filestack handle must be a string');
}
if (opts && opts.resolutions && opts.resolutions.length) {
var rUnits = opts.resolutions.filter(function (resolution) {
return typeof resolution === 'string';
}).map(function (resolution) {
return utils.getUnit(resolution);
});
if (!opts.sizes && (opts.resolutions.some(function (resolution) { return typeof resolution === 'number'; }) || rUnits.indexOf('w') > -1)) {
throw new Error('You must specify at least one size to use width descriptors');
}
if (!opts.width && rUnits.indexOf('x') > -1) {
throw new Error('You must specify a width to use pixel densities.');
}
}
opts = utils.removeEmpty(opts);
var options = __assign({ resolutions: opts && opts.width ? ['1x', '2x'] : defaultResolutions }, opts);
options.transforms = options.transforms || {}; // ensure transforms are defined
if (options.security) {
options.transforms.security = options.security;
}
var img = makeImgTree(handle, options);
var tree = { img: img };
if (options.sizes || options.formats) {
var sources = makeSourcesTree(handle, options);
tree.sources = sources && sources.length ? sources : undefined;
}
return utils.removeEmpty(tree);
};
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QztBQUNqQyxDQUFDLENBQUMiLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRyYW5zZm9ybU9wdGlvbnMsIEZpbGVsaW5rIH0gZnJvbSAnZmlsZXN0YWNrLWpzJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBGaWxlTGlua09wdGlvbnMge1xuICB0cmFuc2Zvcm06IFRyYW5zZm9ybU9wdGlvbnM7XG4gIHVzZVZhbGlkYXRvcj86IGJvb2xlYW47XG4gIGluZGV4SW5TZXQ/OiBudW1iZXI7XG4gIGNuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVIYW5kbGVCeVN0b3JhZ2VBbGlhcyB7XG4gIHNyY0hhbmRsZTogc3RyaW5nO1xuICBhcGlLZXk6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgRmlsZUhhbmRsZSA9IHN0cmluZyB8IEZpbGVIYW5kbGVCeVN0b3JhZ2VBbGlhcztcblxuZnVuY3Rpb24gaXNGaWxlSGFuZGxlQnlTdG9yYWdlQWxpYXMoaGFuZGxlOiBTdHJpbmcgfCBGaWxlSGFuZGxlQnlTdG9yYWdlQWxpYXMgfCB1bmRlZmluZWQpOiBoYW5kbGUgaXMgRmlsZUhhbmRsZUJ5U3RvcmFnZUFsaWFzIHtcbiAgcmV0dXJuIChoYW5kbGUgYXMgRmlsZUhhbmRsZUJ5U3RvcmFnZUFsaWFzKS5zcmNIYW5kbGUgIT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWcge1xuICBhbHQ/OiBzdHJpbmc7XG4gIHNpemVzPzogc3RyaW5nO1xuICBzcmM6IHN0cmluZztcbiAgc3Jjc2V0Pzogc3RyaW5nO1xuICB3aWR0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb3VyY2Uge1xuICBtZWRpYT86IHN0cmluZztcbiAgc2l6ZXM/OiBzdHJpbmc7XG4gIHNyY3NldDogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nO1xuICAvLyBrZXk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGljdHVyZSB7XG4gIGltZzogSW1nO1xuICBzb3VyY2VzPzogU291cmNlW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2l6ZSB7XG4gIFttZWRpYXF1ZXJ5OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHkge1xuICBwb2xpY3k6IHN0cmluZztcbiAgc2lnbmF0dXJlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGljdHVyZU9wdGlvbnMge1xuICAvKipcbiAgICogU2V0IGlmIHNob3VsZCB1c2UgdmFsaWRhdG9yIGZvciBwYXJhbXMgdGFza1xuICAgKi9cbiAgdXNlVmFsaWRhdG9yPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFsdCBuYW1lIGZvciBpbWFnZSBlbGVtZW50LlxuICAgKi9cbiAgYWx0Pzogc3RyaW5nO1xuICAvKipcbiAgICogQXJyYXkgb2YgaW1hZ2UgdHlwZXMsIGUuZy4gWydqcGcnLCAnd2VicCddLlxuICAgKi9cbiAgZm9ybWF0cz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogVG9nZ2xlIHNldHRpbmcga2V5IGF0dHJpYnV0ZSBvbiBzb3VyY2VzLiBVc2VmdWwgZm9yIFJlYWN0LlxuICAgKiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAga2V5cz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSZXNvbHV0aW9uIGRlc2NyaXB0b3JzLiBEZWZhdWx0cyB0byBhIHNlbnNpYmxlIHJhbmdlXG4gICAqIGJldHdlZW4gMTgwdyBhbmQgMzAyNHcuIENhbiBhbHNvIGJlIG51bWJlcnMgcmVwcmVzZW50aW5nIHdpZHRoc1xuICAgKiBvciBzdHJpbmdzIHJlcHJlc2VudGluZyBwaXhlbCBkZW5zaXRpZXMsIGUuZy4gWycxeCcsICcyeCddLlxuICAgKi9cbiAgcmVzb2x1dGlvbnM/OiAoc3RyaW5nIHwgbnVtYmVyKVtdO1xuICAvKipcbiAgICogT2JqZWN0IGNvbnRhaW5pbmcgRmlsZXN0YWNrIHNlY3VyaXR5IHBvbGljeSBhbmQgc2lnbmF0dXJlLlxuICAgKi9cbiAgc2VjdXJpdHk/OiBTZWN1cml0eTtcbiAgLyoqXG4gICAqIE9iamVjdCBvZiBzaXplcyBhbmQgdGhlaXIgbWVkaWEgcXVlcnkgaGludHMuXG4gICAqIE5vdGU6IEEgZmFsbGJhY2sgZm9yIGltZyBzaXplcyBpcyBoaWdobHkgcmVjb21tZW5kZWQuXG4gICAqIEZvciBleGFtcGxlOlxuICAgKiBgYGBqc1xuICAgKiBzaXplczoge1xuICAgKiAgICcobWluLXdpZHRoOiAxMjgwcHgpJzogJzUwdncnLFxuICAgKiAgICcobWluLXdpZHRoOiA2NDBweCknOiAnNjB2dycsXG4gICAqICAgZmFsbGJhY2s6ICcxMDB2dycsXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBzaXplcz86IFNpemU7XG4gIC8qKlxuICAgKiBTdGF0aWMgd2lkdGggdG8gdXNlIGZvciBpbWcgd2l0aCBvcHRpb25hbCBwaXhlbCBkZW5zaXR5IHN1cHBvcnQuXG4gICAqL1xuICB3aWR0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFVzZSBjdXN0b20gY25hbWUgZm9yIGdlbmVyYXRlZCBmaWxlbGlua3MuXG4gICAqL1xuICBjbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogSW1hZ2UgdHJhbnNmb3JtYXRpb25zIG9wdGlvbnNcbiAgICpcbiAgICogQHNlZSBodHRwczovL3d3dy5maWxlc3RhY2suY29tL2RvY3MvaW1hZ2UtdHJhbnNmb3JtYXRpb25zXG4gICAqL1xuICB0cmFuc2Zvcm1zPzogVHJhbnNmb3JtT3B0aW9ucztcbn1cblxuY29uc3QgZGVmYXVsdFJlc29sdXRpb25zID0gW1xuICAxODAsXG4gIDM2MCxcbiAgNTQwLFxuICA3MjAsXG4gIDkwMCxcbiAgMTA4MCxcbiAgMTI5NixcbiAgMTUxMixcbiAgMTcyOCxcbiAgMTk0NCxcbiAgMjE2MCxcbiAgMjM3NixcbiAgMjU5MixcbiAgMjgwOCxcbiAgMzAyNCxcbl07XG5cbi8qKlxuICogQmFzZWQgb24gdGhlIHByb3ZpZGVkIHRyYW5zZm9ybSBvcHRpb25zIG9iamVjdCBjcmVhdGUgZmlsZXN0YWNrIGZpbGVsaW5rXG4gKi9cbmNvbnN0IGNyZWF0ZUZpbGVMaW5rID0gKGhhbmRsZTogRmlsZUhhbmRsZSwgZmlsZUxpbmtPcHRpb25zOiBGaWxlTGlua09wdGlvbnMpID0+IHtcbiAgbGV0IGZpbGVMaW5rOiBGaWxlbGluaztcbiAgLy8gVXNlIHN0b3JhZ2UgYWxpYXMgaGFuZGxlXG4gIGlmIChpc0ZpbGVIYW5kbGVCeVN0b3JhZ2VBbGlhcyhoYW5kbGUpKSB7XG4gICAgZmlsZUxpbmsgPSBuZXcgRmlsZWxpbmsoaGFuZGxlLnNyY0hhbmRsZSwgaGFuZGxlLmFwaUtleSk7XG4gIH0gZWxzZSB7XG4gICAgZmlsZUxpbmsgPSBuZXcgRmlsZWxpbmsoaGFuZGxlKTtcbiAgfVxuICAvLyBJZiB2YWxpZGF0b3IgaXMgZW5hYmxlZCB1c2Ugb25seSBmb3IgdGhlIGZpcnN0IGZpbGVsaW5rIGluIHNldFxuICBpZiAoIWZpbGVMaW5rT3B0aW9ucy51c2VWYWxpZGF0b3IgfHwgKGZpbGVMaW5rT3B0aW9ucy5pbmRleEluU2V0ICYmIGZpbGVMaW5rT3B0aW9ucy5pbmRleEluU2V0ID4gMCkpIHtcbiAgICBmaWxlTGluay5zZXRVc2VWYWxpZGF0b3IoZmFsc2UpO1xuICB9XG5cbiAgT2JqZWN0LmtleXMoZmlsZUxpbmtPcHRpb25zLnRyYW5zZm9ybSkuc29ydChvdXRwdXRGaXJzdFNvcnQpLmZvckVhY2goKGtleToga2V5b2YgVHJhbnNmb3JtT3B0aW9ucykgPT4ge1xuICAgIGZpbGVMaW5rID0gZmlsZUxpbmsuYWRkVGFzayhrZXksIGZpbGVMaW5rT3B0aW9ucy50cmFuc2Zvcm1ba2V5XSk7XG4gIH0pO1xuICBpZiAoZmlsZUxpbmtPcHRpb25zLmNuYW1lKSB7XG4gICAgZmlsZUxpbmsuc2V0Q25hbWUoZmlsZUxpbmtPcHRpb25zLmNuYW1lKTtcbiAgfVxuICByZXR1cm4gZmlsZUxpbmsudG9TdHJpbmcoKTtcbn07XG5cbi8qKlxuICogU29ydCBhcnJheSBvZiBrZXlzIGluIGEgd2F5IHRoYXQgJ291dHB1dCcgaXMgYWx3YXlzIHRoZSBmaXJzdFxuICogQHBhcmFtIHByZXZpb3VzS2V5IC0gRmlyc3Qga2V5IHRvIGJlIGNvbXBhcmVkIGluIGEgc29ydCBmdW5jdGlvblxuICovXG5jb25zdCBvdXRwdXRGaXJzdFNvcnQgPSAocHJldmlvdXNLZXk6IHN0cmluZywgbmV4dEtleTogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBwcmV2aW91c0tleSA9PT0gJ291dHB1dCcgPyAtMSA6IG5leHRLZXkgPT09ICdvdXRwdXQnID8gMSA6IDA7XG59O1xuXG5jb25zdCBnZXRXaWR0aCA9ICh3aWR0aD86IG51bWJlciB8IHN0cmluZykgPT4gKHJlc29sdXRpb246IG51bWJlciB8IHN0cmluZykgPT4ge1xuICBpZiAodHlwZW9mIHJlc29sdXRpb24gPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHJlc29sdXRpb247XG4gIH1cbiAgY29uc3QgdW5pdCA9IHV0aWxzLmdldFVuaXQocmVzb2x1dGlvbik7XG5cbiAgaWYgKHVuaXQgPT09ICd3Jykge1xuICAgIHJldHVybiB1dGlscy5nZXROdW1iZXIocmVzb2x1dGlvbik7XG4gIH1cbiAgLy8gUGl4ZWwgZGVuc2l0eSAoMnggPT0gMiAqIHNpemUpXG4gIHJldHVybiB1dGlscy5nZXROdW1iZXIod2lkdGgpICogdXRpbHMuZ2V0TnVtYmVyKHJlc29sdXRpb24pO1xufTtcblxuLyoqXG4gKiBDb25zdHJ1Y3QgRmlsZXN0YWNrIFVSTCBvdXQgb2YgQ0ROIGJhc2UgYW5kIGhhbmRsZSwgd2l0aCBvcHRpb25hbCBzZWN1cml0eVxuICovXG5jb25zdCBnZXRDZG5VcmwgPSAoaGFuZGxlOiBGaWxlSGFuZGxlLCBvcHRpb25zOiBQaWN0dXJlT3B0aW9ucykgPT4ge1xuICBjb25zdCBmaWxlTGlua09wdGlvbnMgPSB7XG4gICAgdHJhbnNmb3JtOiBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLnRyYW5zZm9ybXMpLFxuICAgIHVzZVZhbGlkYXRvcjogb3B0aW9ucy51c2VWYWxpZGF0b3IsXG4gICAgY25hbWU6IG9wdGlvbnMuY25hbWUsXG4gIH07XG5cbiAgcmV0dXJuIGNyZWF0ZUZpbGVMaW5rKGhhbmRsZSwgZmlsZUxpbmtPcHRpb25zKTtcbn07XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIHNyY3NldCBhdHRyaWJ1dGUgZm9yIHNvdXJjZSBhbmQgaW1nIGVsZW1lbnRzLlxuICogV2lsbCB1c2UgcmVzb2x1dGlvbiBkZXNjcmlwdG9ycyBvciBwaXhlbCBkZW5zaXRpZXMgdG8gY29uc3RydWN0XG4gKiB0aGUgcHJvcGVyIFVSTHMgYmFzZWQgb24gdGhlIHdpZHRoIG9mIHRoZSBpbWFnZS5cbiAqL1xuY29uc3QgbWFrZVNyY1NldCA9IChcbiAgaGFuZGxlOiBGaWxlSGFuZGxlLFxuICBvcHRpb25zOiBhbnksXG4gIHdpZHRoPzogbnVtYmVyIHwgc3RyaW5nLFxuICBmb3JtYXQ/OiBzdHJpbmcsXG4pID0+IHtcblxuICBsZXQgZmlsZUxpbmtPcHRpb25zOiBGaWxlTGlua09wdGlvbnMgPSB7XG4gICAgdHJhbnNmb3JtOiBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLnRyYW5zZm9ybXMpLFxuICAgIHVzZVZhbGlkYXRvcjogb3B0aW9ucy51c2VWYWxpZGF0b3IsXG4gICAgY25hbWU6IG9wdGlvbnMuY25hbWUsXG4gIH07XG5cbiAgaWYgKGZvcm1hdCkge1xuICAgIGZpbGVMaW5rT3B0aW9ucy50cmFuc2Zvcm0ub3V0cHV0ID0geyBmb3JtYXQgfTtcbiAgfVxuXG4gIGlmICghd2lkdGggJiYgZm9ybWF0KSB7XG4gICAgcmV0dXJuIGNyZWF0ZUZpbGVMaW5rKGhhbmRsZSwgZmlsZUxpbmtPcHRpb25zKTtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdXRpb25zID0gb3B0aW9ucy5yZXNvbHV0aW9ucy5tYXAoKHZhbDogYW55KSA9PiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyA/IGAke3ZhbH13YCA6IHZhbCk7XG5cbiAgY29uc3Qgd2lkdGhzID0gb3B0aW9ucy5yZXNvbHV0aW9ucy5tYXAoKHZhbDogYW55KSA9PiB7XG4gICAgcmV0dXJuIGdldFdpZHRoKHdpZHRoKSh2YWwpO1xuICB9KTtcblxuICBjb25zdCB1cmxzOiBhbnlbXSA9IHdpZHRocy5tYXAoKHdpZHRoOiBudW1iZXIsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICBmaWxlTGlua09wdGlvbnMuaW5kZXhJblNldCA9IGluZGV4O1xuICAgIGZpbGVMaW5rT3B0aW9ucy50cmFuc2Zvcm0ucmVzaXplID0geyB3aWR0aCB9O1xuXG4gICAgcmV0dXJuIGNyZWF0ZUZpbGVMaW5rKGhhbmRsZSwgZmlsZUxpbmtPcHRpb25zKTtcbiAgfSwgd2lkdGhzKTtcblxuICByZXR1cm4gdXJscy5tYXAoKHVybCwgaW5kZXgpID0+IGAke3VybH0gJHtyZXNvbHV0aW9uc1tpbmRleF19YCkuam9pbignLCAnKTtcbn07XG5cbi8qKlxuICogQ29uc3RydWN0IHNyYyBhdHRyaWJ1dGUgZm9yIGltZyBlbGVtZW50LlxuICogVGhpcyBtYXkgY29udGFpbiBhIHJlc2l6ZWQgVVJMIGlmIGEgZmFsbGJhY2sgc2l6ZSBpcyBwcm92aWRlZC5cbiAqL1xuY29uc3QgbWFrZVNyYyA9IChoYW5kbGU6IEZpbGVIYW5kbGUsIGZhbGxiYWNrOiBzdHJpbmcsIG9wdGlvbnM6IFBpY3R1cmVPcHRpb25zKSA9PiB7XG4gIGNvbnN0IHVuaXQgPSB1dGlscy5nZXRVbml0KGZhbGxiYWNrKTtcbiAgaWYgKHVuaXQgPT09ICd2dycpIHtcbiAgICByZXR1cm4gZ2V0Q2RuVXJsKGhhbmRsZSwgb3B0aW9ucyk7XG4gIH1cbiAgY29uc3QgZmlsZUxpbmtPcHRpb25zID0ge1xuICAgIHRyYW5zZm9ybTogT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy50cmFuc2Zvcm1zKSxcbiAgICB1c2VWYWxpZGF0b3I6IG9wdGlvbnMudXNlVmFsaWRhdG9yLFxuICAgIGNuYW1lOiBvcHRpb25zLmNuYW1lLFxuICB9O1xuICBmaWxlTGlua09wdGlvbnMudHJhbnNmb3JtLnJlc2l6ZSA9IHsgd2lkdGg6IHV0aWxzLmdldE51bWJlcihmYWxsYmFjaykgfTtcbiAgcmV0dXJuIGNyZWF0ZUZpbGVMaW5rKGhhbmRsZSwgZmlsZUxpbmtPcHRpb25zKTtcbn07XG5cbi8qKlxuICogQSBzb3VyY2UgZWxlbWVudCBjb250YWlucyBtYW55IHBvc3NpYmxlIGhpbnRzIGZvciB0aGUgYnJvd3Nlci5cbiAqIEZvciBlYWNoIG1lZGlhIHF1ZXJ5ICsgc2l6ZSBwYWlyIHdlIGNhbiBjb25zdHJ1Y3QgYSBzb3VyY2VcbiAqIHdpdGggdGhlIHByb3BlciBzcmNzZXQgdXNpbmcgdGhlIHNpemUgYXMgdGhlIHdpZHRoIHBhcmFtZXRlci5cbiAqIEZvciBlYWNoIGZvcm1hdCBhIHNvdXJjZSBlbGVtZW50IGNhbiBiZSBjb25zdHJ1Y3RlZCBhcyB3ZWxsLlxuICogVGhpcyBtZWFucyB0aGVyZSBhcmUgKHNpemVzIMOXIGZvcm1hdHMpIHNvdXJjZXMuXG4gKlxuICogUi54cHJvZCBsZXRzIHVzIGNvbXB1dGUgdGhlIENhcnRlc2lhbiBwcm9kdWN0IG9mIHR3byBsaXN0cy5cbiAqL1xuY29uc3QgbWFrZVNvdXJjZXNUcmVlID0gKGhhbmRsZTogRmlsZUhhbmRsZSwgb3B0aW9uczogYW55KTogU291cmNlW10gPT4ge1xuICBjb25zdCBtYWtlU291cmNlID0gKG1lZGlhOiBhbnksIHdpZHRoOiBhbnksIGZvcm1hdDogYW55KTogU291cmNlIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAoIWZvcm1hdCAmJiBtZWRpYSA9PT0gJ2ZhbGxiYWNrJykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHV0aWxzLnJlbW92ZUVtcHR5KHtcbiAgICAgIG1lZGlhOiBtZWRpYSA9PT0gJ2ZhbGxiYWNrJyA/IHVuZGVmaW5lZCA6IG1lZGlhLFxuICAgICAgc2l6ZXM6IHdpZHRoLFxuICAgICAgc3JjU2V0OiBtYWtlU3JjU2V0KGhhbmRsZSwgb3B0aW9ucywgd2lkdGgsIGZvcm1hdCksXG4gICAgICB0eXBlOiBmb3JtYXQgPyBgaW1hZ2UvJHtmb3JtYXR9YCA6IHVuZGVmaW5lZCxcbiAgICAgIC8vIGtleTogb3B0aW9ucy5rZXlzXG4gICAgICAvLyAgID8gYCR7aGFuZGxlfS0ke21lZGlhIHx8ICdmYWxsYmFjayd9LSR7d2lkdGggfHwgJ2F1dG8nfS0ke2Zvcm1hdCB8fCAnYXV0byd9YFxuICAgICAgLy8gICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfTtcbiAgLy8gSGFuZGxlIHRocmVlIGNhc2VzIC0tIHNpemVzICsgdHlwZSwganVzdCBzaXplcywganVzdCB0eXBlXG4gIGlmICghb3B0aW9ucy5zaXplcyAmJiBvcHRpb25zLmZvcm1hdHMpIHtcbiAgICBjb25zdCBzb3VyY2VzID0gb3B0aW9ucy5mb3JtYXRzLm1hcCgoZm9ybWF0OiBzdHJpbmcpID0+IG1ha2VTb3VyY2UobnVsbCwgbnVsbCwgZm9ybWF0KSkuZmlsdGVyKChzb3VyY2U6IHN0cmluZykgPT4gISFzb3VyY2UpO1xuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG5cbiAgbGV0IHNvdXJjZXM6IGFueVtdID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucy5zaXplcyk7XG5cbiAgaWYgKG9wdGlvbnMuZm9ybWF0cykge1xuICAgIHNvdXJjZXMgPSB1dGlscy5hcnJUb0NodW5rcyh1dGlscy5mbGF0KHV0aWxzLmNhcnRlc2lhbihbc291cmNlcywgb3B0aW9ucy5mb3JtYXRzXSksIDIpLCAzKTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZXNUcmVlID0gc291cmNlcy5tYXAoKHNvdXJjZTogYW55KSA9PiB7XG4gICAgcmV0dXJuIG1ha2VTb3VyY2UuYXBwbHkobnVsbCwgc291cmNlKTtcbiAgfSkuZmlsdGVyKHNvdXJjZSA9PiAhIXNvdXJjZSk7XG4gIHJldHVybiBzb3VyY2VzVHJlZTtcbn07XG5cbi8qKlxuICogSnVzdCB5b3VyIGJhc2ljIEhUTUwgaW1nIGVsZW1lbnQuIEhvd2V2ZXIgd2UgY2FuIGxldCB0aGUgdXNlciBzcGVjaWZ5XG4gKiBhIHNwZWNpZmljIHdpZHRoIHdoaWNoIHdpbGwgaW5jb3Jwb3JhdGUgcGl4ZWwgcmVzb2x1dGlvbnMgb3B0aW9ucyBpbiBhIHNyY3NldC5cbiAqL1xuY29uc3QgbWFrZUltZ1RyZWUgPSAoaGFuZGxlOiBGaWxlSGFuZGxlLCBvcHRpb25zOiBQaWN0dXJlT3B0aW9ucyk6IEltZyA9PiB7XG4gIGlmIChvcHRpb25zLndpZHRoKSB7XG4gICAgcmV0dXJuIHV0aWxzLnJlbW92ZUVtcHR5KHtcbiAgICAgIHNyYzogbWFrZVNyYyhoYW5kbGUsIG9wdGlvbnMud2lkdGgsIG9wdGlvbnMpLFxuICAgICAgc3JjU2V0OiBtYWtlU3JjU2V0KGhhbmRsZSwgb3B0aW9ucywgb3B0aW9ucy53aWR0aCksXG4gICAgICBhbHQ6IG9wdGlvbnMuYWx0LFxuICAgICAgd2lkdGg6IHV0aWxzLmdldE51bWJlcihvcHRpb25zLndpZHRoKSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGZhbGxiYWNrID0gb3B0aW9ucy5zaXplcyAmJiBvcHRpb25zLnNpemVzLmZhbGxiYWNrO1xuXG4gIHJldHVybiB1dGlscy5yZW1vdmVFbXB0eSh7XG4gICAgc3JjOiBmYWxsYmFjayA/IG1ha2VTcmMoaGFuZGxlLCBmYWxsYmFjaywgb3B0aW9ucykgOiBnZXRDZG5VcmwoaGFuZGxlLCBvcHRpb25zKSxcbiAgICBzcmNTZXQ6IG9wdGlvbnMuc2l6ZXMgPyBtYWtlU3JjU2V0KGhhbmRsZSwgb3B0aW9ucywgZmFsbGJhY2spIDogdW5kZWZpbmVkLFxuICAgIGFsdDogb3B0aW9ucy5hbHQsXG4gICAgd2lkdGg6IG9wdGlvbnMud2lkdGgsXG4gICAgc2l6ZXM6IGZhbGxiYWNrIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFJlcHJlc2VudCBhIHBpY3R1cmUgZWxlbWVudCBhcyBhIHRyZWUgd2hlcmUgbGVhZiBub2RlcyBhcmUgYXR0cmlidXRlc1xuICogb2Ygb25lIGltZyBlbGVtZW50IGFuZCB6ZXJvIG9yIG1vcmUgc291cmNlIGVsZW1lbnRzLlxuICpcbiAqIFRoaXMgYWxsb3dzIHBhc3NpbmcgdGhlIHN0cnVjdHVyZSBpbnRvIGh5cGVyc2NyaXB0LWxpa2UgdmlydHVhbCBET00gZ2VuZXJhdG9ycy5cbiAqIEZvciBleGFtcGxlIHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hvb2pzL2h5cGVyeFxuICovXG5leHBvcnQgY29uc3QgbWFrZVBpY3R1cmVUcmVlID0gKGhhbmRsZT86IEZpbGVIYW5kbGUsIG9wdHM/OiBQaWN0dXJlT3B0aW9ucyk6IFBpY3R1cmUgPT4ge1xuICBpZiAodHlwZW9mIGhhbmRsZSAhPT0gJ3N0cmluZycgJiYgIWlzRmlsZUhhbmRsZUJ5U3RvcmFnZUFsaWFzKGhhbmRsZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaWxlc3RhY2sgaGFuZGxlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlmIChvcHRzICYmIG9wdHMucmVzb2x1dGlvbnMgJiYgb3B0cy5yZXNvbHV0aW9ucy5sZW5ndGgpIHtcbiAgICBjb25zdCByVW5pdHM6IHN0cmluZ1tdID0gb3B0cy5yZXNvbHV0aW9ucy5maWx0ZXIoKHJlc29sdXRpb246IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHR5cGVvZiByZXNvbHV0aW9uID09PSAnc3RyaW5nJztcbiAgICB9KS5tYXAoKHJlc29sdXRpb246IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIHV0aWxzLmdldFVuaXQocmVzb2x1dGlvbik7XG4gICAgfSk7XG4gICAgaWYgKCFvcHRzLnNpemVzICYmIChvcHRzLnJlc29sdXRpb25zLnNvbWUoKHJlc29sdXRpb24pID0+IHR5cGVvZiByZXNvbHV0aW9uID09PSAnbnVtYmVyJykgfHwgclVuaXRzLmluZGV4T2YoJ3cnKSA+IC0xKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBzaXplIHRvIHVzZSB3aWR0aCBkZXNjcmlwdG9ycycpO1xuICAgIH1cbiAgICBpZiAoIW9wdHMud2lkdGggJiYgclVuaXRzLmluZGV4T2YoJ3gnKSA+IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHNwZWNpZnkgYSB3aWR0aCB0byB1c2UgcGl4ZWwgZGVuc2l0aWVzLicpO1xuICAgIH1cbiAgfVxuXG4gIG9wdHMgPSB1dGlscy5yZW1vdmVFbXB0eShvcHRzKTtcblxuICBjb25zdCBvcHRpb25zOiBQaWN0dXJlT3B0aW9ucyA9IHtcbiAgICByZXNvbHV0aW9uczogb3B0cyAmJiBvcHRzLndpZHRoID8gWycxeCcsICcyeCddIDogZGVmYXVsdFJlc29sdXRpb25zLFxuICAgIC8vIGtleXM6IHRydWUsXG4gICAgLi4ub3B0cyxcbiAgfTtcblxuICBvcHRpb25zLnRyYW5zZm9ybXMgPSBvcHRpb25zLnRyYW5zZm9ybXMgfHwge307IC8vIGVuc3VyZSB0cmFuc2Zvcm1zIGFyZSBkZWZpbmVkXG5cbiAgaWYgKG9wdGlvbnMuc2VjdXJpdHkpIHtcbiAgICBvcHRpb25zLnRyYW5zZm9ybXMuc2VjdXJpdHkgPSBvcHRpb25zLnNlY3VyaXR5O1xuICB9XG5cbiAgY29uc3QgaW1nOiBJbWcgPSBtYWtlSW1nVHJlZShoYW5kbGUsIG9wdGlvbnMpO1xuICBjb25zdCB0cmVlOiBQaWN0dXJlID0geyBpbWcgfTtcblxuICBpZiAob3B0aW9ucy5zaXplcyB8fCBvcHRpb25zLmZvcm1hdHMpIHtcbiAgICBjb25zdCBzb3VyY2VzOiBTb3VyY2VbXSA9IG1ha2VTb3VyY2VzVHJlZShoYW5kbGUsIG9wdGlvbnMpO1xuICAgIHRyZWUuc291cmNlcyA9IHNvdXJjZXMgJiYgc291cmNlcy5sZW5ndGggPyBzb3VyY2VzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHV0aWxzLnJlbW92ZUVtcHR5KHRyZWUpO1xufTtcbiJdfQ==