@orbit/utils
Version:
Core utilities for Orbit.
238 lines • 20.7 kB
JavaScript
/* eslint-disable @typescript-eslint/explicit-module-boundary-types, valid-jsdoc */
Object.defineProperty(exports, "__esModule", { value: true });
exports.objectValues = exports.deepSet = exports.deepGet = exports.deepMerge = exports.merge = exports.isNone = exports.isObject = exports.toArray = exports.extend = exports.expose = exports.clone = void 0;
/**
* Clones a value. If the value is an object, a deeply nested clone will be
* created.
*
* Traverses all object properties (but not prototype properties).
*/
function clone(obj) {
if (obj === undefined || obj === null || typeof obj !== 'object') {
return obj;
}
let dup;
let type = Object.prototype.toString.call(obj);
if (type === '[object Date]') {
dup = new Date();
dup.setTime(obj.getTime());
}
else if (type === '[object RegExp]') {
dup = obj.constructor(obj);
}
else if (type === '[object Array]') {
dup = [];
for (let i = 0, len = obj.length; i < len; i++) {
if (obj.hasOwnProperty(i)) {
dup.push(clone(obj[i]));
}
}
}
else {
let val;
dup = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
val = obj[key];
if (typeof val === 'object') {
val = clone(val);
}
dup[key] = val;
}
}
}
return dup;
}
exports.clone = clone;
/**
* Expose properties and methods from one object on another.
*
* Methods will be called on `source` and will maintain `source` as the context.
*
* @deprecated since v0.17
*/
function expose(destination, source) {
let properties;
if (arguments.length > 2) {
properties = Array.prototype.slice.call(arguments, 2);
}
else {
properties = Object.keys(source);
}
properties.forEach((p) => {
if (typeof source[p] === 'function') {
destination[p] = function () {
return source[p].apply(source, arguments);
};
}
else {
destination[p] = source[p];
}
});
}
exports.expose = expose;
/**
* Extend an object with the properties of one or more other objects.
*
* @deprecated since v0.17
*/
function extend(destination, ...sources) {
sources.forEach((source) => {
for (let p in source) {
if (source.hasOwnProperty(p)) {
destination[p] = source[p];
}
}
});
return destination;
}
exports.extend = extend;
/**
* Converts an object to an `Array` if it's not already.
*
* @export
* @param {*} obj
* @returns {any[]}
*/
function toArray(obj) {
if (isNone(obj)) {
return [];
}
else {
return Array.isArray(obj) ? obj : [obj];
}
}
exports.toArray = toArray;
/**
* Checks whether a value is a non-null object
*
* @export
* @param {*} obj
* @returns {boolean}
*/
function isObject(obj) {
return obj !== null && typeof obj === 'object';
}
exports.isObject = isObject;
/**
* Checks whether an object is null or undefined
*
* @export
* @param {*} obj
* @returns {boolean}
*/
function isNone(obj) {
return obj === undefined || obj === null;
}
exports.isNone = isNone;
/**
* Merges properties from other objects into a base object. Properties that
* resolve to `undefined` will not overwrite properties on the base object
* that already exist.
*
* @deprecated since v0.17
*/
function merge(object, ...sources) {
sources.forEach((source) => {
Object.keys(source).forEach((field) => {
if (source.hasOwnProperty(field)) {
let value = source[field];
if (value !== undefined) {
object[field] = clone(value);
}
}
});
});
return object;
}
exports.merge = merge;
/**
* Merges properties from other objects into a base object, traversing and
* merging any objects that are encountered.
*
* Properties that resolve to `undefined` will not overwrite properties on the
* base object that already exist.
*/
function deepMerge(object, ...sources) {
sources.forEach((source) => {
Object.keys(source).forEach((field) => {
if (source.hasOwnProperty(field)) {
let a = object[field];
let b = source[field];
if (isObject(a) &&
isObject(b) &&
!Array.isArray(a) &&
!Array.isArray(b)) {
deepMerge(a, b);
}
else if (b !== undefined) {
object[field] = clone(b);
}
}
});
});
return object;
}
exports.deepMerge = deepMerge;
/**
* Retrieves a value from a nested path on an object.
*
* Returns any falsy value encountered while traversing the path.
*/
function deepGet(obj, path) {
let index = -1;
let result = obj;
while (++index < path.length) {
result = result[path[index]];
if (!result) {
return result;
}
}
return result;
}
exports.deepGet = deepGet;
/**
* Sets a value on an object at a nested path.
*
* This function will create objects along the path if necessary to allow
* setting a deeply nested value.
*
* Returns `false` only if the current value is already strictly equal to the
* requested `value` argument. Otherwise returns `true`.
*/
function deepSet(obj, path, value) {
let ptr = obj;
let prop = path.pop();
let segment;
for (let i = 0, l = path.length; i < l; i++) {
segment = path[i];
if (ptr[segment] === undefined) {
ptr[segment] = typeof segment === 'number' ? [] : {};
}
ptr = ptr[segment];
}
if (ptr[prop] === value) {
return false;
}
else {
ptr[prop] = value;
return true;
}
}
exports.deepSet = deepSet;
/**
* Find an array of values that correspond to the keys of an object.
*
* This is a ponyfill for `Object.values`, which is still experimental.
*/
function objectValues(obj) {
if (Object.values) {
return Object.values(obj);
}
else {
return Object.keys(obj).map((k) => obj[k]);
}
}
exports.objectValues = objectValues;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vYmplY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxtRkFBbUY7OztBQUVuRjs7Ozs7R0FLRztBQUNILFNBQWdCLEtBQUssQ0FBQyxHQUFRO0lBQzVCLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtRQUNoRSxPQUFPLEdBQUcsQ0FBQztLQUNaO0lBRUQsSUFBSSxHQUFRLENBQUM7SUFDYixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFL0MsSUFBSSxJQUFJLEtBQUssZUFBZSxFQUFFO1FBQzVCLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2pCLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7S0FDNUI7U0FBTSxJQUFJLElBQUksS0FBSyxpQkFBaUIsRUFBRTtRQUNyQyxHQUFHLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUM1QjtTQUFNLElBQUksSUFBSSxLQUFLLGdCQUFnQixFQUFFO1FBQ3BDLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDVCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlDLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDekIsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6QjtTQUNGO0tBQ0Y7U0FBTTtRQUNMLElBQUksR0FBRyxDQUFDO1FBRVIsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNULEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFO1lBQ25CLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDM0IsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDZixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtvQkFDM0IsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDbEI7Z0JBQ0QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzthQUNoQjtTQUNGO0tBQ0Y7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFuQ0Qsc0JBbUNDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsTUFBTSxDQUFDLFdBQWdCLEVBQUUsTUFBVztJQUNsRCxJQUFJLFVBQW9CLENBQUM7SUFDekIsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN4QixVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUN2RDtTQUFNO1FBQ0wsVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDbEM7SUFFRCxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDdkIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLEVBQUU7WUFDbkMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHO2dCQUNmLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDNUMsQ0FBQyxDQUFDO1NBQ0g7YUFBTTtZQUNMLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUI7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFqQkQsd0JBaUJDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxXQUFnQixFQUFFLEdBQUcsT0FBYztJQUN4RCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDekIsS0FBSyxJQUFJLENBQUMsSUFBSSxNQUFNLEVBQUU7WUFDcEIsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUM1QixXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzVCO1NBQ0Y7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFURCx3QkFTQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLE9BQU8sQ0FBQyxHQUFZO0lBQ2xDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2YsT0FBTyxFQUFFLENBQUM7S0FDWDtTQUFNO1FBQ0wsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDekM7QUFDSCxDQUFDO0FBTkQsMEJBTUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixRQUFRLENBQUMsR0FBWTtJQUNuQyxPQUFPLEdBQUcsS0FBSyxJQUFJLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDO0FBQ2pELENBQUM7QUFGRCw0QkFFQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxHQUFZO0lBQ2pDLE9BQU8sR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDO0FBQzNDLENBQUM7QUFGRCx3QkFFQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLEtBQUssQ0FBQyxNQUFXLEVBQUUsR0FBRyxPQUFjO0lBQ2xELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3BDLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDaEMsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7b0JBQ3ZCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzlCO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQVpELHNCQVlDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLE1BQVcsRUFBRSxHQUFHLE9BQWM7SUFDdEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDcEMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNoQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEIsSUFDRSxRQUFRLENBQUMsQ0FBQyxDQUFDO29CQUNYLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQ1gsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFDakIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUNqQjtvQkFDQSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNqQjtxQkFBTSxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7b0JBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzFCO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQXBCRCw4QkFvQkM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsT0FBTyxDQUFDLEdBQVEsRUFBRSxJQUFjO0lBQzlDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2YsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBRWpCLE9BQU8sRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUM1QixNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxPQUFPLE1BQU0sQ0FBQztTQUNmO0tBQ0Y7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBWkQsMEJBWUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLE9BQU8sQ0FBQyxHQUFRLEVBQUUsSUFBYyxFQUFFLEtBQVU7SUFDMUQsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2QsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBWSxDQUFDO0lBQ2hDLElBQUksT0FBTyxDQUFDO0lBQ1osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMzQyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUM5QixHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN0RDtRQUNELEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDcEI7SUFDRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUU7UUFDdkIsT0FBTyxLQUFLLENBQUM7S0FDZDtTQUFNO1FBQ0wsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPLElBQUksQ0FBQztLQUNiO0FBQ0gsQ0FBQztBQWpCRCwwQkFpQkM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLEdBQVE7SUFDbkMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO1FBQ2pCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUMzQjtTQUFNO1FBQ0wsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDNUM7QUFDSCxDQUFDO0FBTkQsb0NBTUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzLCB2YWxpZC1qc2RvYyAqL1xuXG4vKipcbiAqIENsb25lcyBhIHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LCBhIGRlZXBseSBuZXN0ZWQgY2xvbmUgd2lsbCBiZVxuICogY3JlYXRlZC5cbiAqXG4gKiBUcmF2ZXJzZXMgYWxsIG9iamVjdCBwcm9wZXJ0aWVzIChidXQgbm90IHByb3RvdHlwZSBwcm9wZXJ0aWVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKG9iajogYW55KTogYW55IHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkIHx8IG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBsZXQgZHVwOiBhbnk7XG4gIGxldCB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaik7XG5cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIGR1cCA9IG5ldyBEYXRlKCk7XG4gICAgZHVwLnNldFRpbWUob2JqLmdldFRpbWUoKSk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcbiAgICBkdXAgPSBvYmouY29uc3RydWN0b3Iob2JqKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgZHVwID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG9iai5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICBkdXAucHVzaChjbG9uZShvYmpbaV0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IHZhbDtcblxuICAgIGR1cCA9IHt9O1xuICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICB2YWwgPSBvYmpba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdmFsID0gY2xvbmUodmFsKTtcbiAgICAgICAgfVxuICAgICAgICBkdXBba2V5XSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGR1cDtcbn1cblxuLyoqXG4gKiBFeHBvc2UgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBmcm9tIG9uZSBvYmplY3Qgb24gYW5vdGhlci5cbiAqXG4gKiBNZXRob2RzIHdpbGwgYmUgY2FsbGVkIG9uIGBzb3VyY2VgIGFuZCB3aWxsIG1haW50YWluIGBzb3VyY2VgIGFzIHRoZSBjb250ZXh0LlxuICpcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHYwLjE3XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvc2UoZGVzdGluYXRpb246IGFueSwgc291cmNlOiBhbnkpOiB2b2lkIHtcbiAgbGV0IHByb3BlcnRpZXM6IHN0cmluZ1tdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICBwcm9wZXJ0aWVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgfVxuXG4gIHByb3BlcnRpZXMuZm9yRWFjaCgocCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygc291cmNlW3BdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBkZXN0aW5hdGlvbltwXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVtwXS5hcHBseShzb3VyY2UsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0aW5hdGlvbltwXSA9IHNvdXJjZVtwXTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIEV4dGVuZCBhbiBvYmplY3Qgd2l0aCB0aGUgcHJvcGVydGllcyBvZiBvbmUgb3IgbW9yZSBvdGhlciBvYmplY3RzLlxuICpcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHYwLjE3XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQoZGVzdGluYXRpb246IGFueSwgLi4uc291cmNlczogYW55W10pOiBhbnkge1xuICBzb3VyY2VzLmZvckVhY2goKHNvdXJjZSkgPT4ge1xuICAgIGZvciAobGV0IHAgaW4gc291cmNlKSB7XG4gICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KHApKSB7XG4gICAgICAgIGRlc3RpbmF0aW9uW3BdID0gc291cmNlW3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3QgdG8gYW4gYEFycmF5YCBpZiBpdCdzIG5vdCBhbHJlYWR5LlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7Kn0gb2JqXG4gKiBAcmV0dXJucyB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5KG9iajogdW5rbm93bik6IGFueVtdIHtcbiAgaWYgKGlzTm9uZShvYmopKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9iaikgPyBvYmogOiBbb2JqXTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFsdWUgaXMgYSBub24tbnVsbCBvYmplY3RcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0geyp9IG9ialxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdChvYmo6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBvYmplY3QgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0geyp9IG9ialxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vbmUob2JqOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGw7XG59XG5cbi8qKlxuICogTWVyZ2VzIHByb3BlcnRpZXMgZnJvbSBvdGhlciBvYmplY3RzIGludG8gYSBiYXNlIG9iamVjdC4gUHJvcGVydGllcyB0aGF0XG4gKiByZXNvbHZlIHRvIGB1bmRlZmluZWRgIHdpbGwgbm90IG92ZXJ3cml0ZSBwcm9wZXJ0aWVzIG9uIHRoZSBiYXNlIG9iamVjdFxuICogdGhhdCBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHYwLjE3XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZShvYmplY3Q6IGFueSwgLi4uc291cmNlczogYW55W10pOiBhbnkge1xuICBzb3VyY2VzLmZvckVhY2goKHNvdXJjZSkgPT4ge1xuICAgIE9iamVjdC5rZXlzKHNvdXJjZSkuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoZmllbGQpKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHNvdXJjZVtmaWVsZF07XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb2JqZWN0W2ZpZWxkXSA9IGNsb25lKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuLyoqXG4gKiBNZXJnZXMgcHJvcGVydGllcyBmcm9tIG90aGVyIG9iamVjdHMgaW50byBhIGJhc2Ugb2JqZWN0LCB0cmF2ZXJzaW5nIGFuZFxuICogbWVyZ2luZyBhbnkgb2JqZWN0cyB0aGF0IGFyZSBlbmNvdW50ZXJlZC5cbiAqXG4gKiBQcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCB3aWxsIG5vdCBvdmVyd3JpdGUgcHJvcGVydGllcyBvbiB0aGVcbiAqIGJhc2Ugb2JqZWN0IHRoYXQgYWxyZWFkeSBleGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBNZXJnZShvYmplY3Q6IGFueSwgLi4uc291cmNlczogYW55W10pOiBhbnkge1xuICBzb3VyY2VzLmZvckVhY2goKHNvdXJjZSkgPT4ge1xuICAgIE9iamVjdC5rZXlzKHNvdXJjZSkuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoZmllbGQpKSB7XG4gICAgICAgIGxldCBhID0gb2JqZWN0W2ZpZWxkXTtcbiAgICAgICAgbGV0IGIgPSBzb3VyY2VbZmllbGRdO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNPYmplY3QoYSkgJiZcbiAgICAgICAgICBpc09iamVjdChiKSAmJlxuICAgICAgICAgICFBcnJheS5pc0FycmF5KGEpICYmXG4gICAgICAgICAgIUFycmF5LmlzQXJyYXkoYilcbiAgICAgICAgKSB7XG4gICAgICAgICAgZGVlcE1lcmdlKGEsIGIpO1xuICAgICAgICB9IGVsc2UgaWYgKGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9iamVjdFtmaWVsZF0gPSBjbG9uZShiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSB2YWx1ZSBmcm9tIGEgbmVzdGVkIHBhdGggb24gYW4gb2JqZWN0LlxuICpcbiAqIFJldHVybnMgYW55IGZhbHN5IHZhbHVlIGVuY291bnRlcmVkIHdoaWxlIHRyYXZlcnNpbmcgdGhlIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwR2V0KG9iajogYW55LCBwYXRoOiBzdHJpbmdbXSk6IGFueSB7XG4gIGxldCBpbmRleCA9IC0xO1xuICBsZXQgcmVzdWx0ID0gb2JqO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgcGF0aC5sZW5ndGgpIHtcbiAgICByZXN1bHQgPSByZXN1bHRbcGF0aFtpbmRleF1dO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU2V0cyBhIHZhbHVlIG9uIGFuIG9iamVjdCBhdCBhIG5lc3RlZCBwYXRoLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjcmVhdGUgb2JqZWN0cyBhbG9uZyB0aGUgcGF0aCBpZiBuZWNlc3NhcnkgdG8gYWxsb3dcbiAqIHNldHRpbmcgYSBkZWVwbHkgbmVzdGVkIHZhbHVlLlxuICpcbiAqIFJldHVybnMgYGZhbHNlYCBvbmx5IGlmIHRoZSBjdXJyZW50IHZhbHVlIGlzIGFscmVhZHkgc3RyaWN0bHkgZXF1YWwgdG8gdGhlXG4gKiByZXF1ZXN0ZWQgYHZhbHVlYCBhcmd1bWVudC4gT3RoZXJ3aXNlIHJldHVybnMgYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcFNldChvYmo6IGFueSwgcGF0aDogc3RyaW5nW10sIHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgbGV0IHB0ciA9IG9iajtcbiAgbGV0IHByb3AgPSBwYXRoLnBvcCgpIGFzIHN0cmluZztcbiAgbGV0IHNlZ21lbnQ7XG4gIGZvciAobGV0IGkgPSAwLCBsID0gcGF0aC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBzZWdtZW50ID0gcGF0aFtpXTtcbiAgICBpZiAocHRyW3NlZ21lbnRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHB0cltzZWdtZW50XSA9IHR5cGVvZiBzZWdtZW50ID09PSAnbnVtYmVyJyA/IFtdIDoge307XG4gICAgfVxuICAgIHB0ciA9IHB0cltzZWdtZW50XTtcbiAgfVxuICBpZiAocHRyW3Byb3BdID09PSB2YWx1ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBwdHJbcHJvcF0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEZpbmQgYW4gYXJyYXkgb2YgdmFsdWVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUga2V5cyBvZiBhbiBvYmplY3QuXG4gKlxuICogVGhpcyBpcyBhIHBvbnlmaWxsIGZvciBgT2JqZWN0LnZhbHVlc2AsIHdoaWNoIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdFZhbHVlcyhvYmo6IGFueSk6IGFueVtdIHtcbiAgaWYgKE9iamVjdC52YWx1ZXMpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhvYmopO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLm1hcCgoaykgPT4gb2JqW2tdKTtcbiAgfVxufVxuIl19
;