foop
Version:
interfaces that describe their intentions.
298 lines (281 loc) • 23.7 kB
JavaScript
/* eslint complexity: "OFF" */
var isObjNotNull = require('../is/objNotNull')
var isArray = require('../is/array')
var isTrue = require('../is/true')
var ObjectKeys = require('../util/keys')
var ObjectAssign = require('../util/assign')
var isUndefined = require('../is/undefined')
var isRegExp = require('../is/regexp')
var isDate = require('../is/date')
var isBoolean = require('../is/boolean')
var isString = require('../is/string')
var simpleKindOf = require('../util/simpleKindOf')
var includes = require('../conditional/includes/haystackNeedle')
var emptyTarget = require('./emptyTarget')
/**
* @desc 1: not null object
* 2: object toString is not a date or regex
*
* @category merge
* @memberOf dopemerge
*
* @since 2.0.0
* @param {*} x value to check
* @return {boolean}
*
* @example
*
* isMergeableObj({})
* //=> true
*
* isMergeableObj(Object.create(null))
* //=> true
*
* isMergeableObj(new Date())
* //=> false
*
* isMergeableObj(/eh/)
* //=> false
*
*/
function isMergeableObj(x) {
return isObjNotNull(x) && !isRegExp(x) && !isDate(x)
}
/**
* Defaults to `false`.
* If `clone` is `true` then both `x` and `y` are recursively cloned as part of the merge.
*
* @memberOf dopemerge
* @since 2.0.0
*
* @param {*} value value to clone if needed
* @param {DopeMergeOptions} optsArg dopemerge options, could contain .clone
* @return {Object | Array | any} cloned or original value
*
* @see emptyTarget
* @see isMergeableObj
*
* @example
*
* var obj = {eh: true}
*
* cloneIfNeeded(obj, {clone: true}) === obj
* //=> false
*
* cloneIfNeeded(obj, {clone: false}) === obj
* //=> true
*
*/
function cloneIfNeeded(value, optsArg) {
return isTrue(optsArg.clone) && isMergeableObj(value)
? deepmerge(emptyTarget(value), value, optsArg)
: value
}
/* prettier-ignore */
/**
* The merge will also merge arrays and array values by default.
* However, there are nigh-infinite valid ways to merge arrays,
* and you may want to supply your own.
* You can do this by passing an `arrayMerge` function as an option.
*
* @memberOf dopemerge
* @since 2.0.0
*
* @param {*} target array merged onto, could be emptyTarget if cloning
* @param {*} source original source array
* @param {*} optsArg dopemerge options
* @return {Array | *} merged array
*
* @example
*
* function concatMerge(destinationArray, sourceArray, options) {
* destinationArray
* //=> [1, 2, 3]
*
* sourceArray
* //=> [3, 2, 1]
*
* options
* //=> { arrayMerge: concatMerge }
*
* return destinationArray.concat(sourceArray)
* }
* merge([1, 2, 3], [3, 2, 1], { arrayMerge: concatMerge })
* //=> [1, 2, 3, 3, 2, 1]
*
*/
function defaultArrayMerge(target, source, optsArg) {
var destination = target.slice()
for (var i = 0; i < source.length; i++) {
var v = source[i]
if (isUndefined(destination[i])) {
destination[i] = cloneIfNeeded(v, optsArg)
}
else if (isMergeableObj(v)) {
destination[i] = deepmerge(target[i], v, optsArg)
}
// @see https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT
// === -1
// eslint-disable-next-line prefer-includes/prefer-includes
else if (!~target.indexOf(v)) {
destination.push(cloneIfNeeded(v, optsArg))
}
}
return destination
}
function mergeObj(target, source, optsArg) {
var destination = {}
if (isMergeableObj(target)) {
var targetKeys = ObjectKeys(target)
for (var k = 0; k < targetKeys.length; k++) {
destination[targetKeys[k]] = cloneIfNeeded(target[targetKeys[k]], optsArg)
}
}
var sourceKeys = ObjectKeys(source)
for (var s = 0; s < sourceKeys.length; s++) {
var key = sourceKeys[s]
if (!isMergeableObj(source[key]) || !target[key]) {
destination[key] = cloneIfNeeded(source[key], optsArg)
}
else {
destination[key] = deepmerge(target[key], source[key], optsArg)
}
}
return destination
}
function deepmerge(target, source, optsArg) {
if (isArray(source)) {
var arrayMerge = optsArg.arrayMerge;
return isArray(target)
? arrayMerge(target, source, optsArg)
: cloneIfNeeded(source, optsArg)
}
// else
return mergeObj(target, source, optsArg)
}
/* prettier-ignore */
/**
* Merge the enumerable attributes of two objects deeply.
* Merge two objects `x` and `y` deeply, returning a new merged object with the
* elements from both `x` and `y`.
* If an element at the same key is present for both `x` and `y`, the value from
* `y` will appear in the result.
* Merging creates a new object, so that neither `x` or `y` are be modified.
* However, child objects on `x` or `y` are copied over -
* if you want to copy all values, you must pass `true` to the clone option.
*
*
* @member dopemerge
* @category merge
*
* @param {*} obj1 left
* @param {*} obj2 right
* @param {*} opts dopemerge options
* @return {Object | Array | any} merged
*
* {@link https://github.com/facebook/immutable-js/blob/master/src/Map.js#L145 immutable-js-merge}
* {@link https://github.com/ramda/ramda/blob/master/src/merge.js ramda-merge}
* {@link https://github.com/lodash/lodash/blob/master/merge.js lodash-merge}
* {@link https://github.com/KyleAMathews/deepmerge deepmerge}
* @see {@link deepmerge}
*
* @types dopemerge
* @tests deepmerge
*
* @example
*
* var x = {
* foo: {bar: 3},
* array: [{
* does: 'work',
* too: [1, 2, 3],
* }],
* }
*
* var y = {
* foo: {baz: 4},
* quux: 5,
* array: [
* {
* does: 'work',
* too: [4, 5, 6],
* },
* {
* really: 'yes',
* },
* ],
* }
*
* var expected = {
* foo: {
* bar: 3,
* baz: 4,
* },
* array: [
* {
* does: 'work',
* too: [1, 2, 3, 4, 5, 6],
* },
* {
* really: 'yes',
* },
* ],
* quux: 5,
* }
*
* merge(x, y)
* //=> expected
*
*/
function dopemerge(obj1, obj2, opts) {
// if they are identical, fastest === check
if (obj1 === obj2) {
return obj1
}
// setup options
var options = ObjectAssign(
{
arrayMerge: defaultArrayMerge,
stringToArray: true,
boolToArray: false,
ignoreTypes: ['null', 'undefined'],
// debug: true,
},
opts
// || {}
)
var ignoreTypes = options.ignoreTypes;
var stringToArray = options.stringToArray;
var boolToArray = options.boolToArray;
var clone = options.clone;
// @NOTE: much better size but oh well
// const ignoreTypes = ['null', 'undefined']
// const stringToArray = true
// const boolToArray = false
// const clone = true
// @NOTE uglifier optimizes into a wicked ternary
// check one then check the other
if (isTrue(includes(ignoreTypes, simpleKindOf(obj1)))) {
return obj2
}
else if (isTrue(includes(ignoreTypes, simpleKindOf(obj2)))) {
return obj1
}
else if (isBoolean(obj1) && isBoolean(obj2)) {
return boolToArray ? [obj1, obj2] : obj2
}
else if (isString(obj1) && isString(obj2)) {
return stringToArray ? [obj1, obj2] : obj1 + obj2
}
else if (isArray(obj1) && isString(obj2)) {
return (clone ? obj1.slice(0) : obj1).concat([obj2])
}
else if (isString(obj1) && isArray(obj2)) {
return (clone ? obj2.slice(0) : obj2).concat([obj1])
}
else {
return deepmerge(obj1, obj2, options)
}
}
module.exports = dopemerge
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9wZW1lcmdlLmpzIiwic291cmNlcyI6WyJkb3BlbWVyZ2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IGNvbXBsZXhpdHk6IFwiT0ZGXCIgKi9cbmNvbnN0IGlzT2JqTm90TnVsbCA9IHJlcXVpcmUoJy4uL2lzL29iak5vdE51bGwnKVxuY29uc3QgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2lzL2FycmF5JylcbmNvbnN0IGlzVHJ1ZSA9IHJlcXVpcmUoJy4uL2lzL3RydWUnKVxuY29uc3QgT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL3V0aWwva2V5cycpXG5jb25zdCBPYmplY3RBc3NpZ24gPSByZXF1aXJlKCcuLi91dGlsL2Fzc2lnbicpXG5jb25zdCBpc1VuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2lzL3VuZGVmaW5lZCcpXG5jb25zdCBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4uL2lzL3JlZ2V4cCcpXG5jb25zdCBpc0RhdGUgPSByZXF1aXJlKCcuLi9pcy9kYXRlJylcbmNvbnN0IGlzQm9vbGVhbiA9IHJlcXVpcmUoJy4uL2lzL2Jvb2xlYW4nKVxuY29uc3QgaXNTdHJpbmcgPSByZXF1aXJlKCcuLi9pcy9zdHJpbmcnKVxuY29uc3Qgc2ltcGxlS2luZE9mID0gcmVxdWlyZSgnLi4vdXRpbC9zaW1wbGVLaW5kT2YnKVxuY29uc3QgaW5jbHVkZXMgPSByZXF1aXJlKCcuLi9jb25kaXRpb25hbC9pbmNsdWRlcy9oYXlzdGFja05lZWRsZScpXG5jb25zdCBlbXB0eVRhcmdldCA9IHJlcXVpcmUoJy4vZW1wdHlUYXJnZXQnKVxuXG4vKipcbiAqIEBkZXNjIDE6IG5vdCBudWxsIG9iamVjdFxuICogICAgICAgMjogb2JqZWN0IHRvU3RyaW5nIGlzIG5vdCBhIGRhdGUgb3IgcmVnZXhcbiAqXG4gKiBAY2F0ZWdvcnkgbWVyZ2VcbiAqIEBtZW1iZXJPZiBkb3BlbWVyZ2VcbiAqXG4gKiBAc2luY2UgMi4wLjBcbiAqIEBwYXJhbSB7Kn0geCB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgIGlzTWVyZ2VhYmxlT2JqKHt9KVxuICogICAgLy89PiB0cnVlXG4gKlxuICogICAgaXNNZXJnZWFibGVPYmooT2JqZWN0LmNyZWF0ZShudWxsKSlcbiAqICAgIC8vPT4gdHJ1ZVxuICpcbiAqICAgIGlzTWVyZ2VhYmxlT2JqKG5ldyBEYXRlKCkpXG4gKiAgICAvLz0+IGZhbHNlXG4gKlxuICogICAgaXNNZXJnZWFibGVPYmooL2VoLylcbiAqICAgIC8vPT4gZmFsc2VcbiAqXG4gKi9cbmZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqKHgpIHtcbiAgcmV0dXJuIGlzT2JqTm90TnVsbCh4KSAmJiAhaXNSZWdFeHAoeCkgJiYgIWlzRGF0ZSh4KVxufVxuXG4vKipcbiAqIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gKiBJZiBgY2xvbmVgIGlzIGB0cnVlYCB0aGVuIGJvdGggYHhgIGFuZCBgeWAgYXJlIHJlY3Vyc2l2ZWx5IGNsb25lZCBhcyBwYXJ0IG9mIHRoZSBtZXJnZS5cbiAqXG4gKiBAbWVtYmVyT2YgZG9wZW1lcmdlXG4gKiBAc2luY2UgMi4wLjBcbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlIHZhbHVlIHRvIGNsb25lIGlmIG5lZWRlZFxuICogQHBhcmFtIHtEb3BlTWVyZ2VPcHRpb25zfSBvcHRzQXJnIGRvcGVtZXJnZSBvcHRpb25zLCBjb3VsZCBjb250YWluIC5jbG9uZVxuICogQHJldHVybiB7T2JqZWN0IHwgQXJyYXkgfCBhbnl9IGNsb25lZCBvciBvcmlnaW5hbCB2YWx1ZVxuICpcbiAqIEBzZWUgZW1wdHlUYXJnZXRcbiAqIEBzZWUgaXNNZXJnZWFibGVPYmpcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmogPSB7ZWg6IHRydWV9XG4gKlxuICogY2xvbmVJZk5lZWRlZChvYmosIHtjbG9uZTogdHJ1ZX0pID09PSBvYmpcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBjbG9uZUlmTmVlZGVkKG9iaiwge2Nsb25lOiBmYWxzZX0pID09PSBvYmpcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqL1xuZnVuY3Rpb24gY2xvbmVJZk5lZWRlZCh2YWx1ZSwgb3B0c0FyZykge1xuICByZXR1cm4gaXNUcnVlKG9wdHNBcmcuY2xvbmUpICYmIGlzTWVyZ2VhYmxlT2JqKHZhbHVlKVxuICAgID8gZGVlcG1lcmdlKGVtcHR5VGFyZ2V0KHZhbHVlKSwgdmFsdWUsIG9wdHNBcmcpXG4gICAgOiB2YWx1ZVxufVxuXG4vKiBwcmV0dGllci1pZ25vcmUgKi9cbi8qKlxuICogVGhlIG1lcmdlIHdpbGwgYWxzbyBtZXJnZSBhcnJheXMgYW5kIGFycmF5IHZhbHVlcyBieSBkZWZhdWx0LlxuICogSG93ZXZlciwgdGhlcmUgYXJlIG5pZ2gtaW5maW5pdGUgdmFsaWQgd2F5cyB0byBtZXJnZSBhcnJheXMsXG4gKiBhbmQgeW91IG1heSB3YW50IHRvIHN1cHBseSB5b3VyIG93bi5cbiAqIFlvdSBjYW4gZG8gdGhpcyBieSBwYXNzaW5nIGFuIGBhcnJheU1lcmdlYCBmdW5jdGlvbiBhcyBhbiBvcHRpb24uXG4gKlxuICogQG1lbWJlck9mIGRvcGVtZXJnZVxuICogQHNpbmNlIDIuMC4wXG4gKlxuICogQHBhcmFtIHsqfSB0YXJnZXQgYXJyYXkgbWVyZ2VkIG9udG8sIGNvdWxkIGJlIGVtcHR5VGFyZ2V0IGlmIGNsb25pbmdcbiAqIEBwYXJhbSB7Kn0gc291cmNlIG9yaWdpbmFsIHNvdXJjZSBhcnJheVxuICogQHBhcmFtIHsqfSBvcHRzQXJnIGRvcGVtZXJnZSBvcHRpb25zXG4gKiBAcmV0dXJuIHtBcnJheSB8ICp9IG1lcmdlZCBhcnJheVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgZnVuY3Rpb24gY29uY2F0TWVyZ2UoZGVzdGluYXRpb25BcnJheSwgc291cmNlQXJyYXksIG9wdGlvbnMpIHtcbiAqICAgICAgZGVzdGluYXRpb25BcnJheVxuICogICAgICAvLz0+IFsxLCAyLCAzXVxuICpcbiAqICAgICAgc291cmNlQXJyYXlcbiAqICAgICAgLy89PiBbMywgMiwgMV1cbiAqXG4gKiAgICAgIG9wdGlvbnNcbiAqICAgICAgLy89PiB7IGFycmF5TWVyZ2U6IGNvbmNhdE1lcmdlIH1cbiAqXG4gKiAgICAgIHJldHVybiBkZXN0aW5hdGlvbkFycmF5LmNvbmNhdChzb3VyY2VBcnJheSlcbiAqICAgIH1cbiAqICAgIG1lcmdlKFsxLCAyLCAzXSwgWzMsIDIsIDFdLCB7IGFycmF5TWVyZ2U6IGNvbmNhdE1lcmdlIH0pXG4gKiAgICAvLz0+IFsxLCAyLCAzLCAzLCAyLCAxXVxuICpcbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEFycmF5TWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdHNBcmcpIHtcbiAgdmFyIGRlc3RpbmF0aW9uID0gdGFyZ2V0LnNsaWNlKClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciB2ID0gc291cmNlW2ldXG5cbiAgICBpZiAoaXNVbmRlZmluZWQoZGVzdGluYXRpb25baV0pKSB7XG4gICAgICBkZXN0aW5hdGlvbltpXSA9IGNsb25lSWZOZWVkZWQodiwgb3B0c0FyZylcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNNZXJnZWFibGVPYmoodikpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2ldID0gZGVlcG1lcmdlKHRhcmdldFtpXSwgdiwgb3B0c0FyZylcbiAgICB9XG4gICAgLy8gQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvQml0d2lzZV9PcGVyYXRvcnMjQml0d2lzZV9OT1RcbiAgICAvLyA9PT0gLTFcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWluY2x1ZGVzL3ByZWZlci1pbmNsdWRlc1xuICAgIGVsc2UgaWYgKCF+dGFyZ2V0LmluZGV4T2YodikpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goY2xvbmVJZk5lZWRlZCh2LCBvcHRzQXJnKSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVzdGluYXRpb25cbn1cblxuZnVuY3Rpb24gbWVyZ2VPYmoodGFyZ2V0LCBzb3VyY2UsIG9wdHNBcmcpIHtcbiAgdmFyIGRlc3RpbmF0aW9uID0ge31cbiAgaWYgKGlzTWVyZ2VhYmxlT2JqKHRhcmdldCkpIHtcbiAgICB2YXIgdGFyZ2V0S2V5cyA9IE9iamVjdEtleXModGFyZ2V0KVxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGFyZ2V0S2V5cy5sZW5ndGg7IGsrKykge1xuICAgICAgZGVzdGluYXRpb25bdGFyZ2V0S2V5c1trXV0gPSBjbG9uZUlmTmVlZGVkKHRhcmdldFt0YXJnZXRLZXlzW2tdXSwgb3B0c0FyZylcbiAgICB9XG4gIH1cblxuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdEtleXMoc291cmNlKVxuICBmb3IgKHZhciBzID0gMDsgcyA8IHNvdXJjZUtleXMubGVuZ3RoOyBzKyspIHtcbiAgICB2YXIga2V5ID0gc291cmNlS2V5c1tzXVxuICAgIGlmICghaXNNZXJnZWFibGVPYmooc291cmNlW2tleV0pIHx8ICF0YXJnZXRba2V5XSkge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGNsb25lSWZOZWVkZWQoc291cmNlW2tleV0sIG9wdHNBcmcpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGRlZXBtZXJnZSh0YXJnZXRba2V5XSwgc291cmNlW2tleV0sIG9wdHNBcmcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlc3RpbmF0aW9uXG59XG5cbmZ1bmN0aW9uIGRlZXBtZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0c0FyZykge1xuICBpZiAoaXNBcnJheShzb3VyY2UpKSB7XG4gICAgY29uc3Qge2FycmF5TWVyZ2V9ID0gb3B0c0FyZ1xuICAgIHJldHVybiBpc0FycmF5KHRhcmdldClcbiAgICAgID8gYXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0c0FyZylcbiAgICAgIDogY2xvbmVJZk5lZWRlZChzb3VyY2UsIG9wdHNBcmcpXG4gIH1cblxuICAvLyBlbHNlXG4gIHJldHVybiBtZXJnZU9iaih0YXJnZXQsIHNvdXJjZSwgb3B0c0FyZylcbn1cblxuLyogcHJldHRpZXItaWdub3JlICovXG4vKipcbiAqICBNZXJnZSB0aGUgZW51bWVyYWJsZSBhdHRyaWJ1dGVzIG9mIHR3byBvYmplY3RzIGRlZXBseS5cbiAqICBNZXJnZSB0d28gb2JqZWN0cyBgeGAgYW5kIGB5YCBkZWVwbHksIHJldHVybmluZyBhIG5ldyBtZXJnZWQgb2JqZWN0IHdpdGggdGhlXG4gKiAgZWxlbWVudHMgZnJvbSBib3RoIGB4YCBhbmQgYHlgLlxuICogIElmIGFuIGVsZW1lbnQgYXQgdGhlIHNhbWUga2V5IGlzIHByZXNlbnQgZm9yIGJvdGggYHhgIGFuZCBgeWAsIHRoZSB2YWx1ZSBmcm9tXG4gKiBgeWAgd2lsbCBhcHBlYXIgaW4gdGhlIHJlc3VsdC5cbiAqICBNZXJnaW5nIGNyZWF0ZXMgYSBuZXcgb2JqZWN0LCBzbyB0aGF0IG5laXRoZXIgYHhgIG9yIGB5YCBhcmUgYmUgbW9kaWZpZWQuXG4gKiAgSG93ZXZlciwgY2hpbGQgb2JqZWN0cyBvbiBgeGAgb3IgYHlgIGFyZSBjb3BpZWQgb3ZlciAtXG4gKiAgaWYgeW91IHdhbnQgdG8gY29weSBhbGwgdmFsdWVzLCB5b3UgbXVzdCBwYXNzIGB0cnVlYCB0byB0aGUgY2xvbmUgb3B0aW9uLlxuICpcbiAqXG4gKiBAbWVtYmVyIGRvcGVtZXJnZVxuICogQGNhdGVnb3J5IG1lcmdlXG4gKlxuICogQHBhcmFtIHsqfSBvYmoxIGxlZnRcbiAqIEBwYXJhbSB7Kn0gb2JqMiByaWdodFxuICogQHBhcmFtIHsqfSBvcHRzIGRvcGVtZXJnZSBvcHRpb25zXG4gKiBAcmV0dXJuIHtPYmplY3QgfCBBcnJheSB8IGFueX0gbWVyZ2VkXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9pbW11dGFibGUtanMvYmxvYi9tYXN0ZXIvc3JjL01hcC5qcyNMMTQ1IGltbXV0YWJsZS1qcy1tZXJnZX1cbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vcmFtZGEvcmFtZGEvYmxvYi9tYXN0ZXIvc3JjL21lcmdlLmpzIHJhbWRhLW1lcmdlfVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvbWFzdGVyL21lcmdlLmpzIGxvZGFzaC1tZXJnZX1cbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vS3lsZUFNYXRoZXdzL2RlZXBtZXJnZSBkZWVwbWVyZ2V9XG4gKiBAc2VlIHtAbGluayBkZWVwbWVyZ2V9XG4gKlxuICogQHR5cGVzIGRvcGVtZXJnZVxuICogQHRlc3RzIGRlZXBtZXJnZVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgdmFyIHggPSB7XG4gKiAgICAgIGZvbzoge2JhcjogM30sXG4gKiAgICAgIGFycmF5OiBbe1xuICogICAgICAgIGRvZXM6ICd3b3JrJyxcbiAqICAgICAgICB0b286IFsxLCAyLCAzXSxcbiAqICAgICAgfV0sXG4gKiAgICB9XG4gKlxuICogICAgdmFyIHkgPSB7XG4gKiAgICAgIGZvbzoge2JhejogNH0sXG4gKiAgICAgIHF1dXg6IDUsXG4gKiAgICAgIGFycmF5OiBbXG4gKiAgICAgICAge1xuICogICAgICAgICAgZG9lczogJ3dvcmsnLFxuICogICAgICAgICAgdG9vOiBbNCwgNSwgNl0sXG4gKiAgICAgICAgfSxcbiAqICAgICAgICB7XG4gKiAgICAgICAgICByZWFsbHk6ICd5ZXMnLFxuICogICAgICAgIH0sXG4gKiAgICAgIF0sXG4gKiAgICB9XG4gKlxuICogICAgdmFyIGV4cGVjdGVkID0ge1xuICogICAgICBmb286IHtcbiAqICAgICAgICBiYXI6IDMsXG4gKiAgICAgICAgYmF6OiA0LFxuICogICAgICB9LFxuICogICAgICBhcnJheTogW1xuICogICAgICAgIHtcbiAqICAgICAgICAgIGRvZXM6ICd3b3JrJyxcbiAqICAgICAgICAgIHRvbzogWzEsIDIsIDMsIDQsIDUsIDZdLFxuICogICAgICAgIH0sXG4gKiAgICAgICAge1xuICogICAgICAgICAgcmVhbGx5OiAneWVzJyxcbiAqICAgICAgICB9LFxuICogICAgICBdLFxuICogICAgICBxdXV4OiA1LFxuICogICAgfVxuICpcbiAqICAgIG1lcmdlKHgsIHkpXG4gKiAgICAvLz0+IGV4cGVjdGVkXG4gKlxuICovXG5mdW5jdGlvbiBkb3BlbWVyZ2Uob2JqMSwgb2JqMiwgb3B0cykge1xuICAvLyBpZiB0aGV5IGFyZSBpZGVudGljYWwsIGZhc3Rlc3QgPT09IGNoZWNrXG4gIGlmIChvYmoxID09PSBvYmoyKSB7XG4gICAgcmV0dXJuIG9iajFcbiAgfVxuXG4gIC8vIHNldHVwIG9wdGlvbnNcbiAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdEFzc2lnbihcbiAgICB7XG4gICAgICBhcnJheU1lcmdlOiBkZWZhdWx0QXJyYXlNZXJnZSxcbiAgICAgIHN0cmluZ1RvQXJyYXk6IHRydWUsXG4gICAgICBib29sVG9BcnJheTogZmFsc2UsXG4gICAgICBpZ25vcmVUeXBlczogWydudWxsJywgJ3VuZGVmaW5lZCddLFxuICAgICAgLy8gZGVidWc6IHRydWUsXG4gICAgfSxcbiAgICBvcHRzXG4gICAgLy8gfHwge31cbiAgKVxuICBjb25zdCB7aWdub3JlVHlwZXMsIHN0cmluZ1RvQXJyYXksIGJvb2xUb0FycmF5LCBjbG9uZX0gPSBvcHRpb25zXG5cbiAgLy8gQE5PVEU6IG11Y2ggYmV0dGVyIHNpemUgYnV0IG9oIHdlbGxcbiAgLy8gY29uc3QgaWdub3JlVHlwZXMgPSBbJ251bGwnLCAndW5kZWZpbmVkJ11cbiAgLy8gY29uc3Qgc3RyaW5nVG9BcnJheSA9IHRydWVcbiAgLy8gY29uc3QgYm9vbFRvQXJyYXkgPSBmYWxzZVxuICAvLyBjb25zdCBjbG9uZSA9IHRydWVcblxuICAvLyBATk9URSB1Z2xpZmllciBvcHRpbWl6ZXMgaW50byBhIHdpY2tlZCB0ZXJuYXJ5XG4gIC8vIGNoZWNrIG9uZSB0aGVuIGNoZWNrIHRoZSBvdGhlclxuICBpZiAoaXNUcnVlKGluY2x1ZGVzKGlnbm9yZVR5cGVzLCBzaW1wbGVLaW5kT2Yob2JqMSkpKSkge1xuICAgIHJldHVybiBvYmoyXG4gIH1cbiAgZWxzZSBpZiAoaXNUcnVlKGluY2x1ZGVzKGlnbm9yZVR5cGVzLCBzaW1wbGVLaW5kT2Yob2JqMikpKSkge1xuICAgIHJldHVybiBvYmoxXG4gIH1cbiAgZWxzZSBpZiAoaXNCb29sZWFuKG9iajEpICYmIGlzQm9vbGVhbihvYmoyKSkge1xuICAgIHJldHVybiBib29sVG9BcnJheSA/IFtvYmoxLCBvYmoyXSA6IG9iajJcbiAgfVxuICBlbHNlIGlmIChpc1N0cmluZyhvYmoxKSAmJiBpc1N0cmluZyhvYmoyKSkge1xuICAgIHJldHVybiBzdHJpbmdUb0FycmF5ID8gW29iajEsIG9iajJdIDogb2JqMSArIG9iajJcbiAgfVxuICBlbHNlIGlmIChpc0FycmF5KG9iajEpICYmIGlzU3RyaW5nKG9iajIpKSB7XG4gICAgcmV0dXJuIChjbG9uZSA/IG9iajEuc2xpY2UoMCkgOiBvYmoxKS5jb25jYXQoW29iajJdKVxuICB9XG4gIGVsc2UgaWYgKGlzU3RyaW5nKG9iajEpICYmIGlzQXJyYXkob2JqMikpIHtcbiAgICByZXR1cm4gKGNsb25lID8gb2JqMi5zbGljZSgwKSA6IG9iajIpLmNvbmNhdChbb2JqMV0pXG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIGRlZXBtZXJnZShvYmoxLCBvYmoyLCBvcHRpb25zKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZG9wZW1lcmdlXG4iXSwibmFtZXMiOlsiY29uc3QiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0FBLEdBQUssQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0FBQ2hEQSxHQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdENBLEdBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUNwQ0EsR0FBSyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMs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