foop
Version:
interfaces that describe their intentions.
182 lines (163 loc) • 21.5 kB
JavaScript
/** @ignore 🚧 wip */
var ignored = require('./deps/meta/ignored')
var getMeta = require('./deps/meta/meta')
var Chain = require('./compose/compose')
var throttle = require('./deps/_/throttle')
var isFunction = require('./deps/is/function')
var isString = require('./deps/is/string')
var curry = require('./deps/fp/curry')
var bind = require('./deps/fp/bind')
var toArr = require('./deps/to-arr')
var camelCase = require('./deps/string/camelCase')
var eq = require('./deps/traversers/eq')
var isEmpty = require('./deps/is/empty')
var escapeDot = require('./deps/dot/escape')
var not = require('./deps/conditional/not')
var ObjectKeys = require('./deps/util/keys')
// @TODO pass in factories first, like bind, get, set, has, ifElse
module.exports = function (chain) {
// could also do `before` & `after` diffs for keys when instantiating
// chain.sponge = () => {
// mapKeys(chain, key => {
// if (!ignored(key)) return
//
// // larger... faster... (than inlining 1 if statement...)
// const value = chain[key]
// if (isFunction(value)) return
//
// // what if conflict?
// chain.set(key, value)
// })
// }
chain.addPooling = function () {
// addPoolingTo(Chain)
chain.release = function () {
// Chain.release(chain)
chain.clear(true)
chain.meta = undefined
chain.meta = getMeta(chain)
}
chain.init = chain.getPooled = function (parent) { return Chain.getPooled(parent); }
}
chain._ifElse = function (condition, fn) {
if ( fn === void 0 ) fn = null;
var ifElse = {}
ifElse.then = function (cb) {
ifElse._then = cb
return (condition.call(chain) ? cb.call(chain) : ifElse)
}
ifElse.else = function (cb) {
ifElse._else = cb
return (!condition.call(chain) ? cb.call(chain) : ifElse)
}
ifElse.elseIf = chain.ifElse
return ifElse
}
// THIS WAY, THIS IS LIKE .when which is called every change
chain.ifElse = function (condition, fn) {
if ( fn === void 0 ) fn = null;
var ifElse = chain._ifElse(condition)
// chain.observe('*', debounce(() => {
// if (ifElse._then) ifElse._then.call(chain)
// if (ifElse._else) ifElse._else.call(chain)
// }), 10)
chain.observe('*', throttle(function () {
if (ifElse._then) { ifElse._then.call(chain) }
if (ifElse._else) { ifElse._else.call(chain) }
}), 5)
// chain.observe('*', changed => {
// require('fliplog').data({changed}).echo()
// if (ifElse._then) ifElse._then.call(chain)
// if (ifElse._else) ifElse._else.call(chain)
// })
return ifElse
}
var _eq = curry(2, eq)
// @TODO when passing `propIs` and using a non-function, use `propeq`
// chain.prop = curry(2, chain.propEq)
chain.propEq = function (prop, value) { return eq(chain.get(prop), value); }
chain.propIs = function (prop, fn) {
if (isString(fn)) {
fn = _eq(fn)
}
if (!isFunction(fn)) {
// require('fliplog').quick({fn})
}
return fn(chain.get(prop))
}
// chain.propIsNot = not(chain.propIs)
chain.freezeProp = function (prop) {
var frozen = chain.get(prop)
chain.transform(prop, function (data) { return frozen; })
}
chain.propIsNot = function (prop, fn) { return not(chain.propIs(prop, fn)); }
chain.propEq = curry(2, chain.propEq)
chain.propIs = curry(2, chain.propIs)
chain.propIsNot = curry(2, chain.propIsNot)
chain.transform = curry(2, bind(chain.transform, chain))
chain.observe = curry(2, bind(chain.observe, chain))
chain.set = bind(chain.set, chain)
// @NOTE could curry 3, but that forces an else... bah
chain.when = curry(2, chain.when)
var _transforms = function (prop, transforms) { return transforms.forEach(function (transform) { return chain.transform(prop, transform); }); }
chain.transforms = curry(2, _transforms)
// @TODO when prefix, could do so much like
// `{ehView} = chain` for prefix
// `{viewEh} = chain` for postfix
//
// const {get, set} = chain.boundMethods('get,set')
// bindMethods, scopedMethods
chain.boundMethods = function (methods, prefix) {
if ( prefix === void 0 ) prefix = '';
var bound = {}
var bounds = toArr(methods).forEach(function (method) { return bound[method] = bind(chain[method], chain); }
)
return bound
}
// ignore transform and observe
chain.setSilent = curry(2, function (key, prop) {
chain.store.set(key, prop)
return chain
})
// partial, `view`
chain.view = function (prop) { return function () { return chain.get(prop); }; }
chain.lense = function (prop) {
// @TODO allow using every single `is` as property of the `is` returned
//
// [x] also return a destructurable obj with camel like
// [prop] + '-View'
var obj = {
escapeDot: function () {
prop = escapeDot(prop)
return chain
},
has: function () { return chain.has(prop); },
get: function () { return chain.get(prop); },
view: chain.view(prop),
eq: chain.propEq(prop),
is: chain.propIs(prop),
not: chain.propIsNot(prop),
freeze: function () { return chain.freezeProp(prop); },
// update, adjust
// set: chain.set(prop),
set: function (val) { return chain.set(prop, val); },
setSilent: function (val) { return chain.setSilent(prop, val); },
transform: chain.transform(prop),
observe: chain.observe(prop),
transforms: chain.transforms(prop),
}
// clone: true
// obj.mapKeys()
ObjectKeys(obj).forEach(function (key) {
var destructurableKey = camelCase(key + '-' + prop)
var destructurableReverse = camelCase(prop + '-' + key)
obj[destructurableKey] = obj[key]
obj[destructurableReverse] = obj[key]
})
return obj
}
chain.unobserve = function (observer) { return chain.meta('observe').delete(observer); }
chain.untransform = function (transformer) { return chain.meta('transform').delete(transformer); }
return chain
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5QbHVzLmpzIiwic291cmNlcyI6WyJjaGFpblBsdXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBpZ25vcmUg8J+apyB3aXAgKi9cblxuY29uc3QgaWdub3JlZCA9IHJlcXVpcmUoJy4vZGVwcy9tZXRhL2lnbm9yZWQnKVxuY29uc3QgZ2V0TWV0YSA9IHJlcXVpcmUoJy4vZGVwcy9tZXRhL21ldGEnKVxuY29uc3QgQ2hhaW4gPSByZXF1aXJlKCcuL2NvbXBvc2UvY29tcG9zZScpXG5jb25zdCB0aHJvdHRsZSA9IHJlcXVpcmUoJy4vZGVwcy9fL3Rocm90dGxlJylcbmNvbnN0IGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2RlcHMvaXMvZnVuY3Rpb24nKVxuY29uc3QgaXNTdHJpbmcgPSByZXF1aXJlKCcuL2RlcHMvaXMvc3RyaW5nJylcbmNvbnN0IGN1cnJ5ID0gcmVxdWlyZSgnLi9kZXBzL2ZwL2N1cnJ5JylcbmNvbnN0IGJpbmQgPSByZXF1aXJlKCcuL2RlcHMvZnAvYmluZCcpXG5jb25zdCB0b0FyciA9IHJlcXVpcmUoJy4vZGVwcy90by1hcnInKVxuY29uc3QgY2FtZWxDYXNlID0gcmVxdWlyZSgnLi9kZXBzL3N0cmluZy9jYW1lbENhc2UnKVxuY29uc3QgZXEgPSByZXF1aXJlKCcuL2RlcHMvdHJhdmVyc2Vycy9lcScpXG5jb25zdCBpc0VtcHR5ID0gcmVxdWlyZSgnLi9kZXBzL2lzL2VtcHR5JylcbmNvbnN0IGVzY2FwZURvdCA9IHJlcXVpcmUoJy4vZGVwcy9kb3QvZXNjYXBlJylcbmNvbnN0IG5vdCA9IHJlcXVpcmUoJy4vZGVwcy9jb25kaXRpb25hbC9ub3QnKVxuY29uc3QgT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4vZGVwcy91dGlsL2tleXMnKVxuXG4vLyBAVE9ETyBwYXNzIGluIGZhY3RvcmllcyBmaXJzdCwgbGlrZSBiaW5kLCBnZXQsIHNldCwgaGFzLCBpZkVsc2Vcbm1vZHVsZS5leHBvcnRzID0gKGNoYWluKSA9PiB7XG4gIC8vIGNvdWxkIGFsc28gZG8gYGJlZm9yZWAgJiBgYWZ0ZXJgIGRpZmZzIGZvciBrZXlzIHdoZW4gaW5zdGFudGlhdGluZ1xuICAvLyBjaGFpbi5zcG9uZ2UgPSAoKSA9PiB7XG4gIC8vICAgbWFwS2V5cyhjaGFpbiwga2V5ID0+IHtcbiAgLy8gICAgIGlmICghaWdub3JlZChrZXkpKSByZXR1cm5cbiAgLy9cbiAgLy8gICAgIC8vIGxhcmdlci4uLiBmYXN0ZXIuLi4gKHRoYW4gaW5saW5pbmcgMSBpZiBzdGF0ZW1lbnQuLi4pXG4gIC8vICAgICBjb25zdCB2YWx1ZSA9IGNoYWluW2tleV1cbiAgLy8gICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkgcmV0dXJuXG4gIC8vXG4gIC8vICAgICAvLyB3aGF0IGlmIGNvbmZsaWN0P1xuICAvLyAgICAgY2hhaW4uc2V0KGtleSwgdmFsdWUpXG4gIC8vICAgfSlcbiAgLy8gfVxuICBjaGFpbi5hZGRQb29saW5nID0gKCkgPT4ge1xuICAgIC8vIGFkZFBvb2xpbmdUbyhDaGFpbilcbiAgICBjaGFpbi5yZWxlYXNlID0gKCkgPT4ge1xuICAgICAgLy8gQ2hhaW4ucmVsZWFzZShjaGFpbilcbiAgICAgIGNoYWluLmNsZWFyKHRydWUpXG4gICAgICBjaGFpbi5tZXRhID0gdW5kZWZpbmVkXG4gICAgICBjaGFpbi5tZXRhID0gZ2V0TWV0YShjaGFpbilcbiAgICB9XG4gICAgY2hhaW4uaW5pdCA9IGNoYWluLmdldFBvb2xlZCA9IHBhcmVudCA9PiBDaGFpbi5nZXRQb29sZWQocGFyZW50KVxuICB9XG5cbiAgY2hhaW4uX2lmRWxzZSA9IChjb25kaXRpb24sIGZuID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IGlmRWxzZSA9IHt9XG4gICAgaWZFbHNlLnRoZW4gPSBjYiA9PiB7XG4gICAgICBpZkVsc2UuX3RoZW4gPSBjYlxuICAgICAgcmV0dXJuIChjb25kaXRpb24uY2FsbChjaGFpbikgPyBjYi5jYWxsKGNoYWluKSA6IGlmRWxzZSlcbiAgICB9XG4gICAgaWZFbHNlLmVsc2UgPSBjYiA9PiB7XG4gICAgICBpZkVsc2UuX2Vsc2UgPSBjYlxuICAgICAgcmV0dXJuICghY29uZGl0aW9uLmNhbGwoY2hhaW4pID8gY2IuY2FsbChjaGFpbikgOiBpZkVsc2UpXG4gICAgfVxuICAgIGlmRWxzZS5lbHNlSWYgPSBjaGFpbi5pZkVsc2VcbiAgICByZXR1cm4gaWZFbHNlXG4gIH1cblxuICAvLyBUSElTIFdBWSwgVEhJUyBJUyBMSUtFIC53aGVuIHdoaWNoIGlzIGNhbGxlZCBldmVyeSBjaGFuZ2VcbiAgY2hhaW4uaWZFbHNlID0gKGNvbmRpdGlvbiwgZm4gPSBudWxsKSA9PiB7XG4gICAgY29uc3QgaWZFbHNlID0gY2hhaW4uX2lmRWxzZShjb25kaXRpb24pXG4gICAgLy8gY2hhaW4ub2JzZXJ2ZSgnKicsIGRlYm91bmNlKCgpID0+IHtcbiAgICAvLyAgIGlmIChpZkVsc2UuX3RoZW4pIGlmRWxzZS5fdGhlbi5jYWxsKGNoYWluKVxuICAgIC8vICAgaWYgKGlmRWxzZS5fZWxzZSkgaWZFbHNlLl9lbHNlLmNhbGwoY2hhaW4pXG4gICAgLy8gfSksIDEwKVxuICAgIGNoYWluLm9ic2VydmUoJyonLCB0aHJvdHRsZSgoKSA9PiB7XG4gICAgICBpZiAoaWZFbHNlLl90aGVuKSBpZkVsc2UuX3RoZW4uY2FsbChjaGFpbilcbiAgICAgIGlmIChpZkVsc2UuX2Vsc2UpIGlmRWxzZS5fZWxzZS5jYWxsKGNoYWluKVxuICAgIH0pLCA1KVxuXG4gICAgLy8gY2hhaW4ub2JzZXJ2ZSgnKicsIGNoYW5nZWQgPT4ge1xuICAgIC8vICAgcmVxdWlyZSgnZmxpcGxvZycpLmRhdGEoe2NoYW5nZWR9KS5lY2hvKClcbiAgICAvLyAgIGlmIChpZkVsc2UuX3RoZW4pIGlmRWxzZS5fdGhlbi5jYWxsKGNoYWluKVxuICAgIC8vICAgaWYgKGlmRWxzZS5fZWxzZSkgaWZFbHNlLl9lbHNlLmNhbGwoY2hhaW4pXG4gICAgLy8gfSlcbiAgICByZXR1cm4gaWZFbHNlXG4gIH1cblxuICBjb25zdCBfZXEgPSBjdXJyeSgyLCBlcSlcbiAgLy8gQFRPRE8gd2hlbiBwYXNzaW5nIGBwcm9wSXNgIGFuZCB1c2luZyBhIG5vbi1mdW5jdGlvbiwgdXNlIGBwcm9wZXFgXG4gIC8vIGNoYWluLnByb3AgPSBjdXJyeSgyLCBjaGFpbi5wcm9wRXEpXG4gIGNoYWluLnByb3BFcSA9IChwcm9wLCB2YWx1ZSkgPT4gZXEoY2hhaW4uZ2V0KHByb3ApLCB2YWx1ZSlcbiAgY2hhaW4ucHJvcElzID0gKHByb3AsIGZuKSA9PiB7XG4gICAgaWYgKGlzU3RyaW5nKGZuKSkge1xuICAgICAgZm4gPSBfZXEoZm4pXG4gICAgfVxuICAgIGlmICghaXNGdW5jdGlvbihmbikpIHtcbiAgICAgIC8vIHJlcXVpcmUoJ2ZsaXBsb2cnKS5xdWljayh7Zm59KVxuICAgIH1cbiAgICByZXR1cm4gZm4oY2hhaW4uZ2V0KHByb3ApKVxuICB9XG5cbiAgLy8gY2hhaW4ucHJvcElzTm90ID0gbm90KGNoYWluLnByb3BJcylcbiAgY2hhaW4uZnJlZXplUHJvcCA9IHByb3AgPT4ge1xuICAgIGNvbnN0IGZyb3plbiA9IGNoYWluLmdldChwcm9wKVxuICAgIGNoYWluLnRyYW5zZm9ybShwcm9wLCBkYXRhID0+IGZyb3plbilcbiAgfVxuICBjaGFpbi5wcm9wSXNOb3QgPSAocHJvcCwgZm4pID0+IG5vdChjaGFpbi5wcm9wSXMocHJvcCwgZm4pKVxuICBjaGFpbi5wcm9wRXEgPSBjdXJyeSgyLCBjaGFpbi5wcm9wRXEpXG4gIGNoYWluLnByb3BJcyA9IGN1cnJ5KDIsIGNoYWluLnByb3BJcylcbiAgY2hhaW4ucHJvcElzTm90ID0gY3VycnkoMiwgY2hhaW4ucHJvcElzTm90KVxuICBjaGFpbi50cmFuc2Zvcm0gPSBjdXJyeSgyLCBiaW5kKGNoYWluLnRyYW5zZm9ybSwgY2hhaW4pKVxuICBjaGFpbi5vYnNlcnZlID0gY3VycnkoMiwgYmluZChjaGFpbi5vYnNlcnZlLCBjaGFpbikpXG4gIGNoYWluLnNldCA9IGJpbmQoY2hhaW4uc2V0LCBjaGFpbilcblxuICAvLyBATk9URSBjb3VsZCBjdXJyeSAzLCBidXQgdGhhdCBmb3JjZXMgYW4gZWxzZS4uLiBiYWhcbiAgY2hhaW4ud2hlbiA9IGN1cnJ5KDIsIGNoYWluLndoZW4pXG5cbiAgY29uc3QgX3RyYW5zZm9ybXMgPSAocHJvcCwgdHJhbnNmb3JtcykgPT5cbiAgICB0cmFuc2Zvcm1zLmZvckVhY2godHJhbnNmb3JtID0+IGNoYWluLnRyYW5zZm9ybShwcm9wLCB0cmFuc2Zvcm0pKVxuICBjaGFpbi50cmFuc2Zvcm1zID0gY3VycnkoMiwgX3RyYW5zZm9ybXMpXG5cbiAgLy8gQFRPRE8gd2hlbiBwcmVmaXgsIGNvdWxkIGRvIHNvIG11Y2ggbGlrZVxuICAvLyBge2VoVmlld30gPSBjaGFpbmAgZm9yIHByZWZpeFxuICAvLyBge3ZpZXdFaH0gPSBjaGFpbmAgZm9yIHBvc3RmaXhcbiAgLy9cbiAgLy8gY29uc3Qge2dldCwgc2V0fSA9IGNoYWluLmJvdW5kTWV0aG9kcygnZ2V0LHNldCcpXG4gIC8vIGJpbmRNZXRob2RzLCBzY29wZWRNZXRob2RzXG4gIGNoYWluLmJvdW5kTWV0aG9kcyA9IChtZXRob2RzLCBwcmVmaXggPSAnJykgPT4ge1xuICAgIGNvbnN0IGJvdW5kID0ge31cbiAgICBjb25zdCBib3VuZHMgPSB0b0FycihtZXRob2RzKS5mb3JFYWNoKG1ldGhvZCA9PlxuICAgICAgYm91bmRbbWV0aG9kXSA9IGJpbmQoY2hhaW5bbWV0aG9kXSwgY2hhaW4pXG4gICAgKVxuICAgIHJldHVybiBib3VuZFxuICB9XG5cbiAgLy8gaWdub3JlIHRyYW5zZm9ybSBhbmQgb2JzZXJ2ZVxuICBjaGFpbi5zZXRTaWxlbnQgPSBjdXJyeSgyLCAoa2V5LCBwcm9wKSA9PiB7XG4gICAgY2hhaW4uc3RvcmUuc2V0KGtleSwgcHJvcClcbiAgICByZXR1cm4gY2hhaW5cbiAgfSlcblxuICAvLyBwYXJ0aWFsLCBgdmlld2BcbiAgY2hhaW4udmlldyA9IHByb3AgPT4gKCkgPT4gY2hhaW4uZ2V0KHByb3ApXG4gIGNoYWluLmxlbnNlID0gcHJvcCA9PiB7XG4gICAgLy8gQFRPRE8gYWxsb3cgdXNpbmcgZXZlcnkgc2luZ2xlIGBpc2AgYXMgcHJvcGVydHkgb2YgdGhlIGBpc2AgcmV0dXJuZWRcbiAgICAvL1xuICAgIC8vIFt4XSBhbHNvIHJldHVybiBhIGRlc3RydWN0dXJhYmxlIG9iaiB3aXRoIGNhbWVsIGxpa2VcbiAgICAvLyBbcHJvcF0gKyAnLVZpZXcnXG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgZXNjYXBlRG90OiAoKSA9PiB7XG4gICAgICAgIHByb3AgPSBlc2NhcGVEb3QocHJvcClcbiAgICAgICAgcmV0dXJuIGNoYWluXG4gICAgICB9LFxuICAgICAgaGFzOiAoKSA9PiBjaGFpbi5oYXMocHJvcCksXG4gICAgICBnZXQ6ICgpID0+IGNoYWluLmdldChwcm9wKSxcbiAgICAgIHZpZXc6IGNoYWluLnZpZXcocHJvcCksXG4gICAgICBlcTogY2hhaW4ucHJvcEVxKHByb3ApLFxuICAgICAgaXM6IGNoYWluLnByb3BJcyhwcm9wKSxcbiAgICAgIG5vdDogY2hhaW4ucHJvcElzTm90KHByb3ApLFxuICAgICAgZnJlZXplOiAoKSA9PiBjaGFpbi5mcmVlemVQcm9wKHByb3ApLFxuICAgICAgLy8gdXBkYXRlLCBhZGp1c3RcbiAgICAgIC8vIHNldDogY2hhaW4uc2V0KHByb3ApLFxuICAgICAgc2V0OiB2YWwgPT4gY2hhaW4uc2V0KHByb3AsIHZhbCksXG4gICAgICBzZXRTaWxlbnQ6IHZhbCA9PiBjaGFpbi5zZXRTaWxlbnQocHJvcCwgdmFsKSxcbiAgICAgIHRyYW5zZm9ybTogY2hhaW4udHJhbnNmb3JtKHByb3ApLFxuICAgICAgb2JzZXJ2ZTogY2hhaW4ub2JzZXJ2ZShwcm9wKSxcbiAgICAgIHRyYW5zZm9ybXM6IGNoYWluLnRyYW5zZm9ybXMocHJvcCksXG4gICAgfVxuXG4gICAgLy8gY2xvbmU6IHRydWVcbiAgICAvLyBvYmoubWFwS2V5cygpXG4gICAgT2JqZWN0S2V5cyhvYmopLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IGRlc3RydWN0dXJhYmxlS2V5ID0gY2FtZWxDYXNlKGtleSArICctJyArIHByb3ApXG4gICAgICBjb25zdCBkZXN0cnVjdHVyYWJsZVJldmVyc2UgPSBjYW1lbENhc2UocHJvcCArICctJyArIGtleSlcbiAgICAgIG9ialtkZXN0cnVjdHVyYWJsZUtleV0gPSBvYmpba2V5XVxuICAgICAgb2JqW2Rlc3RydWN0dXJhYmxlUmV2ZXJzZV0gPSBvYmpba2V5XVxuICAgIH0pXG5cbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBjaGFpbi51bm9ic2VydmUgPSBvYnNlcnZlciA9PlxuICAgIGNoYWluLm1ldGEoJ29ic2VydmUnKS5kZWxldGUob2JzZXJ2ZXIpXG4gIGNoYWluLnVudHJhbnNmb3JtID0gdHJhbnNmb3JtZXIgPT5cbiAgICBjaGFpbi5tZXRhKCd0cmFuc2Zvcm0nKS5kZWxldGUodHJhbnNmb3JtZXIpXG4gIHJldHVybiBjaGFpblxufVxuIl0sIm5hbWVzIjpbImNvbnN0Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQUEsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUM7QUFDOUNBLEdBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0FBQzNDQSxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztBQUMxQ0EsR0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUM7QUFDN0NBLEdBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDO0FBQ2hEQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztBQUM1Q0EsR0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7QUFDeENBLEdBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO0FBQ3RDQSxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7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R0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFBO0VBQzFELEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBQSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQUFBRztJQUMzQixJQUFJLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRTtNQUNoQixFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztLQUNiO0lBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRTs7S0FFcEI7SUFDRCxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0dBQzNCOzs7RUFHRCxLQUFLLENBQUMsVUFBVSxHQUFHLFVBQUEsSUFBSSxDQUFBLENBQUMsQUFBRztJQUN6QkEsR0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztJQUM5QixLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxVQUFBLElBQUksQ0FBQSxDQUFDLEFBQUcsU0FBQSxNQUFNLEdBQUEsQ0FBQztHQUN0QztFQUNELEtBQUssQ0FBQyxTQUFTLEdBQUcsU0FBQSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQUFBRyxTQUFBLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFBO0VBQzNELEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO0VBQ3JDLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO0VBQ3JDLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO0VBQzNDLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztFQUN4RCxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7RUFDcEQsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUM7OztFQUdsQyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQzs7RUFFakNBLEdBQUssQ0FBQyxXQUFXLEdBQUcsU0FBQSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsQUFDckMsU0FBQSxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQUEsU0FBUyxDQUFBLENBQUMsQUFBRyxTQUFBLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxHQUFBLENBQUMsR0FBQTtFQUNuRSxLQUFLLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDOzs7Ozs7OztFQVF4QyxLQUFLLENBQUMsWUFBWSxHQUFHLFNBQUEsQ0FBQyxPQUFPLEVBQUUsTUFBVyxFQUFFLEFBQUcsQ0FBVjttQ0FBQSxHQUFHLEVBQUU7QUFBTTtJQUM5Q0EsR0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFO0lBQ2hCQSxHQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxNQUFNLENBQUEsQ0FBQyxBQUMzQyxTQUFBLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFBO0tBQzNDO0lBQ0QsT0FBTyxLQUFLO0dBQ2I7OztFQUdELEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFBLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxBQUFHO0lBQ3hDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7SUFDMUIsT0FBTyxLQUFLO0dBQ2IsQ0FBQzs7O0VBR0YsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFBLElBQUksQ0FBQSxDQUFDLEFBQUcsU0FBQSxTQUFBLEdBQUcsQUFBRyxTQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQUE7RUFDMUMsS0FBSyxDQUFDLEtBQUssR0FBRyxVQUFBLElBQUksQ0FBQSxDQUFDLEFBQUc7Ozs7O0lBS3BCQSxHQUFLLENBQUMsR0FBRyxHQUFHO01BQ1YsU0FBUyxFQUFFLFNBQUEsR0FBRyxBQUFHO1FBQ2YsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDdEIsT0FBTyxLQUFLO09BQ2I7TUFDRCxHQUFHLEVBQUUsU0FBQSxHQUFHLEFBQUcsU0FBQSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFBO01BQzFCLEdBQUcsRUFBRSxTQUFBLEdBQUcsQUFBRyxTQUFBLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUE7TUFDMUIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO01BQ3RCLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztNQUN0QixFQUFFLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7TUFDdEIsR0FBRyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO01BQzFCLE1BQU0sRUFBRSxTQUFBLEdBQUcsQUFBRyxTQUFBLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUE7OztNQUdwQyxHQUFHLEVBQUUsVUFBQSxHQUFHLENBQUEsQ0FBQyxBQUFHLFNBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUE7TUFDaEMsU0FBUyxFQUFFLFVBQUEsR0FBRyxDQUFBLENBQUMsQUFBRyxTQUFBLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFBO01BQzVDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztNQUNoQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7TUFDNUIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO0tBQ25DOzs7O0lBSUQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLEdBQUcsQ0FBQSxDQUFDLEFBQUc7TUFDN0JBLEdBQUssQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7TUFDckRBLEdBQUssQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7TUFDekQsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztNQUNqQyxHQUFHLENBQUMscUJBQXFCLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO0tBQ3RDLENBQUM7O0lBRUYsT0FBTyxHQUFHO0dBQ1g7O0VBRUQsS0FBSyxDQUFDLFNBQVMsR0FBRyxVQUFBLFFBQVEsQ0FBQSxDQUFDLEFBQ3pCLFNBQUEsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUE7RUFDeEMsS0FBSyxDQUFDLFdBQVcsR0FBRyxVQUFBLFdBQVcsQ0FBQSxDQUFDLEFBQzlCLFNBQUEsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUE7RUFDN0MsT0FBTyxLQUFLO0NBQ2I7In0=