UNPKG

foop

Version:

interfaces that describe their intentions.

266 lines (247 loc) 21.8 kB
/** * @since 4.0.0 <- moved out of the store, into scoped * @since 1.0.0 * @desc library of validators to use by name * @modifies this.validators * @param {Object} validators */ var ChainedMap = require('../../ChainedMapBase') var ENV_DEBUG = require('../env/debug') var is = require('../is/_core') var isString = require('../is/string') var isFunction = require('../is/function') var dopemerge = require('../dopemerge') var camelCase = require('../string/camelCase') var not = require('../conditional/not') var or = require('../conditional/or') var isArrayOf = require('../is/arrayOf') var isNotRealOrIsEmpty = require('../is/notRealOrIsEmpty') var replace = require('../fp/replace') var validators = new ChainedMap() // eslint-disable-next-line var stripArithmeticSymbols = replace(/[?\[\]!\|]/g, '') var escapedKey = function (x) { return camelCase('is-' + x); } var enummy = function (enums) { return function (x) { return enums === x || enums.includes(x); }; } // @TODO: .remap!!! // @TODO: can use these to return noops with error logging on development var get = function (key) { return validators.get(key) || validators.get(escapedKey(key)) || enummy(key); } var has = function (key) { return validators.has(key) || validators.get(escapedKey(key)); } var set = function (key, value) { return validators.set(key, value); } var doesNotHave = not(has) /** * @desc add custom types for validation * @category types * @category schema * @types schema * * @since 4.0.0 <- used with schema, used in method chain * @since 3.0.0 <- took out * @since 1.0.0 * * @param {Object} types custom Types * * @see deps/validators/validatorFactory * * @example * * addTypes({yaya: x => typeof x === 'string'}) * * const chain = new Chain().methods('eh').type('yaya').build() * * chain.eh('good') * //=> chain * * chain.eh(!!'throws') * //=> TypeError(false != {yaya: x => typeof x === 'string'}) * * @example * * const custom = {} * custom.enums = enums => x => enums.includes(x) * custom['*'] = x => true * addTypes(custom) * //-> void * * new Chain().methods('eh').type('*').build().eh * //=> validateType(custom['*']) * */ var addTypes = function (types) { return validators.from(dopemerge(validators.entries(), types)); } addTypes(is) var includesAndOr = function (x) { return x.includes('|') || x.includes('&'); } /** * @memberOf schema * @category types * * @param {string} fullKey a key with `|` and/or '&' * @return {Function} validator * * @example * * const isStringOrNumber = typeListFactory('string|number') * * isStringOrNumber(1) * //=> true * isStringOrNumber('one') * //=> true * isStringOrNumber(Object) * //=> false * */ function typeListFactory(fullKey) { // already have it if (has(fullKey)) { return get(fullKey) } // get all types var orTypes = fullKey.split('|') var andTypes = fullKey.split('&') // ensure we have all validators - sets up conditionals for (var v = 0; v < orTypes.length; v++) { builder(orTypes[v]) } // go through all valid options, if any are true, good to go set(fullKey, function (x) { for (var v = 0; v < orTypes.length; v++) { if (get(orTypes[v])(x)) { return true } } return false }) return get(fullKey) } // @TODO how to iterate properly with the bitwise fn + AND // add another param? ignore overly complex |& things? just allow 1? // just show how to use these shorthand fn builders /** * @desc transform arithmetic strings into types * @since 4.0.0-alpha.1 * @category types * * @param {Matchable} fullKey arithmetic type key * @return {Matchable} function to match with, with .inspect for easy debugging * * @types schema * @test typed * @test schema * @see is * @todo coercing values to certain types: arithmeticTypeFactory('<value>') * * @example * * arithmeticTypeFactory('?string') * //=> x => !isReal(x) || isString(x) * * @example * * arithmeticTypeFactory('?string|string[]') * //=> x => isString(x) || isArrayOf(isString)(x) * * @example * * arithmeticTypeFactory('!string') * //=> x => not(isString)(x) * * @example * * types.addTypes({star: x => true}) * arithmeticTypeFactory('object|function|star') * //=> x => isObj(x) || isFunction(x) || isStar(x) * * @example * * arithmeticTypeFactory('===') * //=> x => (['===']).includes(x) */ function arithmeticTypeFactory(fullKey) { var key = stripArithmeticSymbols(fullKey) var fn = get(key) var optionalType = "?" + key var typeOrArrayOrType = key + "[]" var notType = "!" + key var isValidOrNotRealOrEmptyStr = or(fn, isNotRealOrIsEmpty) var isValidOrArrayOfValid = or(fn, isArrayOf(fn)) if (doesNotHave(optionalType)) { set(optionalType, isValidOrNotRealOrEmptyStr) } if (doesNotHave(typeOrArrayOrType)) { set(typeOrArrayOrType, isValidOrArrayOfValid) } if (doesNotHave(notType)) { set(notType, not(fn)) } return get(fullKey) } // ---- // ; function split // ---- // v- annoying on comments with ifs /* prettier-ignore */ /** * @desc @pattern @builder -> builds using multiple factories depending on conditons * or abstractFactory whatever * opinionated: if it's a function, it's a validator... * * @category types * @since 4.0.0 * @param {string | Function | Primitive} fullKey arithmetic key to the validator * @return {Function} validator * * @see https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Default_parameters * @NOTE if/else is for uglifying ternaries, even though else if is not needed * @NOTE if key is number, iterating the array * * @example * * // functionType * const isString = x => typeof x === 'string' * builder(isString) * //=> isString * * @example * * // stringType (built in, or custom-keyed validator, or eqeqeq) * builder('string') * //=> isString * * const enummy = builder('enum') * //=> x => ['enum'].includes(x) * * @example * * // arithmeticType * builder('string|string[]') * //=> isString || isArrayOf(isString) * */ function builder(fullKey) { if (isFunction(fullKey)) { /* istanbul ignore next: dev */ if (ENV_DEBUG) { console.log('functionType', {fullKey: fullKey}) } return fullKey } else if (isString(fullKey) && includesAndOr(fullKey)) { /* istanbul ignore next: dev */ if (ENV_DEBUG) { console.log('andOrType', {fullKey: fullKey}) } return typeListFactory(fullKey) } else { /* istanbul ignore next: dev */ if (ENV_DEBUG) { console.log('arithmeticType', {fullKey: fullKey}, arithmeticTypeFactory(fullKey)) } return arithmeticTypeFactory(fullKey) } } builder.has = has builder.get = get builder.set = set builder.addTypes = addTypes // was merge builder.map = validators module.exports = builder //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yQnVpbGRlci5qcyIsInNvdXJjZXMiOlsidmFsaWRhdG9yQnVpbGRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBzaW5jZSA0LjAuMCA8LSBtb3ZlZCBvdXQgb2YgdGhlIHN0b3JlLCBpbnRvIHNjb3BlZFxuICogQHNpbmNlIDEuMC4wXG4gKiBAZGVzYyBsaWJyYXJ5IG9mIHZhbGlkYXRvcnMgdG8gdXNlIGJ5IG5hbWVcbiAqICAgICAgIEBtb2RpZmllcyB0aGlzLnZhbGlkYXRvcnNcbiAqIEBwYXJhbSAge09iamVjdH0gdmFsaWRhdG9yc1xuICovXG5jb25zdCBDaGFpbmVkTWFwID0gcmVxdWlyZSgnLi4vLi4vQ2hhaW5lZE1hcEJhc2UnKVxuY29uc3QgRU5WX0RFQlVHID0gcmVxdWlyZSgnLi4vZW52L2RlYnVnJylcbmNvbnN0IGlzID0gcmVxdWlyZSgnLi4vaXMvX2NvcmUnKVxuY29uc3QgaXNTdHJpbmcgPSByZXF1aXJlKCcuLi9pcy9zdHJpbmcnKVxuY29uc3QgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2lzL2Z1bmN0aW9uJylcbmNvbnN0IGRvcGVtZXJnZSA9IHJlcXVpcmUoJy4uL2RvcGVtZXJnZScpXG5jb25zdCBjYW1lbENhc2UgPSByZXF1aXJlKCcuLi9zdHJpbmcvY2FtZWxDYXNlJylcbmNvbnN0IG5vdCA9IHJlcXVpcmUoJy4uL2NvbmRpdGlvbmFsL25vdCcpXG5jb25zdCBvciA9IHJlcXVpcmUoJy4uL2NvbmRpdGlvbmFsL29yJylcbmNvbnN0IGlzQXJyYXlPZiA9IHJlcXVpcmUoJy4uL2lzL2FycmF5T2YnKVxuY29uc3QgaXNOb3RSZWFsT3JJc0VtcHR5ID0gcmVxdWlyZSgnLi4vaXMvbm90UmVhbE9ySXNFbXB0eScpXG5jb25zdCByZXBsYWNlID0gcmVxdWlyZSgnLi4vZnAvcmVwbGFjZScpXG5cbmxldCB2YWxpZGF0b3JzID0gbmV3IENoYWluZWRNYXAoKVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IHN0cmlwQXJpdGhtZXRpY1N5bWJvbHMgPSByZXBsYWNlKC9bP1xcW1xcXSFcXHxdL2csICcnKVxuY29uc3QgZXNjYXBlZEtleSA9IHggPT4gY2FtZWxDYXNlKCdpcy0nICsgeClcbmNvbnN0IGVudW1teSA9IGVudW1zID0+IHggPT4gZW51bXMgPT09IHggfHwgZW51bXMuaW5jbHVkZXMoeClcblxuLy8gQFRPRE86IC5yZW1hcCEhIVxuLy8gQFRPRE86IGNhbiB1c2UgdGhlc2UgdG8gcmV0dXJuIG5vb3BzIHdpdGggZXJyb3IgbG9nZ2luZyBvbiBkZXZlbG9wbWVudFxuY29uc3QgZ2V0ID0ga2V5ID0+XG4gIHZhbGlkYXRvcnMuZ2V0KGtleSkgfHwgdmFsaWRhdG9ycy5nZXQoZXNjYXBlZEtleShrZXkpKSB8fCBlbnVtbXkoa2V5KVxuY29uc3QgaGFzID0ga2V5ID0+IHZhbGlkYXRvcnMuaGFzKGtleSkgfHwgdmFsaWRhdG9ycy5nZXQoZXNjYXBlZEtleShrZXkpKVxuY29uc3Qgc2V0ID0gKGtleSwgdmFsdWUpID0+IHZhbGlkYXRvcnMuc2V0KGtleSwgdmFsdWUpXG5jb25zdCBkb2VzTm90SGF2ZSA9IG5vdChoYXMpXG5cbi8qKlxuICogQGRlc2MgYWRkIGN1c3RvbSB0eXBlcyBmb3IgdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IHR5cGVzXG4gKiBAY2F0ZWdvcnkgc2NoZW1hXG4gKiBAdHlwZXMgc2NoZW1hXG4gKlxuICogQHNpbmNlIDQuMC4wIDwtIHVzZWQgd2l0aCBzY2hlbWEsIHVzZWQgaW4gbWV0aG9kIGNoYWluXG4gKiBAc2luY2UgMy4wLjAgPC0gdG9vayBvdXRcbiAqIEBzaW5jZSAxLjAuMFxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gdHlwZXMgY3VzdG9tIFR5cGVzXG4gKlxuICogQHNlZSBkZXBzL3ZhbGlkYXRvcnMvdmFsaWRhdG9yRmFjdG9yeVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICBhZGRUeXBlcyh7eWF5YTogeCA9PiB0eXBlb2YgeCA9PT0gJ3N0cmluZyd9KVxuICpcbiAqICAgY29uc3QgY2hhaW4gPSBuZXcgQ2hhaW4oKS5tZXRob2RzKCdlaCcpLnR5cGUoJ3lheWEnKS5idWlsZCgpXG4gKlxuICogICBjaGFpbi5laCgnZ29vZCcpXG4gKiAgIC8vPT4gY2hhaW5cbiAqXG4gKiAgIGNoYWluLmVoKCEhJ3Rocm93cycpXG4gKiAgIC8vPT4gVHlwZUVycm9yKGZhbHNlICE9IHt5YXlhOiB4ID0+IHR5cGVvZiB4ID09PSAnc3RyaW5nJ30pXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgIGNvbnN0IGN1c3RvbSA9IHt9XG4gKiAgIGN1c3RvbS5lbnVtcyA9IGVudW1zID0+IHggPT4gZW51bXMuaW5jbHVkZXMoeClcbiAqICAgY3VzdG9tWycqJ10gPSB4ID0+IHRydWVcbiAqICAgYWRkVHlwZXMoY3VzdG9tKVxuICogICAvLy0+IHZvaWRcbiAqXG4gKiAgIG5ldyBDaGFpbigpLm1ldGhvZHMoJ2VoJykudHlwZSgnKicpLmJ1aWxkKCkuZWhcbiAqICAgLy89PiB2YWxpZGF0ZVR5cGUoY3VzdG9tWycqJ10pXG4gKlxuICovXG5jb25zdCBhZGRUeXBlcyA9IHR5cGVzID0+XG4gIHZhbGlkYXRvcnMuZnJvbShkb3BlbWVyZ2UodmFsaWRhdG9ycy5lbnRyaWVzKCksIHR5cGVzKSlcblxuYWRkVHlwZXMoaXMpXG5cbmNvbnN0IGluY2x1ZGVzQW5kT3IgPSB4ID0+IHguaW5jbHVkZXMoJ3wnKSB8fCB4LmluY2x1ZGVzKCcmJylcblxuLyoqXG4gKiBAbWVtYmVyT2Ygc2NoZW1hXG4gKiBAY2F0ZWdvcnkgdHlwZXNcbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGZ1bGxLZXkgYSBrZXkgd2l0aCBgfGAgYW5kL29yICcmJ1xuICogQHJldHVybiB7RnVuY3Rpb259IHZhbGlkYXRvclxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgY29uc3QgaXNTdHJpbmdPck51bWJlciA9IHR5cGVMaXN0RmFjdG9yeSgnc3RyaW5nfG51bWJlcicpXG4gKlxuICogICAgaXNTdHJpbmdPck51bWJlcigxKVxuICogICAgLy89PiB0cnVlXG4gKiAgICBpc1N0cmluZ09yTnVtYmVyKCdvbmUnKVxuICogICAgLy89PiB0cnVlXG4gKiAgICBpc1N0cmluZ09yTnVtYmVyKE9iamVjdClcbiAqICAgIC8vPT4gZmFsc2VcbiAqXG4gKi9cbmZ1bmN0aW9uIHR5cGVMaXN0RmFjdG9yeShmdWxsS2V5KSB7XG4gIC8vIGFscmVhZHkgaGF2ZSBpdFxuICBpZiAoaGFzKGZ1bGxLZXkpKSB7XG4gICAgcmV0dXJuIGdldChmdWxsS2V5KVxuICB9XG5cbiAgLy8gZ2V0IGFsbCB0eXBlc1xuICBsZXQgb3JUeXBlcyA9IGZ1bGxLZXkuc3BsaXQoJ3wnKVxuICBsZXQgYW5kVHlwZXMgPSBmdWxsS2V5LnNwbGl0KCcmJylcblxuICAvLyBlbnN1cmUgd2UgaGF2ZSBhbGwgdmFsaWRhdG9ycyAtIHNldHMgdXAgY29uZGl0aW9uYWxzXG4gIGZvciAobGV0IHYgPSAwOyB2IDwgb3JUeXBlcy5sZW5ndGg7IHYrKykge1xuICAgIGJ1aWxkZXIob3JUeXBlc1t2XSlcbiAgfVxuXG4gIC8vIGdvIHRocm91Z2ggYWxsIHZhbGlkIG9wdGlvbnMsIGlmIGFueSBhcmUgdHJ1ZSwgZ29vZCB0byBnb1xuICBzZXQoZnVsbEtleSwgeCA9PiB7XG4gICAgZm9yIChsZXQgdiA9IDA7IHYgPCBvclR5cGVzLmxlbmd0aDsgdisrKSB7XG4gICAgICBpZiAoZ2V0KG9yVHlwZXNbdl0pKHgpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9KVxuXG4gIHJldHVybiBnZXQoZnVsbEtleSlcbn1cblxuLy8gQFRPRE8gaG93IHRvIGl0ZXJhdGUgcHJvcGVybHkgd2l0aCB0aGUgYml0d2lzZSBmbiArIEFORFxuLy8gICAgICAgYWRkIGFub3RoZXIgcGFyYW0/IGlnbm9yZSBvdmVybHkgY29tcGxleCB8JiB0aGluZ3M/IGp1c3QgYWxsb3cgMT9cbi8vICAgICAgIGp1c3Qgc2hvdyBob3cgdG8gdXNlIHRoZXNlIHNob3J0aGFuZCBmbiBidWlsZGVyc1xuXG4vKipcbiAqIEBkZXNjIHRyYW5zZm9ybSBhcml0aG1ldGljIHN0cmluZ3MgaW50byB0eXBlc1xuICogQHNpbmNlIDQuMC4wLWFscGhhLjFcbiAqIEBjYXRlZ29yeSB0eXBlc1xuICpcbiAqIEBwYXJhbSAge01hdGNoYWJsZX0gZnVsbEtleSBhcml0aG1ldGljIHR5cGUga2V5XG4gKiBAcmV0dXJuIHtNYXRjaGFibGV9IGZ1bmN0aW9uIHRvIG1hdGNoIHdpdGgsIHdpdGggLmluc3BlY3QgZm9yIGVhc3kgZGVidWdnaW5nXG4gKlxuICogQHR5cGVzIHNjaGVtYVxuICogQHRlc3QgdHlwZWRcbiAqIEB0ZXN0IHNjaGVtYVxuICogQHNlZSBpc1xuICogQHRvZG8gY29lcmNpbmcgdmFsdWVzIHRvIGNlcnRhaW4gdHlwZXM6IGFyaXRobWV0aWNUeXBlRmFjdG9yeSgnPHZhbHVlPicpXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgIGFyaXRobWV0aWNUeXBlRmFjdG9yeSgnP3N0cmluZycpXG4gKiAgIC8vPT4geCA9PiAhaXNSZWFsKHgpIHx8IGlzU3RyaW5nKHgpXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgIGFyaXRobWV0aWNUeXBlRmFjdG9yeSgnP3N0cmluZ3xzdHJpbmdbXScpXG4gKiAgIC8vPT4geCA9PiBpc1N0cmluZyh4KSB8fCBpc0FycmF5T2YoaXNTdHJpbmcpKHgpXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgIGFyaXRobWV0aWNUeXBlRmFjdG9yeSgnIXN0cmluZycpXG4gKiAgIC8vPT4geCA9PiBub3QoaXNTdHJpbmcpKHgpXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgIHR5cGVzLmFkZFR5cGVzKHtzdGFyOiB4ID0+IHRydWV9KVxuICogICBhcml0aG1ldGljVHlwZUZhY3RvcnkoJ29iamVjdHxmdW5jdGlvbnxzdGFyJylcbiAqICAgLy89PiB4ID0+IGlzT2JqKHgpIHx8IGlzRnVuY3Rpb24oeCkgfHwgaXNTdGFyKHgpXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgIGFyaXRobWV0aWNUeXBlRmFjdG9yeSgnPT09JylcbiAqICAgLy89PiB4ID0+IChbJz09PSddKS5pbmNsdWRlcyh4KVxuICovXG5mdW5jdGlvbiBhcml0aG1ldGljVHlwZUZhY3RvcnkoZnVsbEtleSkge1xuICBjb25zdCBrZXkgPSBzdHJpcEFyaXRobWV0aWNTeW1ib2xzKGZ1bGxLZXkpXG4gIGxldCBmbiA9IGdldChrZXkpXG4gIGNvbnN0IG9wdGlvbmFsVHlwZSA9IGA/JHtrZXl9YFxuICBjb25zdCB0eXBlT3JBcnJheU9yVHlwZSA9IGAke2tleX1bXWBcbiAgY29uc3Qgbm90VHlwZSA9IGAhJHtrZXl9YFxuXG4gIGNvbnN0IGlzVmFsaWRPck5vdFJlYWxPckVtcHR5U3RyID0gb3IoZm4sIGlzTm90UmVhbE9ySXNFbXB0eSlcbiAgY29uc3QgaXNWYWxpZE9yQXJyYXlPZlZhbGlkID0gb3IoZm4sIGlzQXJyYXlPZihmbikpXG4gIGlmIChkb2VzTm90SGF2ZShvcHRpb25hbFR5cGUpKSB7XG4gICAgc2V0KG9wdGlvbmFsVHlwZSwgaXNWYWxpZE9yTm90UmVhbE9yRW1wdHlTdHIpXG4gIH1cbiAgaWYgKGRvZXNOb3RIYXZlKHR5cGVPckFycmF5T3JUeXBlKSkge1xuICAgIHNldCh0eXBlT3JBcnJheU9yVHlwZSwgaXNWYWxpZE9yQXJyYXlPZlZhbGlkKVxuICB9XG4gIGlmIChkb2VzTm90SGF2ZShub3RUeXBlKSkge1xuICAgIHNldChub3RUeXBlLCBub3QoZm4pKVxuICB9XG5cbiAgcmV0dXJuIGdldChmdWxsS2V5KVxufVxuXG4vLyAtLS0tXG4vLyA7IGZ1bmN0aW9uIHNwbGl0XG4vLyAtLS0tXG5cbi8vIHYtIGFubm95aW5nIG9uIGNvbW1lbnRzIHdpdGggaWZzXG4vKiBwcmV0dGllci1pZ25vcmUgKi9cbi8qKlxuICogQGRlc2MgQHBhdHRlcm4gQGJ1aWxkZXIgLT4gYnVpbGRzIHVzaW5nIG11bHRpcGxlIGZhY3RvcmllcyBkZXBlbmRpbmcgb24gY29uZGl0b25zXG4gKiAgICAgICBvciBhYnN0cmFjdEZhY3Rvcnkgd2hhdGV2ZXJcbiAqICAgICAgIG9waW5pb25hdGVkOiBpZiBpdCdzIGEgZnVuY3Rpb24sIGl0J3MgYSB2YWxpZGF0b3IuLi5cbiAqXG4gKiBAY2F0ZWdvcnkgdHlwZXNcbiAqIEBzaW5jZSA0LjAuMFxuICogQHBhcmFtICB7c3RyaW5nIHwgRnVuY3Rpb24gfCBQcmltaXRpdmV9IGZ1bGxLZXkgYXJpdGhtZXRpYyBrZXkgdG8gdGhlIHZhbGlkYXRvclxuICogQHJldHVybiB7RnVuY3Rpb259IHZhbGlkYXRvclxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvRnVuY3Rpb25zL0RlZmF1bHRfcGFyYW1ldGVyc1xuICogQE5PVEUgaWYvZWxzZSBpcyBmb3IgdWdsaWZ5aW5nIHRlcm5hcmllcywgZXZlbiB0aG91Z2ggZWxzZSBpZiBpcyBub3QgbmVlZGVkXG4gKiBATk9URSBpZiBrZXkgaXMgbnVtYmVyLCBpdGVyYXRpbmcgdGhlIGFycmF5XG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAvLyBmdW5jdGlvblR5cGVcbiAqICAgIGNvbnN0IGlzU3RyaW5nID0geCA9PiB0eXBlb2YgeCA9PT0gJ3N0cmluZydcbiAqICAgIGJ1aWxkZXIoaXNTdHJpbmcpXG4gKiAgICAvLz0+IGlzU3RyaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAvLyBzdHJpbmdUeXBlIChidWlsdCBpbiwgb3IgY3VzdG9tLWtleWVkIHZhbGlkYXRvciwgb3IgZXFlcWVxKVxuICogICAgYnVpbGRlcignc3RyaW5nJylcbiAqICAgIC8vPT4gaXNTdHJpbmdcbiAqXG4gKiAgICBjb25zdCBlbnVtbXkgPSBidWlsZGVyKCdlbnVtJylcbiAqICAgIC8vPT4geCA9PiBbJ2VudW0nXS5pbmNsdWRlcyh4KVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgLy8gYXJpdGhtZXRpY1R5cGVcbiAqICAgIGJ1aWxkZXIoJ3N0cmluZ3xzdHJpbmdbXScpXG4gKiAgICAvLz0+IGlzU3RyaW5nIHx8IGlzQXJyYXlPZihpc1N0cmluZylcbiAqXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkZXIoZnVsbEtleSkge1xuICBpZiAoaXNGdW5jdGlvbihmdWxsS2V5KSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkZXYgKi9cbiAgICBpZiAoRU5WX0RFQlVHKSB7XG4gICAgICBjb25zb2xlLmxvZygnZnVuY3Rpb25UeXBlJywge2Z1bGxLZXl9KVxuICAgIH1cbiAgICByZXR1cm4gZnVsbEtleVxuICB9XG4gIGVsc2UgaWYgKGlzU3RyaW5nKGZ1bGxLZXkpICYmIGluY2x1ZGVzQW5kT3IoZnVsbEtleSkpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZGV2ICovXG4gICAgaWYgKEVOVl9ERUJVRykge1xuICAgICAgY29uc29sZS5sb2coJ2FuZE9yVHlwZScsIHtmdWxsS2V5fSlcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVMaXN0RmFjdG9yeShmdWxsS2V5KVxuICB9XG4gIGVsc2Uge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkZXYgKi9cbiAgICBpZiAoRU5WX0RFQlVHKSB7XG4gICAgICBjb25zb2xlLmxvZygnYXJpdGhtZXRpY1R5cGUnLCB7ZnVsbEtleX0sIGFyaXRobWV0aWNUeXBlRmFjdG9yeShmdWxsS2V5KSlcbiAgICB9XG4gICAgcmV0dXJuIGFyaXRobWV0aWNUeXBlRmFjdG9yeShmdWxsS2V5KVxuICB9XG59XG5cbmJ1aWxkZXIuaGFzID0gaGFzXG5idWlsZGVyLmdldCA9IGdldFxuYnVpbGRlci5zZXQgPSBzZXRcbmJ1aWxkZXIuYWRkVHlwZXMgPSBhZGRUeXBlcyAvLyB3YXMgbWVyZ2VcbmJ1aWxkZXIubWFwID0gdmFsaWRhdG9yc1xubW9kdWxlLmV4cG9ydHMgPSBidWlsZGVyXG4iXSwibmFtZXMiOlsiY29uc3QiLCJsZXQiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0FBT0FBLEdBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDO0FBQ2xEQSxHQUFLLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7QUFDekNBLEdBQUssQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUNqQ0EsR0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0FBQ3hDQSxHQUFLLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztBQUM1Q0EsR0FBSyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0FBQ3pDQSxHQUFLLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztBQUNoREEsR0FBSyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUM7QUFDekNBLEdBQUssQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDO0FBQ3ZDQSxHQUFLLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7QUFDMUNBLEdBQUssQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUM7QUFDNURBLEdBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQzs7QUFFeENDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLEVBQUU7OztBQUdqQ0QsR0FBSyxDQUFDLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO0FBQ3pEQSxHQUFLLENBQUMsVUFBVSxHQUFHLFVBQUEsQ0FBQyxDQUFBLENBQUMsQUFBRyxTQUFBLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUE7QUFDNUNBLEdBQUssQ0FBQyxNQUFNLEdBQUcsVUFBQSxLQUFLLENBQUEsQ0FBQyxBQUFHLFNBQUEsVUFBQSxDQUFDLENBQUEsQ0FBQyxBQUFHLFNBQUEsS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFBOzs7O0FBSTdEQSxHQUFLLENBQUMsR0FBRyxHQUFHLFVBQUEsR0FBRyxDQUFBLENBQUMsQUFDZCxTQUFBLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUE7QUFDdkVBLEdBQUssQ0FBQyxHQUFHLEdBQUcsVUFBQSxHQUFHLENBQUEsQ0FBQyxBQUFHLFNBQUEsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFBO0FBQ3pFQSxHQUFLLENBQUMsR0FBRyxHQUFHLFNBQUEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEFBQUcsU0FBQSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBQTtBQUN0REEsR0FBSyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0M1QkEsR0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFBLEtBQUssQ0FBQSxDQUFDLEFBQ3JCLFNBQUEsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUE7O0FBRXpELFFBQVEsQ0FBQyxFQUFFLENBQUM7O0FBRVpBLEdBQUssQ0FBQyxhQUFhLEdBQUcsVUFBQSxDQUFDLENBQUEsQ0FBQyxBQUFHLFNBQUEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQjdELFNBQVMsZUFBZSxDQUFDLE9BQU8sRUFBRTs7RUFFaEMsSUFBSSxHQUFHLENBQUMs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