8(4912)51-02-49
8-930-783-02-49
WhatsApp/Viber/Telegram
510249@mail.ru
звонки принимаются
ежедневно с 8.00 до 20.00

Купить в кредит

/**
* Kupivkredit Software Development Kit.
*
* Version: 1.0.0
* Date: 2016-10-17 16:42:30
*
* Copyright (c) 2016 Tinkoff Bank (closed joint-stock company)
*/

(function(root, factory) {
var isCJS, isAMD,
sdk, conflict;

isCJS = typeof module === «object» && module.exports;
isAMD = typeof define === «function» && define.amd;

sdk = factory.call(root);

if (isCJS) {
module.exports = sdk;
} else if (isAMD) {
define([], function() {
return sdk;
});
}

// save conflict
conflict = root.KVK;

// register KVK anyway
root.KVK = sdk;

// resolve conflict
root.KVK.noConflict = function() {
root.KVK = conflict;
}

})(this, function() {
var require, register, response,
define, // disable amd fallbacks
__DEBUG__, __BUILD__;

__DEBUG__ = true;
__BUILD__ = «17299b8a21f600c82c96520e261846dbd216a073»;

// this function will be called by an index cjs
register = function(obj) {
response = obj;
};

require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==»function»&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error(«Cannot find module ‘»+o+»‘»)}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require==»function»&&require;for(var o=0;o
*/
Actor = function(uuid, options) {
this.options = _.extend({}, this.constructor.DEFAULTS, options);
this.uuid = uuid;
this.subjectId = null;
this.known = [];
};

Actor.DEFAULTS = {};

Actor.prototype = {
constructor: Actor,

injectCommutation: function(commutation) {
assert(_.isEmpty(this.commutation), «Commutation is already set»);
assert(commutation instanceof Commutation, «Commutation is expected»);
this.commutation = commutation;
},

_isKnown: function(message) {
return _.indexOf(this.known, message.id) !== -1;
}
};

Actor.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Actor;
},{«./commutation»:2,»assert»:62,»inherits-js»:80,»lodash»:»7ZYSzK»}],2:[function(require,module,exports){
var _ = require(«lodash»),
inherits = require(«inherits-js»),
Commutation;

/**
* Commutation
*
* @class Commutation
* @constructor
* @abstract
*
* @param {Object} [options]
*
* @author Sergey Kamardin
*/
Commutation = function(options) {
this.options = _.extend({}, this.constructor.DEFAULTS, options);
};

Commutation.DEFAULTS = {};

Commutation.prototype = {
constructor: Commutation,

/**
* @abstract
*/
getWriter: function(window, options) {
throw new Error(«Method ‘getWriter’ must be implemented»);
},

/**
* @abstract
*/
getReader: function(options) {
throw new Error(«Method ‘getReader’ must be implemented»);
}
};

Commutation.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Commutation;
},{«inherits-js»:80,»lodash»:»7ZYSzK»}],»1kWZSB»:[function(require,module,exports){
var Commutation = require(«../commutation»),
_ = require(«lodash»),
ConditionCommutation;

/**
* ConditionCommutation
*
* @class ConditionCommutation
* @extends Commutation
* @author Sergey Kamardin
*/
ConditionCommutation = Commutation.extend(
/**
* @lends ConditionCommutation.prototype
*/
{
constructor: function(options) {
Commutation.prototype.constructor.apply(this, arguments);

if (window && window.postMessage) {
this.commutation = options.postMessage;
} else {
this.commutation = options.hash;
}
},

getWriter: function(window, options) {
return this.commutation.getWriter(window, options);
},

getReader: function(options) {
return this.commutation.getReader(options);
}

}
);

module.exports = ConditionCommutation;
},{«../commutation»:2,»lodash»:»7ZYSzK»}],»/common/script/src/communication/commutation/condition.js»:[function(require,module,exports){
module.exports=require(‘1kWZSB’);
},{}],»/common/script/src/communication/commutation/hash.js»:[function(require,module,exports){
module.exports=require(‘jdt5C8’);
},{}],»jdt5C8″:[function(require,module,exports){
var Commutation = require(«../commutation»),
_ = require(«lodash»),
HashWriter = require(«../writer/hash»),
HashReader = require(«../reader/hash»),

DefaultCommutation;

/**
* DefaultCommutation
*
* @class DefaultCommutation
* @extends Commutation
* @author Sergey Kamardin
*/
DefaultCommutation = Commutation.extend(
/**
* @lends DefaultCommutation.prototype
*/
{
getWriter: function(window, options) {
return new HashWriter(window, _.extend({}, this.options.writer, options));
},

getReader: function(options) {
return new HashReader(options, _.extend({}, this.options.reader, options));
}
},

/**
* @lends DefaultCommutation
*/
{
DEFAULTS: {
writer: {},
reader: {}
}
}
);

module.exports = DefaultCommutation;

},{«../commutation»:2,»../reader/hash»:16,»../writer/hash»:19,»lodash»:»7ZYSzK»}],»/common/script/src/communication/commutation/post-message.js»:[function(require,module,exports){
module.exports=require(‘k4NLRU’);
},{}],»k4NLRU»:[function(require,module,exports){
var Commutation = require(«../commutation»),
_ = require(«lodash»),
PostMessageWriter = require(«../writer/post-message»),
PostMessageReader = require(«../reader/post-message»),

DefaultCommutation;

/**
* DefaultCommutation
*
* @class DefaultCommutation
* @extends Commutation
* @author Sergey Kamardin
*/
DefaultCommutation = Commutation.extend(
/**
* @lends DefaultCommutation.prototype
*/
{
getWriter: function(window, options) {
return new PostMessageWriter(window, _.extend({}, this.options.writer, options));
},

getReader: function(options) {
return new PostMessageReader(options, _.extend({}, this.options.reader, options));
}
},

/**
* @lends DefaultCommutation
*/
{
DEFAULTS: {
writer: {},
reader: {}
}
}
);

module.exports = DefaultCommutation;

},{«../commutation»:2,»../reader/post-message»:17,»../writer/post-message»:20,»lodash»:»7ZYSzK»}],9:[function(require,module,exports){
var EventEmitter = require(«../events/emitter/node»),
_ = require(«lodash»),
RSVP = require(«rsvp»),
Connection;

/**
* Connection
*
* @class Connection
* @extends EventEmitter
* @author Sergey Kamardin
*/
Connection = EventEmitter.extend(
/**
* @lends Connection.prototype
*/
{
constructor: function(id, uuid) {
EventEmitter.prototype.constructor.apply(this, arguments);
this.established = false;
this.buffer = [];
this.id = id;
this.uuid = uuid;
},

isEstablished: function(value) {
var self = this;

if (_.isBoolean(value) && this.established !== value) {
this.emit(«established», this.established = value);

if (value) {
_.times(this.buffer.length, function() {
self.post.apply(self, self.buffer.pop());
});
}
}

return this.established;
},

handle: function(topic, data) {
this.emit(topic, data);
},

response: function(id, response) {
this.post([«rpc», «response», id].join(«:»), response);
},

request: function(method, params) {
var self = this;

return new RSVP.Promise(function(resolve, reject) {
var id;

self.post(«rpc:request», {
method: method,
params: params,
id: (id = self.uuid.generate(«rpc» + self.id))
});

self.once([«rpc», «response», id].join(«:»), function(response) {
if (response.error) {
reject(err);
return;
}

resolve(response.result);
});
});
},

post: function(topic, data) {
var self = this;

return new RSVP.Promise(function(resolve, reject) {
if (!self.isEstablished()) {
self.buffer.push(_.toArray(arguments).concat(resolve));
return;
}

self.emit(«post», topic, data, resolve);
});
}
}
);

module.exports = Connection;
},{«../events/emitter/node»:31,»lodash»:»7ZYSzK»,»rsvp»:84}],10:[function(require,module,exports){
var Actor = require(«./actor»),
_ = require(«lodash»),
MasterActor;

/**
* MasterActor
*
* @class MasterActor
* @extends Actor
* @author Sergey Kamardin
*/
MasterActor = Actor.extend(
/**
* @lends MasterActor.prototype
*/
{
/**
* @abstract
*/
connect: function(otherWindow, options) {
throw new Error(«Method ‘connect’ must be implemented»);
}
}
);

module.exports = MasterActor;
},{«./actor»:1,»lodash»:»7ZYSzK»}],»qBxYoh»:[function(require,module,exports){
/**
* Master
*
* @package Master
* @author Sergey Kamardin
*/

var Master = require(«../master»),
_ = require(«lodash»),
Connection = require(«../connection»),
Poster = require(«./../poster/rotating»);

module.exports = Master.extend({
constructor: function() {
Master.prototype.constructor.apply(this, arguments);

this.subjectID = this.uuid.generate(«master»);

this.connections = {};
this.posters = {};
this.posts = {};
},

connect: function(otherWindow, options) {
var self = this,
connection, recipient, poster,
postOptions;

// generate slave id
recipient = this.uuid.generate(«slave»);

postOptions = {
recipient: recipient,
subject: this.subjectID
};

// get post handler
poster = new Poster(this.commutation.getWriter(otherWindow, options));

// set message id generator
poster.injectIDGenerator(function() {
return self.uuid.generate(«message»);
});

this.posters[recipient] = poster;
this.connections[recipient] = connection = new Connection(recipient, this.uuid);

// listen signals to post something
connection.on(«post», function(topic, data, done) {
var id;

id = poster.post(topic, data, postOptions);

self.posts[recipient] || (self.posts[recipient] = {});
self.posts[recipient][id] = done;
});

// start listening messages
this.reader = self.commutation.getReader();
this.reader.initialize();
this.reader.on(«message», _.bind(self._onMessage, self));

//init connection
poster.post(«handshake», {
id: recipient,
location: window.location.href // punycode
}, postOptions);

// return connection
return connection;
},

_onMessage: function(message) {
var connection, poster, subject, resolver;

subject = message.subject;

poster = this.posters[subject];

if (message.topic !== «delivered» && poster) {
poster.add(«delivered», message.id, { ack: true });
}

if (this._isKnown(message)) {
return;
}

this.known.push(message.id);

switch (message.topic) {
case «handshake»: {
if ((connection = this.connections[subject]) && !connection.isEstablished()) {
connection.isEstablished(true);
}
break;
}

case «delivered»: {
poster && poster.remove(message.data);

if (this.posts[subject] && _.isFunction(resolver = this.posts[subject][message.data])) {
resolver.call();
}

break;
}

default: {
if ((connection = this.connections[subject]) && connection.isEstablished()) {
connection.handle(message.topic, message.data);
}
}
}

poster.flush();
}
});
},{«../connection»:9,»../master»:10,»./../poster/rotating»:14,»lodash»:»7ZYSzK»}],»/common/script/src/communication/master/default.js»:[function(require,module,exports){
module.exports=require(‘qBxYoh’);
},{}],13:[function(require,module,exports){
var _ = require(«lodash»),
inherits = require(«inherits-js»),
assert = require(«assert»),
Writer = require(«./writer»),
Poster;

/**
* Poster
*
* @class Poster
* @constructor
* @abstract
*
* @param {Writer} writer
* @param {Object} options
*
* @author Sergey Kamardin
*/
Poster = function(writer, options) {
assert(writer instanceof Writer);
this.writer = writer;
this.options = _.extend({}, this.constructor.DEFAULTS, options);
};

Poster.DEFAULTS = {};

Poster.prototype = {
constructor: Poster,

/**
* Injection
* @param {Function} IDGenerator
*/
injectIDGenerator: function(IDGenerator) {
assert(_.isEmpty(this.IDGenerator), «IdGenerator is already set»);
assert(_.isFunction(IDGenerator), «Function is expected»);
this.IDGenerator = IDGenerator;
},

/**
* @abstract
*/
add: function(topic, data, options) {
throw new Error(«Method ‘add’ must be implemented»);
},

/**
* @abstract
*/
post: function(topic, data, options) {
throw new Error(«Method ‘post’ must be implemented»);
},

/**
* @abstract
*/
remove: function(id) {
throw new Error(«Method ‘remove’ must be implemented»);
},

/**
* @abstract
*/
flush: function() {
throw new Error(«Method ‘flush’ must be implemented»);
}
};

Poster.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Poster;
},{«./writer»:18,»assert»:62,»inherits-js»:80,»lodash»:»7ZYSzK»}],14:[function(require,module,exports){
var Poster = require(«../poster»),
_ = require(«lodash»),
RotatingPoster;

/**
* RotatingPoster
*
* @class RotatingPoster
* @extends Poster
* @author Sergey Kamardin
*/
RotatingPoster = Poster.extend(
/**
* @lends RotatingPoster.prototype
*/
{
constructor: function() {
Poster.prototype.constructor.apply(this, arguments);
this.acks = [];
this.messages = [];

this._flushID = null;
this._repeatID = null;
},

add: function(topic, data, options) {
var message;

options = options || {};

message = {
topic: topic,
data: data,
subject: options.subject,
recipient: options.recipient,
id: this.IDGenerator()
};

if (options.ack) {
this.acks.push(message.id);
}

this.messages.push(message);

this._registerRepeat();

return message.id;
},

_registerRepeat: function() {
var self = this;

clearInterval(this._repeatID);

this._repeatID = setInterval(function() {
if (_.isEmpty(self.messages)) {
clearInterval(self._repeatID);
return;
}

self.flush();

}, this.options.interval);
},

post: function(topic, data, options) {
var id;

id = this.add(topic, data, options);

this.flush();

return id;
},

remove: function(id) {
_.remove(this.messages, { id: id });
},

flush: function() {
var self = this;

clearTimeout(this._flushID);

this._flushID = setTimeout(function() {
self.writer.write(self.messages);
self._clearAcks();
}, 0);
},

_clearAcks: function() {
// remove acks from queue
_.forEach(this.acks, _.bind(this.remove, this));
this.acks = [];
}
},
/**
* @lends RotatingPoster
*/
{
DEFAULTS: {
interval: 500
}
}
);

module.exports = RotatingPoster;
},{«../poster»:13,»lodash»:»7ZYSzK»}],15:[function(require,module,exports){
var _ = require(«lodash»),
inherits = require(«inherits-js»),
EventEmitter = require(«events»).EventEmitter,
Reader;

/**
* Reader
*
* @class Reader
* @extends EventEmitter
* @constructor
* @abstract
*
* @param {Object} [options]
*
* @author Sergey Kamardin
*/
Reader = inherits(EventEmitter,
/**
* @lends Reader.prototype
*/
{
constructor: function(options) {
this.options = _.extend({}, this.constructor.DEFAULTS, options);
},

/**
* @abstract
*/
initialize: function() {
throw new Error(«Method ‘initialize’ must be implemented»);
},

parseMessage: function(message) {
try {
if (_.isObject(message = JSON.parse(message))) {
return message;
}
} catch (err) {}

return null;
}
},
/**
* @lends Reader
*/
{
DEFAULTS: {}
}
);

Reader.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Reader;
},{«events»:63,»inherits-js»:80,»lodash»:»7ZYSzK»}],16:[function(require,module,exports){
var Reader = require(«../reader»),
_ = require(«lodash»),
HashReader;

/**
* HashReader
*
* @class HashReader
* @extends Reader
* @author Sergey Kamardin
*/
HashReader = Reader.extend(
/**
* @lends HashReader.prototype
*/
{
constructor: function() {
Reader.prototype.constructor.apply(this, arguments);
this.pattern = new RegExp(«\\(%(.+?)%\\)», «g»);
},

initialize: function() {
this._start();
},

_start: function() {
var self = this;

if (this.intervalId) {
return;
}

this.intervalId = setInterval(function() {
_.forEach(self._extractMessages(), _.bind(self._onMessage, self));
}, this.options.interval);

console.log(‘this.options.interval’, this.options.interval);
},

_stop: function() {
if (this.intervalId) {
clearInterval(this.intervalId);
this.intervalId = null;
}
},

_extractMessages: function() {
var self = this,
hash, messages;

messages = [];

hash = window.location.hash;

hash = hash.replace(this.pattern, function(str, message) {
if (message = self.parseMessage(message)) {
messages.push(message);
return «»;
}

// safe replace
return str;
});

if (hash == «» || hash == «#») {
hash = «#!»;
}

// this._throwAnchor();

window.location.hash = hash;

return messages;
},

_onMessage: function(message) {
this.emit(«message», message);
},

_throwAnchor: function() {
var anchor;

anchor = document.createElement(‘div’);

_.extend(anchor.style, {
height: «1px»,
width: «1px»,
position: «absolute»,
top: this.utils.getBodyScrollTop() + ‘px’
});

document.body.appendChild(anchor);

anchor.scrollIntoView();

anchor.parentNode.removeChild(anchor);
}
},

/**
* @lends HashReader
*/
{
DEFAULTS: {
interval: 100
}
}
);

module.exports = HashReader;
},{«../reader»:15,»lodash»:»7ZYSzK»}],17:[function(require,module,exports){
var Reader = require(«../reader»),
_ = require(«lodash»),
PostMessageReader;

/**
* PostMessageReader
*
* @class PostMessageReader
* @extends Reader
* @author Sergey Kamardin
*/
PostMessageReader = Reader.extend(
/**
* @lends PostMessageReader.prototype
*/
{
initialize: function() {
var self = this,
handler;

handler = function(event) {
var message;

if (!(message = self.parseMessage(event.data))) {
return;
}

self.emit(«message», message);
};

if (window.addEventListener) {
window.addEventListener(«message», handler);
} else if (window.attachEvent) {
window.attachEvent(«onmessage», handler);
}
}
}
);

module.exports = PostMessageReader;
},{«../reader»:15,»lodash»:»7ZYSzK»}],18:[function(require,module,exports){
var _ = require(«lodash»),
inherits = require(«inherits-js»),
Writer;

/**
* Writer
*
* @class Writer
* @constructor
* @abstract
*
* @param {Window} window
* @param {Object} [options]
*
* @author Sergey Kamardin
*/
Writer = function(window, options) {
this.window = window;
this.options = _.extend({}, this.constructor.DEFAULTS, options);
};

Writer.DEFAULTS = {};

Writer.prototype = {
constructor: Writer,

/**
* @abstract
*/
write: function(message) {
throw new Error(«Method ‘write’ must be implemented»);
},

stringifyMessage: function(message) {
return JSON.stringify(message);
}
};

Writer.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Writer;
},{«inherits-js»:80,»lodash»:»7ZYSzK»}],19:[function(require,module,exports){
var Writer = require(«../writer»),
_ = require(«lodash»),
assert = require(«assert»),
HashWriter;

/**
* HashWriter
*
* @class HashWriter
* @extends Writer
* @author Sergey Kamardin
*/
HashWriter = Writer.extend(
/**
* @lends HashWriter.prototype
*/
{
constructor: function(window, options) {
Writer.prototype.constructor.apply(this, arguments);
assert(!_.isUndefined(options.location), «Other window location is necessary option for hash communication»);
this.location = options.location;
},

/**
*
* @param {Array|Object} messages
*/
write: function(messages) {
var self = this,
buffer;

assert(!_.isUndefined(messages), «Message is expected to be an Object or Array»);

if (!_.isArray(messages)) {
messages = [messages]
}

buffer = [];

buffer.push(this.location.indexOf(«#») !== -1 ? «» : «#!»);

_.forEach(messages, function(message) {
buffer.push(self.stringifyMessage(message));
});

this.window.location.replace(this.location + buffer.join(»));
},

stringifyMessage: function(message) {
return ‘(%’ + Writer.prototype.stringifyMessage.call(this, message) + ‘%)’;
}
}
);

module.exports = HashWriter;
},{«../writer»:18,»assert»:62,»lodash»:»7ZYSzK»}],20:[function(require,module,exports){
var Writer = require(«../writer»),
_ = require(«lodash»),
assert = require(«assert»),
PostMessageWriter;

/**
* PostMessageWriter
*
* @class PostMessageWriter
* @extends Writer
* @author Sergey Kamardin
*/
PostMessageWriter = Writer.extend(
/**
* @lends PostMessageWriter.prototype
*/
{
write: function(messages) {
var self = this;

assert(!_.isUndefined(messages), «Message is expected to be an Object or Array»);

if (!_.isArray(messages)) {
messages = [messages]
}

_.forEach(messages, function(message) {
self.window.postMessage(self.stringifyMessage(message), self.options.origin);
});
}
},

/**
* @lends PostMessageWriter
*/
{
DEFAULTS: {
origin: «*»
}
}
);

module.exports = PostMessageWriter;

},{«../writer»:18,»assert»:62,»lodash»:»7ZYSzK»}],21:[function(require,module,exports){
var _ = require(«lodash»),
inherits = require(«inherits-js»),
Cookie;

/**
* Cookie
*
* @class Cookie
* @constructor
* @abstract
*
* @param {Object} [options]
*
* @author Sergey Kamardin
*/
Cookie = function(options) {
this.options = _.extend({}, this.constructor.DEFAULTS, options);
};

Cookie.DEFAULTS = {};

Cookie.prototype = {
constructor: Cookie,

/**
* @abstract
*/
get: function(key) {
throw new Error(«Method ‘get’ must be implemented»);
},

/**
* @abstract
*/
set: function(key, value, options) {
throw new Error(«Method ‘set’ must be implemented»);
},

/**
* @abstract
*/
remove: function(key) {
throw new Error(«Method ‘remove’ must be implemented»);
},

/**
* @abstract
*/
wait: function(key, options, done) {
throw new Error(«Method ‘wait’ must be implemented»);
},

/**
* @abstract
*/
all: function() {
throw new Error(«Method ‘all’ must be implemented»);
}
};

Cookie.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Cookie;
},{«inherits-js»:80,»lodash»:»7ZYSzK»}],»/common/script/src/cookie/service/default.js»:[function(require,module,exports){
module.exports=require(‘UIXSt0’);
},{}],»UIXSt0″:[function(require,module,exports){
var Cookie = require(«../service»),
_ = require(«lodash»),
DefaultCookie;

/**
* DefaultCookie
*
* @class DefaultCookie
* @extends Cookie
* @author Sergey Kamardin
*/
DefaultCookie = Cookie.extend(
/**
* @lends DefaultCookie.prototype
*/
{
constructor: function() {
Cookie.prototype.constructor.apply(this, arguments);
this.namespace = this.options.namespace == «» ? «» : this.options.namespace + «.»;
},

/**
* Get out cookie by filter function
*
* @param {string} key
*
* @returns mixed|null
*/
get: function(key) {
var result = null;

this.each(function(value, name) {
if (name === key) {
result = value;
return true;
}
});

return result;
},

/**
* Sets cookie with options
*
* @param {string} key
* @param {string} value
* @param {Object} options
*/
set: function(key, value, options) {
var self = this,
installString, pairs;

// If is given a hash of values
if (_.isObject(key)) {
pairs = _.reduce(key, function(pairs, value, name) {
pairs.push([name, value]);
return pairs;
}, []);
options = value || {};
} else {
pairs = [[name, value]];
options = options || {};
}

// Prepare options
options = _.reduce(_.extend({}, this.options.store, options), function(options, value, option) {
switch (option) {
case «expires»: {
options[option] = self.expire(value);
break;
}

case «path»:
case «domain»: {
options[option] = value;
break;
}

default: {
//
}
}

return options;
}, {});

_.each(pairs, function(pair) {
var name = pair[0],
value = pair[1];

if (!_.isString(value)) throw new TypeError(«Set value must be a string»);

installString = self.wrap(self.trim(name), self.namespace) + «=» + value;
_.each(options, function(value, key) {
installString+= «; » + key + «=» + value;
});

document.cookie = installString;
});
},

/**
* Removes cookie
*
* @param {string} key
*/
remove: function(key) {
this.set(key, «», {expires: -1});
},

/**
* Waits for cookie
*
* @param key
* @param options
* @param done
*/
wait: function(key, options, done) {
var self = this,
counter, start, delay, ticker, intervalID;

if (_.isFunction(options)) {
done = options;
options = {};
}

if (_.isNumber(options)) {
options = {
time: options
};
}

options = _.extend(options || {}, self.options.wait);

counter = 0;
start = this.stamp();
delay = Math.floor(options.time / options.ticks);

ticker = function() {
var mustBreak, current, duration;

current = self.get(name);

counter++;
duration = self.stamp() — start;

mustBreak = false;
mustBreak = mustBreak || current !== options.exclude;
mustBreak = mustBreak || counter > options.ticks;
mustBreak = mustBreak || duration > options.time;

if (mustBreak) {
done(null, current);
}

return mustBreak;
};

if (!ticker()) {
intervalID = setInterval(function() {
if (ticker()) clearInterval(intervalID);
},delay);
}
},

/**
* Retrieves all cookies.
*
* @returns {Object}
*/
all: function() {
var memo;

memo = {};

this.each(function(value, name) {
memo[name] = value;
});

return memo;
},

/**
* @private
*/
stamp: function() {
return (new Date()).getTime();
},

/**
* @private
* @param value
* @param prefix
* @returns {*}
*/
wrap: function(value, prefix) {
if (_.isString(value)) {
value = prefix + value;
}

return value;
},

/**
* @private
* @param value
* @param prefix
* @returns {*}
*/
unwrap: function(value, prefix) {
if (_.isString(value)) {
if (value.indexOf(prefix) == 0) {
value = value.substr(prefix.length);
}
}

return value;
},

trim: function(str) {
var native;

if (_.isFunction(native = String.prototype.trim)) {
return native.call(str);
}

return str.replace(/^\s+|\s+$/g, »);
},

/**
* @private
* @param time
* @returns {string}
*/
expire: function(time) {
var date = new Date();
date.setTime(date.getTime() + parseInt(time, 10));
return date.toUTCString();
},

/**
* Each cookie iterator
*
* @private
* @param {Function} iterator
* @param {Object} [context]
*/
each: function(iterator, context) {
var cookies, len, x, split, name, value;

if (!_.isFunction(iterator)) {
return;
}

if ((cookies = document.cookie).length == 0) {
return;
}

cookies = cookies.split(«;»);
len = cookies.length;

try {
for (x = 0; x < len; x++) { split = cookies[x].split("="); name = this.unwrap(this.trim(split[0]), this.namespace); value = decodeURIComponent(split[1]); if (iterator.call(context, value, name) != void 0) { return; } } } catch (e) { return; } } }, { DEFAULTS: { wait: { time: 3000, ticks: 10 }, namespace: "", store: { path: "/" } } } ); module.exports = DefaultCookie; },{"../service":21,"lodash":"7ZYSzK"}],24:[function(require,module,exports){ /** * Bus * * @package Bus * @author Sergey Kamardin
*/

var _ = require(«lodash»),
inherits = require(«inherits-js»),
Bus;

Bus = function(options) {
this.options = _.extend({}, this.constructor.DEFAULTS, options);
};

Bus.DEFAULTS = {};

Bus.prototype = {
constructor: Bus,

on: function(event, filter, callback, context) {
throw new Error(«Method must be implemented»);
},

once: function(event, filter, callback, context) {
throw new Error(«Method must be implemented»);
},

off: function(event, filter, callback, context) {
throw new Error(«Method must be implemented»);
},

emit: function(event) {
throw new Error(«Method must be implemented»);
}
};

Bus.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Bus;
},{«inherits-js»:80,»lodash»:»7ZYSzK»}],»ICIzPU»:[function(require,module,exports){
var Bus = require(«../bus»),
EventEmitter = require(«../emitter/node»),
_ = require(«lodash»),
EmitterBus;

/**
* EmitterBus
*
* @class EmitterBus
* @extends Bus
* @author Sergey Kamardin
*/
EmitterBus = Bus.extend(
/**
* @lends EmitterBus.prototype
*/
{
constructor: function() {
this.emitter = new EventEmitter;
this.listeners = [];
},

_getListener: function(event, filter, callback, context) {
var listener, obj;

if (_.isFunction())

if (_.isFunction(filter) && !_.isFunction(callback)) {
context = callback;
callback = filter;
filter = null;
}

obj = {
event: event,
filter: filter,
callback: callback,
context: context
};

if (!(listener = _.find(this.listeners, obj))) {
listener = _.extend(obj, {
func: function() {
var valid;

valid = true;

if (_.isFunction(filter)) {
valid = valid && filter.apply(context, arguments);
}

if (valid) {
callback.apply(context, arguments);
}
}
});

this.listeners.push(listener);
}

return listener.func;
},

on: function(event, filter, callback, context) {
this.emitter.on(event, this._getListener.apply(this, arguments));
},

once: function(event, filter, callback, context) {
this.emitter.once(event, this._getListener.apply(this, arguments));
},

off: function(event, filter, callback, context) {
if (!_.isFunction(filter)) {
this.emitter.removeAllListeners(event);
} else {
this.emitter.removeListener(event, this._getListener.apply(this, arguments));
}
},

emit: function(event) {
this.emitter.emit.apply(this.emitter, arguments);
}
}
);

module.exports = EmitterBus;
},{«../bus»:24,»../emitter/node»:31,»lodash»:»7ZYSzK»}],»/common/script/src/events/bus/emitter.js»:[function(require,module,exports){
module.exports=require(‘ICIzPU’);
},{}],27:[function(require,module,exports){
var _ = require(«lodash»),
inherits = require(«inherits-js»),
ElementEventManager;

/**
* ElementEventManager
*
* @class ElementEventManager
* @constructor
* @abstract
*
* @param {Object} [options]
*
* @author Sergey Kamardin
*/
ElementEventManager = function(options) {
this.options = _.extend({}, this.constructor.DEFAULTS, options);
};

ElementEventManager.DEFAULTS = {};

ElementEventManager.prototype = {
constructor: ElementEventManager,

/**
* @abstract
*/
on: function(target, topic, handler) {
throw new Error(«Method ‘on’ must be implemented»);
},

/**
* @abstract
*/
once: function(target, topic, handler) {
throw new Error(«Method ‘once’ must be implemented»);
},

/**
* @abstract
*/
off: function(target, topic, handler) {
throw new Error(«Method ‘off’ must be implemented»);
}
};

ElementEventManager.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = ElementEventManager;
},{«inherits-js»:80,»lodash»:»7ZYSzK»}],»4MvLV1″:[function(require,module,exports){
var ElementEventManager = require(«../element»),
_ = require(«lodash»),
DefaultElementEventManager;

/**
* DefaultElementEventManager
*
* @class DefaultElementEventManager
* @extends ElementEventManager
* @author Sergey Kamardin
*/
DefaultElementEventManager = ElementEventManager.extend(
/**
* @lends DefaultElementEventManager.prototype
*/
{
constructor: function() {
ElementEventManager.prototype.constructor.apply(this, arguments);
this.guid = 0;
},

on: function(target, topic, handler) {
var self = this,
events, pool;

if (!(events = target._events)) {
target._events = events = {};

target._handle = function(event) {
if (typeof event !== «undefined») {
return self._handle.call(self, target, event);
}
}
}

if (!(pool = events[topic])) {
events[topic] = pool = [];

if (target.addEventListener) {
target.addEventListener(topic, target._handle, false);
} else if (target.attachEvent) {
target.attachEvent(«on» + topic, target._handle);
}
}

pool.push(handler);
},

off: function(target, topic, handler) {
var events, handlers;

if (!(events = target._events) || !(handlers = events[topic])) {
return;
}

if (handler) {
_.remove(handlers, function(existing) {
return existing === handler;
});
}

if (!handler || _.isEmpty(handlers)) {
delete events[topic];

if (target.removeEventListener) {
target.removeEventListener(topic, target._handle, false);
} else if (target.detachEvent) {
target.detachEvent(«on» + topic, target._handle);
}
}

if (_.isEmpty(target._events)) {
try {
delete target._events;
delete target._handle;
} catch(err) {
target[«_events»] = void 0;
target[«_handle»] = void 0;
}
}
},

once: function(target, topic, handler) {
var self = this,
once;

once = function(event) {
handler.call(null, event);
self.off(target, topic, once);
};

this.on(target, topic, once);
},

_handle: function(target, event) {
var events, handlers;

if ((events = target._events) && (handlers = events[event.type])) {
// here we slicing, cause in `once` case array could change
// after handler#call
_.forEach(handlers.slice(), function(handler) {
handler.call(null, event);
});
}
}
}
);

module.exports = DefaultElementEventManager;
},{«../element»:27,»lodash»:»7ZYSzK»}],»/common/script/src/events/element/default.js»:[function(require,module,exports){
module.exports=require(‘4MvLV1’);
},{}],30:[function(require,module,exports){
/**
* Abstract EventEmitter.
*
* @package EventEmitter
* @author Sergey Kamardin
*/

var _ = require(«lodash»),
inherits = require(«inherits-js»),
EventEmitter;

EventEmitter = function(options) {
this.options = _.extend({}, this.constructor.DEFAULTS, options);
};

EventEmitter.DEFAULTS = {};
EventEmitter.ALL = «*»;

EventEmitter.prototype = {
constructor: EventEmitter,

/**
* Add listener.
*
* @param event
* @param listener
*/
addListener: function(event, listener) {
throw new Error(«Method must be implemented»);
},

/**
* @proxy addListener
* @param event
* @param listener
*/
on: function(event, listener) {
throw new Error(«Method must be implemented»);
},

/**
* Add listener for one event.
*
* @param event
* @param listener
*/
once: function(event, listener) {
throw new Error(«Method must be implemented»);
},

/**
* Removes listener.
*
* @param event
* @param listener
*/
removeListener: function(event, listener) {
throw new Error(«Method must be implemented»);
},

/**
* @proxy removeListener|removeAllListeners
* @param [event]
* @param [listener]
*/
off: function(event, listener) {
throw new Error(«Method must be implemented»);
},

/**
* Removes all listeners.
* @param [event]
*/
removeAllListeners: function(event) {
throw new Error(«Method must be implemented»);
},

/**
* Sets maximum for listeners.
*
* @param n
*/
setMaxListeners: function(n) {
throw new Error(«Method must be implemented»);
},

/**
* Return list of listeners.
*
* @param event
* @returns Array
*/
listeners: function(event) {
throw new Error(«Method must be implemented»);
},

/**
* Emits event.
* @param event
*/
emit: function(event) {
throw new Error(«Method must be implemented»);
}
};

EventEmitter.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = EventEmitter;
},{«inherits-js»:80,»lodash»:»7ZYSzK»}],31:[function(require,module,exports){
/**
* Emitter
*
* @package Emitter
* @author Sergey Kamardin
*/

var Emitter = require(«../emitter»),
EventEmitter = require(«events»).EventEmitter,
_ = require(«lodash»);

module.exports = Emitter.extend({
constructor: function() {
Emitter.prototype.constructor.apply(this, arguments);
this._emitter = new EventEmitter;
},

/**
* Add listener.
*
* @param event
* @param listener
*/
addListener: function(event, listener) {
return this._emitter.addListener(event, listener);
},

/**
* @proxy addListener
* @param event
* @param listener
*/
on: function(event, listener) {
return this._emitter.on(event, listener);
},

/**
* Add listener for one event.
*
* @param event
* @param listener
*/
once: function(event, listener) {
return this._emitter.once(event, listener);
},

/**
* Removes listener.
*
* @param event
* @param listener
*/
removeListener: function(event, listener) {
return this._emitter.removeListener(event, listener);
},

/**
* @proxy removeListener|removeAllListeners
* @param [event]
* @param [listener]
*/
off: function(event, listener) {
if (!_.isUndefined(listener)) {
return this._emitter.removeListener(event, listener);
} else {
return this.removeAllListeners(event);
}
},

/**
* Removes all listeners.
* @param [event]
*/
removeAllListeners: function(event) {
return this._emitter.removeAllListeners(event);
},

/**
* Sets maximum for listeners.
*
* @param n
*/
setMaxListeners: function(n) {
return this._emitter.setMaxListeners(n);
},

/**
* Return list of listeners.
*
* @param event
* @returns Array
*/
listeners: function(event) {
return this._emitter.listeners(event);
},

/**
* Emits event.
* @param event
*/
emit: function(event) {
var args;

// construct args for all event
args = Array.prototype.slice.call(arguments);
args.unshift(Emitter.ALL);

// emit normal event
this._emitter.emit.apply(this._emitter, arguments);

// emit all event
this._emitter.emit.apply(this._emitter, args);
}
});
},{«../emitter»:30,»events»:63,»lodash»:»7ZYSzK»}],32:[function(require,module,exports){
/**
* Handler
*
* @package Handler
* @author Sergey Kamardin
*/

var _ = require(«lodash»),
inherits = require(«inherits-js»),
Handler;

Handler = function(options) {
this.options = _.extend({}, this.constructor.DEFAULTS, options);
};

Handler.DEFAULTS = {};

Handler.prototype = {
constructor: Handler,

handle: function(event) {
throw new Error(«Method must be implemented»);
}
};

Handler.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Handler;
},{«inherits-js»:80,»lodash»:»7ZYSzK»}],»/common/script/src/events/handler/bus.js»:[function(require,module,exports){
module.exports=require(‘afxkls’);
},{}],»afxkls»:[function(require,module,exports){
/**
* Event handler
*
* @package Handler
* @author Sergey Kamardin
*/

var Handler = require(«../handler»),
_ = require(«lodash»),
RSVP = require(«rsvp»);

module.exports = Handler.extend({
setBus: function(bus) {
this.bus = bus;
},

handle: function() {
this.bus.emit.apply(this.bus, arguments);
}
});

},{«../handler»:32,»lodash»:»7ZYSzK»,»rsvp»:84}],35:[function(require,module,exports){
var _ = require(«lodash»),
EventEmitter = require(«../emitter»);

module.exports = {
_proxy: function(event, options) {
var self = this,
prefixer, isAll;

if (_.isObject(event) || _.isUndefined(event)) {
options = event;
event = EventEmitter.ALL;
}

isAll = event === EventEmitter.ALL;

options = options || {};

prefixer = options.prefixer || function(event) {
return event;
};

return function() {
var args;

args = Array.prototype.slice.call(arguments);

options.self && args.unshift(self);
args.unshift(prefixer(isAll ? args.shift() : event));

self.emit.apply(self, args);

_.forEach(self.handlers, function(handler) {
handler.handle.apply(handler, args)
});
}
}
};
},{«../emitter»:30,»lodash»:»7ZYSzK»}],36:[function(require,module,exports){
var _ = require(«lodash»),
inherits = require(«inherits-js»),
assert = require(«assert»),
Query;

/**
* Query
*
* @class Query
* @constructor
* @abstract
*
* @param {Object} [options]
*
* @author Sergey Kamardin
*/
Query = function(options) {
this.options = _.extend({}, this.constructor.DEFAULTS, options);
};

Query.DEFAULTS = {};

Query.prototype = {
constructor: Query,

/**
* @abstract
*/
getQuery: function(property) {
throw new Error(«Method ‘getQuery’ must be implemented»);
},

/**
* @abstract
*/
getReferrer: function() {
throw new Error(«Method ‘getReferrer’ must be implemented»);
},

/**
* @abstract
*/
getPathName: function() {
throw new Error(«Method ‘getPathName’ must be implemented»);
},

/**
* @abstract
*/
getOrigin: function() {
throw new Error(«Method ‘getOrigin’ must be implemented»);
},

/**
* @abstract
*/
getHostName: function() {
throw new Error(«Method ‘getHostName’ must be implemented»);
},

/**
* @abstract
*/
getURL: function() {
throw new Error(«Method ‘getURL’ must be implemented»);
}

};

Query.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Query;
},{«assert»:62,»inherits-js»:80,»lodash»:»7ZYSzK»}],»/common/script/src/location/query/document.js»:[function(require,module,exports){
module.exports=require(‘sr8Lnt’);
},{}],»sr8Lnt»:[function(require,module,exports){
var Query = require(«../query»),
_ = require(«lodash»),
assert = require(«assert»),
DocumentQuery;

/**
* DocumentQuery
*
* @class DocumentQuery
* @extends Query
* @author Sergey Kamardin
*/
DocumentQuery = Query.extend(
/**
* @lends DocumentQuery.prototype
*/
{
constructor: function() {
Query.prototype.constructor.apply(this, arguments);
this.queryCache = null;
},

getQuery: (function() {
// Extractor regexp
// Search masks are:
// 1) name
// 2) isArray sign
// 3) value
var pattern = new RegExp(«[\\?&]([a-zA-Z0-9\\-\\.\\_\\~]+)(\\[\\])?=([^&#]*)», «g»);

function extractor(query) {
var parameters = {},
result, name, isArr, value;

try {
while ((result = pattern.exec(decodeURIComponent(query))) != null) {
name = result[1];
isArr = result[2];
value = result[3].replace(/\+/g, » «);

if (isArr) {
parameters[name] ? parameters[name].push(value) : (parameters[name] = [value]);
} else {
parameters[name] = value;
}
}
} catch (e) {}

return parameters;
}

return function(parameter) {
if (this.queryCache != document.location.search) {
this.query = extractor(document.location.search);
this.queryCache = document.location.search;
}

return parameter ? (this.query[parameter] || null) : this.query;
}

})(),

getOrigin: function() {
return document.location.origin;
},

getHostName: function() {
return document.location.hostname;
},

getPathName: function() {
return document.location.pathname;
},

getReferrer: function() {
return document.referrer;
},

getURL: function() {
return document.location.href;
},

extractHostName: function(value) {
assert(_.isString(value), «String is expected»);
return value.replace(this.constructor.hostNameRegex, ‘$1’);
}
},

{
hostNameRegex: /^([a-z]{3,5}:\/\/)?([^:/]+)(:\d+)?([^:]+)?$/i
}
);

module.exports = DocumentQuery;

},{«../query»:36,»assert»:62,»lodash»:»7ZYSzK»}],39:[function(require,module,exports){
module.exports = {
linear: function(t, b, c, d) {
return c*(t/=d) + b;
},
easeInQuad: function (t, b, c, d) {
return c*(t/=d)*t + b;
},
easeOutQuad: function (t, b, c, d) {
return -c *(t/=d)*(t-2) + b;
},
easeInOutQuad: function (t, b, c, d) {
if ((t/=d/2) < 1) return c/2*t*t + b; return -c/2 * ((--t)*(t-2) - 1) + b; }, easeInCubic: function (t, b, c, d) { return c*(t/=d)*t*t + b; }, easeOutCubic: function (t, b, c, d) { return c*((t=t/d-1)*t*t + 1) + b; }, easeInOutCubic: function (t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t*t + b; return c/2*((t-=2)*t*t + 2) + b; }, easeInQuart: function (t, b, c, d) { return c*(t/=d)*t*t*t + b; }, easeOutQuart: function (t, b, c, d) { return -c * ((t=t/d-1)*t*t*t - 1) + b; }, easeInOutQuart: function (t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t*t*t + b; return -c/2 * ((t-=2)*t*t*t - 2) + b; }, easeInQuint: function (t, b, c, d) { return c*(t/=d)*t*t*t*t + b; }, easeOutQuint: function (t, b, c, d) { return c*((t=t/d-1)*t*t*t*t + 1) + b; }, easeInOutQuint: function (t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; return c/2*((t-=2)*t*t*t*t + 2) + b; }, easeInSine: function (t, b, c, d) { return -c * Math.cos(t/d * (Math.PI/2)) + c + b; }, easeOutSine: function (t, b, c, d) { return c * Math.sin(t/d * (Math.PI/2)) + b; }, easeInOutSine: function (t, b, c, d) { return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; }, easeInExpo: function (t, b, c, d) { return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; }, easeOutExpo: function (t, b, c, d) { return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; }, easeInOutExpo: function (t, b, c, d) { if (t==0) return b; if (t==d) return b+c; if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; }, easeInCirc: function (t, b, c, d) { return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; }, easeOutCirc: function (t, b, c, d) { return c * Math.sqrt(1 - (t=t/d-1)*t) + b; }, easeInOutCirc: function (t, b, c, d) { if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; }, easeInElastic: function (t, b, c, d) { var s=1.70158;var p=0;var a=c; if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; if (a < Math.abs(c)) { a=c; s=p/4; } else s = p/(2*Math.PI) * Math.asin (c/a); return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; }, easeOutElastic: function (t, b, c, d) { var s=1.70158;var p=0;var a=c; if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; if (a < Math.abs(c)) { a=c; s=p/4; } else s = p/(2*Math.PI) * Math.asin (c/a); return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; }, easeInOutElastic: function (t, b, c, d) { var s=1.70158;var p=0;var a=c; if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); if (a < Math.abs(c)) { a=c; s=p/4; } else s = p/(2*Math.PI) * Math.asin (c/a); if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; }, easeInBack: function (t, b, c, d, s) { if (s == undefined) s = 1.70158; return c*(t/=d)*t*((s+1)*t - s) + b; }, easeOutBack: function (t, b, c, d, s) { if (s == undefined) s = 1.70158; return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; }, easeInOutBack: function (t, b, c, d, s) { if (s == undefined) s = 1.70158; if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; }, easeOutBounce: function (t, b, c, d) { if ((t/=d) < (1/2.75)) { return c*(7.5625*t*t) + b; } else if (t < (2/2.75)) { return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; } else if (t < (2.5/2.75)) { return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; } else { return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; } } }; },{}],40:[function(require,module,exports){ var _ = require("lodash"), inherits = require("inherits-js"), Source; /** * Source * * @class Source * @constructor * @abstract * * @param {Object} [options] * * @author Sergey Kamardin
*/
Source = function(options) {
this.options = _.extend({}, this.constructor.DEFAULTS, options);
};

Source.DEFAULTS = {};

Source.prototype = {
constructor: Source,

/**
* @abstract
*/
get: function(parameter, done) {
throw new Error(«Method ‘get’ must be implemented»);
}
};

Source.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Source;
},{«inherits-js»:80,»lodash»:»7ZYSzK»}],»4VLKn9″:[function(require,module,exports){
var Source = require(«../source»),
_ = require(«lodash»),
async = require(«async»),
assert = require(«assert»),
CompositeSource;

/**
* CompositeSource
*
* @class CompositeSource
* @extends Source
* @author Sergey Kamardin
*/
CompositeSource = Source.extend(
/**
* @lends CompositeSource.prototype
*/
{
constructor: function() {
Source.prototype.constructor.apply(this, arguments);
this.sources = [];
},

addSource: function(source) {
assert(source instanceof Source, «Source is expected»);
this.sources.push(source);
},

get: function(parameter, done) {
async.reduce(this.sources, null, function(value, source, nextSource) {
if (!_.isEmpty(value)) {
nextSource(null, value);
return;
}

source.get(parameter, nextSource);

}, done);
}
}
);

module.exports = CompositeSource;
},{«../source»:40,»assert»:62,»async»:»cEACDx»,»lodash»:»7ZYSzK»}],»/common/script/src/utm/source/composite.js»:[function(require,module,exports){
module.exports=require(‘4VLKn9’);
},{}],43:[function(require,module,exports){
var Source = require(«../source»),
_ = require(«lodash»),
assert = require(«assert»),
Cookie = require(«../../cookie/service»),
CookieSource;

/**
* CookieSource
*
* @class CookieSource
* @extends Source
* @author Sergey Kamardin
*/
CookieSource = Source.extend(
/**
* @lends CookieSource.prototype
*/
{
injectCookie: function(cookie) {
assert(_.isEmpty(this.cookie), «Cookie is already set»);
assert(cookie instanceof Cookie, «Cookie is expected»);
this.cookie = cookie;
}
}
);

module.exports = CookieSource;

},{«../../cookie/service»:21,»../source»:40,»assert»:62,»lodash»:»7ZYSzK»}],»/common/script/src/utm/source/cookie/plain.js»:[function(require,module,exports){
module.exports=require(‘Ov31qG’);
},{}],»Ov31qG»:[function(require,module,exports){
var CookieSource = require(«../cookie»),
_ = require(«lodash»),
PlainCookieSource;

/**
* PlainCookieSource
*
* @class PlainCookieSource
* @extends CookieSource
* @author Sergey Kamardin
*/
PlainCookieSource = CookieSource.extend(
/**
* @lends PlainCookieSource.prototype
*/
{
get: function(parameter, done) {
try {
done(null, this.cookie.get(parameter));
} catch (err) {
done(err);
}
}
}
);

module.exports = PlainCookieSource;
},{«../cookie»:43,»lodash»:»7ZYSzK»}],»lrpT+8″:[function(require,module,exports){
var CookieSource = require(«../cookie»),
_ = require(«lodash»),
UtmzCookieSource;

/**
* UtmzCookieSource
*
* @class UtmzCookieSource
* @extends CookieSource
* @author Sergey Kamardin
*/
UtmzCookieSource = CookieSource.extend(
/**
* @lends UtmzCookieSource.prototype
*/
{
mapping: {
utm_campaign: 6,
utm_medium: 7,
utm_term: 8
},

get: function(parameter, done) {
var self = this,
index;

if (!_.has(this.mapping, parameter)) {
done(null, null);
return;
}

index = this.mapping[parameter];

this.cookie.wait(«__utmz», this.options.wait, function(err, utmz) {
var match, result;

if (err) {
done(err);
return;
}

if (_.isString(utmz)) {
if (match = utmz.match(self.constructor.REGEXP)) {
result = match[index];
}

done(null, result || null);
return;
}

done(null, null);
});
}
},

{
// Retreiver from google’s utmz cookie
// Groups are:
// 1) domain hash
// 2) last update time in unix time format
// 3) time of visits fro resource by referrers from other pages
// 4) unique number of referrer pages
// 5) utmcsr — search engine
// 6) utmccn — adwords campaign (utm_campaign)
// 7) utmcmd — name of campaign (utm_medium)
// 8) utmctr — key words of search.
REGEXP: /([a-f0-9]+)\.(\d+)\.(\d+).(\d+)\.utmcsr=([^|]+)\|utmccn=([^|]*)\|utmcmd=([^|]*)\|utmctr=([^|]*)/i
}
);

module.exports = UtmzCookieSource;

},{«../cookie»:43,»lodash»:»7ZYSzK»}],»/common/script/src/utm/source/cookie/utmz.js»:[function(require,module,exports){
module.exports=require(‘lrpT+8’);
},{}],48:[function(require,module,exports){
var Source = require(«../source»),
_ = require(«lodash»),
assert = require(«assert»),
Query = require(«../../location/query»),
QuerySource;

/**
* QuerySource
*
* @class QuerySource
* @extends Source
* @author Sergey Kamardin
*/
QuerySource = Source.extend(
/**
* @lends QuerySource.prototype
*/
{
injectQuery: function(query) {
assert(_.isEmpty(this.query), «Query is already set»);
assert(query instanceof Query, «Query is expected»);
this.query = query;
}
}
);

module.exports = QuerySource;
},{«../../location/query»:36,»../source»:40,»assert»:62,»lodash»:»7ZYSzK»}],»A5jZcW»:[function(require,module,exports){
var QuerySource = require(«../query»),
_ = require(«lodash»),
LPQuerySource;

/**
* LPQuerySource
*
* @class LPQuerySource
* @extends QuerySource
* @author Sergey Kamardin
*/
LPQuerySource = QuerySource.extend(
/**
* @lends LPQuerySource.prototype
*/
{
get: function(parameter, done) {
if (parameter !== «lp») {
done(null, null);
return;
}

done(null, this.query.getOrigin() + this.query.getPathName());
}
}
);

module.exports = LPQuerySource;
},{«../query»:48,»lodash»:»7ZYSzK»}],»/common/script/src/utm/source/query/lp.js»:[function(require,module,exports){
module.exports=require(‘A5jZcW’);
},{}],»/common/script/src/utm/source/query/plain.js»:[function(require,module,exports){
module.exports=require(‘lMplo+’);
},{}],»lMplo+»:[function(require,module,exports){
var QuerySource = require(«../query»),
_ = require(«lodash»),
PlainQuerySource;

/**
* PlainQuerySource
*
* @class PlainQuerySource
* @extends QuerySource
* @author Sergey Kamardin
*/
PlainQuerySource = QuerySource.extend(
/**
* @lends PlainQuerySource.prototype
*/
{
get: function(parameter, done) {
done(null, this.query.getQuery(parameter));
}
}
);

module.exports = PlainQuerySource;
},{«../query»:48,»lodash»:»7ZYSzK»}],»w3TYPB»:[function(require,module,exports){
var QuerySource = require(«../query»),
_ = require(«lodash»),
UtmSourceQuerySource;

/**
* UtmSourceQuerySource
*
* @class UtmSourceQuerySource
* @extends QuerySource
* @author Sergey Kamardin
*/
UtmSourceQuerySource = QuerySource.extend(
/**
* @lends UtmSourceQuerySource.prototype
*/
{
get: function(parameter, done) {
var host, referrer,
result;

if (parameter !== «utm_source») {
done(null, null);
return;
}

host = this.query.getHostName();
referrer = this.query.getReferrer();

if (_.isEmpty(referrer)) {
done(null, null);
return;
}

result = this.normalize(host) !== this.normalize(this.query.extractHostName(referrer)) ? referrer : null;

done(null, result);
},

/**
* @private
* @param value
*/
normalize: function(value) {
return (value.indexOf(‘www.’) == 0) ? value.substring(4) : value;
}
}
);

module.exports = UtmSourceQuerySource;
},{«../query»:48,»lodash»:»7ZYSzK»}],»/common/script/src/utm/source/query/utm_source.js»:[function(require,module,exports){
module.exports=require(‘w3TYPB’);
},{}],55:[function(require,module,exports){
var _ = require(«lodash»),
assert = require(«assert»),
inherits = require(«inherits-js»),
Source = require(«./source»),
Cookie = require(«../cookie/service»),
UTM;

/**
* UTM
*
* @class UTM
* @constructor
* @abstract
*
* @param {Object} [options]
*
* @author Sergey Kamardin
*/
UTM = function(options) {
this.options = _.extend({}, this.constructor.DEFAULTS, options);
this.sources = [];
};

UTM.DEFAULTS = {};

UTM.prototype = {
constructor: UTM,

injectCookie: function(cookie) {
assert(_.isEmpty(this.cookie), «Cookie is already set»);
assert(cookie instanceof Cookie, «Cookie is expected»);
this.cookie = cookie;
},

addSource: function(source, isSupplement) {
assert(source instanceof Source, «Source is expected»);
this.sources.push({ source: source, isSupplement: isSupplement });
},

/**
* @abstract
*/
get: function(done) {
throw new Error(«Method ‘get’ must be implemented»);
}
};

UTM.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = UTM;
},{«../cookie/service»:21,»./source»:40,»assert»:62,»inherits-js»:80,»lodash»:»7ZYSzK»}],»/common/script/src/utm/utm/default.js»:[function(require,module,exports){
module.exports=require(‘M+jhLg’);
},{}],»M+jhLg»:[function(require,module,exports){
var UTM = require(«../utm»),
_ = require(«lodash»),
async = require(«async»),
DefaultUTM;

/**
* DefaultUTM
*
* @class DefaultUTM
* @extends UTM
* @author Sergey Kamardin
*/
DefaultUTM = UTM.extend(
/**
* @lends DefaultUTM.prototype
*/
{
get: function(done) {
var self = this,
parameters, necessary;

parameters = _.pluck(this.constructor.PARAMETERS, «name»);
necessary = _.chain(this.constructor.PARAMETERS)
.where({ necessary: true })
.pluck(«name»)
.value();

function isFull(utm) {
return _.difference(necessary, _.keys(utm)).length === 0;
}

async.reduce(
this.sources,
{},
function(result, definition, nextSource) {
var need, isSupplement, isMain;

isSupplement = definition.isSupplement;

if ((isMain = !isSupplement) && isFull(result)) {
nextSource(null, result);
return;
}

need = isSupplement ? _.difference(parameters, _.keys(result)) : parameters;

async.reduce(
need,
{},
function(utm, parameter, nextParameter) {
definition.source.get(parameter, function(err, value) {
if (err) {
nextParameter(err);
return;
}

if (!_.isEmpty(value)) {
utm[parameter] = value;
}

nextParameter(null, utm);
});
},
function(err, utm) {
if (err) {
nextSource(err);
return;
}

// if source is main and gave us all necessary fields
// then modify final result
if (isMain && !isFull(utm)) {
nextSource(null, result);
return;
}

nextSource(null, _.extend({}, result, utm));
}
);
},
function(err, result) {
if (err) {
done(err);
return;
}

self.cookie.set(result, self.options.cookie);

done(null, result);
}
);
}
},

{
PARAMETERS: [
{
name: «utm_source»,
necessary: true
},
{
name: «utm_medium»,
necessary: false
},
{
name: «utm_campaign»,
necessary: false
},
{
name: «utm_term»,
necessary: false
},
{
name: «utm_content»,
necessary: false
},
{
name: «wm»,
necessary: false
},
{
name: «sid»,
necessary: false
},
{
name: «lp»,
necessary: false
}
],

DEFAULTS: {
cookie: {
// per 3 hours
expires: 1000 * 60 * 60 * 3
}
}
}
);

module.exports = DefaultUTM;
},{«../utm»:55,»async»:»cEACDx»,»lodash»:»7ZYSzK»}],58:[function(require,module,exports){
var Subscriber = require(«./subscriber»),
utils = require(«./utils»),

resolve = utils.resolve,
reject = utils.reject,
noop = utils.noop,

Promise;

Promise = function(resolver, options) {
var self = this,
doResolve, doReject;

if (!(this instanceof Promise)) {
throw new TypeError(«Failed to construct ‘Promise’: Please use the ‘new’ operator, this object constructor cannot be called as a function.»);
}

if (!utils.isFunction(resolver)) {
throw new TypeError(‘You must pass a resolver function as the first argument to the promise constructor’);
}

this.options = utils.extend({}, this.constructor.DEFAULTS, options || {});

this._subscribers = [];

this._state = null;
this._value = null;
this._error = null;

doResolve = resolve(this);
doReject = reject(this);

try {
resolver(doResolve, doReject);
} catch (err) {
doReject(err);
}
};

Promise.DEFAULTS = {};

Promise.prototype = {
constructor: Promise,

«then»: function(onResolve, onReject) {
var subscriber;

this._subscribers.push((subscriber = new Subscriber(onResolve, onReject, new Promise(noop))));

// if promise is fullfilled already
if (!utils.isNull(this._state)) {
this._state ? subscriber.resolve(this._value) : subscriber.reject(this._error);
}

return subscriber.promise;
},

«finally»: function(onAnyWay) {
return this.then(function(value) {
onAnyWay(null, value);
}, function(err) {
onAnyWay(err);
});
},

«catch»: function(onReject) {
return this.then(null, onReject);
},

/**
* @deprecated
*/
«done»: function() {
return this.value();
},

«value»: function() {
if (!this._state) {
if (this._error) {
throw this._error;
}

throw new Error(«Can not retrieve value from not fullfilled promise»);
}

return this._value;
}
};

Promise.all = function(promises, strict) {
return new Promise(function(resolve, reject) {
var i, len, results, remaining, rejected,
target, getComplete, complete, next;

len = promises.length;
remaining = len;
rejected = false;
strict = utils.isBoolean(strict) ? strict : true;

if (!utils.isArray(promises)) {
throw new TypeError(«Array is expected»);
}

results = new Array(len);

if (!remaining) {
resolve(results);
return;
}

getComplete = function(i) {
return function(value) {
results[i] = value;
}
};

next = function() {
remaining—;

if (remaining === 0 && !rejected) {
resolve(results);
}
};

for (i = 0; i < len; i++) { target = promises[i]; complete = getComplete(i); if (target instanceof Promise) { target .then(complete) ['catch'](function(error) { if (strict && !rejected) { reject(error); rejected = true; } }) ['finally'](next); } else { complete(target); next(); } } }); }; Promise.resolve = function(value) { if (value instanceof Promise) { return value; } return new Promise(function(resolve) { resolve(value); }); }; Promise.reject = function(err) { return new Promise(function(resolve, reject) { reject(err); }); }; module.exports = Promise; },{"./subscriber":59,"./utils":60}],59:[function(require,module,exports){ var utils = require("./utils"), resolve = utils.resolve, reject = utils.reject, noop = utils.noop, Subscriber; Subscriber = function(resolve, reject, promise) { this._resolve = resolve; this._reject = reject; this.promise = promise; }; Subscriber.prototype = { constructor: Subscriber, _notify: function(action, error, val) { var response, err, strategy, value; strategy = error ? reject : resolve; value = error ? error : val; if (!utils.isFunction(action)) { strategy(this.promise)(value); return; } try { response = action.call(null, value); } catch(_err) { reject(this.promise)(_err); return; } if (response && response.then && utils.isFunction(response.then)) { response.then(resolve(this.promise), reject(this.promise)); } else { resolve(this.promise)(response); } }, resolve: function(value) { this._notify(this._resolve, null, value); }, reject: function(error) { this._notify(this._reject, error); } }; module.exports = Subscriber; },{"./utils":60}],60:[function(require,module,exports){ function toStringType(obj) { return Object.prototype.toString.call(obj).replace(/\[object\s([a-zA-Z]+)\]/, "$1"); } exports.resolve = function(promise) { return function(value) { if (!exports.isNull(promise._state)) { throw new Error("Can not resolve fulfilled promise"); } promise._state = true; promise._value = value; exports.forEach(promise._subscribers, function(subscriber) { subscriber.resolve(value); }); } }; exports.reject = function(promise) { return function(error) { if (!exports.isNull(promise._state)) { throw new Error("Can not reject fulfilled promise"); } promise._state = false; promise._error = error; exports.forEach(promise._subscribers, function(subscriber) { subscriber.reject(error); }); }; }; exports.isArray = function(obj) { return toStringType(obj) === "Array"; }; exports.isFunction = function(obj) { return toStringType(obj) === "Function"; }; exports.isNull = function(obj) { return toStringType(obj) === "Null"; }; exports.isBoolean = function(obj) { return toStringType(obj) === "Boolean"; }; exports.noop = function() {}; exports.forEach = function(obj, iterator, context) { var len, i; if (!exports.isArray(obj)) { throw new TypeError("Only Array"); } len = obj.length; for (i = 0; i < len; i++) { iterator.call(context, obj[i], i, obj); }; }; exports.extend = function(target) { var args, len, i, prop, source; if ( (len = arguments.length) < 2 || target == null ) { return target; } args = Array.prototype.slice.call(arguments, 1); len-= 1; for (i = 0; i < len; i++) { source = args[i]; for (prop in source) if (source.hasOwnProperty(prop)) { target[prop] = source[prop]; } } return target; }; },{}],61:[function(require,module,exports){ },{}],62:[function(require,module,exports){ // http://wiki.commonjs.org/wiki/Unit_Testing/1.0 // // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! // // Originally from narwhal.js (http://narwhaljs.org) // Copyright (c) 2009 Thomas Robinson <280north.com>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the ‘Software’), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

// when used in node, this will actually load the util module we depend on
// versus loading the builtin util module as happens otherwise
// this is a bug in node module loading as far as I am concerned
var util = require(‘util/’);

var pSlice = Array.prototype.slice;
var hasOwn = Object.prototype.hasOwnProperty;

// 1. The assert module provides functions that throw
// AssertionError’s when particular conditions are not met. The
// assert module must conform to the following interface.

var assert = module.exports = ok;

// 2. The AssertionError is defined in assert.
// new assert.AssertionError({ message: message,
// actual: actual,
// expected: expected })

assert.AssertionError = function AssertionError(options) {
this.name = ‘AssertionError’;
this.actual = options.actual;
this.expected = options.expected;
this.operator = options.operator;
if (options.message) {
this.message = options.message;
this.generatedMessage = false;
} else {
this.message = getMessage(this);
this.generatedMessage = true;
}
var stackStartFunction = options.stackStartFunction || fail;

if (Error.captureStackTrace) {
Error.captureStackTrace(this, stackStartFunction);
}
else {
// non v8 browsers so we can have a stacktrace
var err = new Error();
if (err.stack) {
var out = err.stack;

// try to strip useless frames
var fn_name = stackStartFunction.name;
var idx = out.indexOf(‘\n’ + fn_name);
if (idx >= 0) {
// once we have located the function frame
// we need to strip out everything before it (and its line)
var next_line = out.indexOf(‘\n’, idx + 1);
out = out.substring(next_line + 1);
}

this.stack = out;
}
}
};

// assert.AssertionError instanceof Error
util.inherits(assert.AssertionError, Error);

function replacer(key, value) {
if (util.isUndefined(value)) {
return » + value;
}
if (util.isNumber(value) && (isNaN(value) || !isFinite(value))) {
return value.toString();
}
if (util.isFunction(value) || util.isRegExp(value)) {
return value.toString();
}
return value;
}

function truncate(s, n) {
if (util.isString(s)) {
return s.length < n ? s : s.slice(0, n); } else { return s; } } function getMessage(self) { return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' + self.operator + ' ' + truncate(JSON.stringify(self.expected, replacer), 128); } // At present only the three keys mentioned above are used and // understood by the spec. Implementations or sub modules can pass // other keys to the AssertionError's constructor - they will be // ignored. // 3. All of the following functions must throw an AssertionError // when a corresponding condition is not met, with a message that // may be undefined if not provided. All assertion methods provide // both the actual and expected values to the assertion error for // display purposes. function fail(actual, expected, message, operator, stackStartFunction) { throw new assert.AssertionError({ message: message, actual: actual, expected: expected, operator: operator, stackStartFunction: stackStartFunction }); } // EXTENSION! allows for well behaved errors defined elsewhere. assert.fail = fail; // 4. Pure assertion tests whether a value is truthy, as determined // by !!guard. // assert.ok(guard, message_opt); // This statement is equivalent to assert.equal(true, !!guard, // message_opt);. To test strictly for the value true, use // assert.strictEqual(true, guard, message_opt);. function ok(value, message) { if (!value) fail(value, true, message, '==', assert.ok); } assert.ok = ok; // 5. The equality assertion tests shallow, coercive equality with // ==. // assert.equal(actual, expected, message_opt); assert.equal = function equal(actual, expected, message) { if (actual != expected) fail(actual, expected, message, '==', assert.equal); }; // 6. The non-equality assertion tests for whether two objects are not equal // with != assert.notEqual(actual, expected, message_opt); assert.notEqual = function notEqual(actual, expected, message) { if (actual == expected) { fail(actual, expected, message, '!=', assert.notEqual); } }; // 7. The equivalence assertion tests a deep equality relation. // assert.deepEqual(actual, expected, message_opt); assert.deepEqual = function deepEqual(actual, expected, message) { if (!_deepEqual(actual, expected)) { fail(actual, expected, message, 'deepEqual', assert.deepEqual); } }; function _deepEqual(actual, expected) { // 7.1. All identical values are equivalent, as determined by ===. if (actual === expected) { return true; } else if (util.isBuffer(actual) && util.isBuffer(expected)) { if (actual.length != expected.length) return false; for (var i = 0; i < actual.length; i++) { if (actual[i] !== expected[i]) return false; } return true; // 7.2. If the expected value is a Date object, the actual value is // equivalent if it is also a Date object that refers to the same time. } else if (util.isDate(actual) && util.isDate(expected)) { return actual.getTime() === expected.getTime(); // 7.3 If the expected value is a RegExp object, the actual value is // equivalent if it is also a RegExp object with the same source and // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). } else if (util.isRegExp(actual) && util.isRegExp(expected)) { return actual.source === expected.source && actual.global === expected.global && actual.multiline === expected.multiline && actual.lastIndex === expected.lastIndex && actual.ignoreCase === expected.ignoreCase; // 7.4. Other pairs that do not both pass typeof value == 'object', // equivalence is determined by ==. } else if (!util.isObject(actual) && !util.isObject(expected)) { return actual == expected; // 7.5 For all other Object pairs, including Array objects, equivalence is // determined by having the same number of owned properties (as verified // with Object.prototype.hasOwnProperty.call), the same set of keys // (although not necessarily the same order), equivalent values for every // corresponding key, and an identical 'prototype' property. Note: this // accounts for both named and indexed properties on Arrays. } else { return objEquiv(actual, expected); } } function isArguments(object) { return Object.prototype.toString.call(object) == '[object Arguments]'; } function objEquiv(a, b) { if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) return false; // an identical 'prototype' property. if (a.prototype !== b.prototype) return false; //~~~I've managed to break Object.keys through screwy arguments passing. // Converting to array solves the problem. if (isArguments(a)) { if (!isArguments(b)) { return false; } a = pSlice.call(a); b = pSlice.call(b); return _deepEqual(a, b); } try { var ka = objectKeys(a), kb = objectKeys(b), key, i; } catch (e) {//happens when one is a string literal and the other isn't return false; } // having the same number of owned properties (keys incorporates // hasOwnProperty) if (ka.length != kb.length) return false; //the same set of keys (although not necessarily the same order), ka.sort(); kb.sort(); //~~~cheap key test for (i = ka.length - 1; i >= 0; i—) {
if (ka[i] != kb[i])
return false;
}
//equivalent values for every corresponding key, and
//~~~possibly expensive deep test
for (i = ka.length — 1; i >= 0; i—) {
key = ka[i];
if (!_deepEqual(a[key], b[key])) return false;
}
return true;
}

// 8. The non-equivalence assertion tests for any deep inequality.
// assert.notDeepEqual(actual, expected, message_opt);

assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
if (_deepEqual(actual, expected)) {
fail(actual, expected, message, ‘notDeepEqual’, assert.notDeepEqual);
}
};

// 9. The strict equality assertion tests strict equality, as determined by ===.
// assert.strictEqual(actual, expected, message_opt);

assert.strictEqual = function strictEqual(actual, expected, message) {
if (actual !== expected) {
fail(actual, expected, message, ‘===’, assert.strictEqual);
}
};

// 10. The strict non-equality assertion tests for strict inequality, as
// determined by !==. assert.notStrictEqual(actual, expected, message_opt);

assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
if (actual === expected) {
fail(actual, expected, message, ‘!==’, assert.notStrictEqual);
}
};

function expectedException(actual, expected) {
if (!actual || !expected) {
return false;
}

if (Object.prototype.toString.call(expected) == ‘[object RegExp]’) {
return expected.test(actual);
} else if (actual instanceof expected) {
return true;
} else if (expected.call({}, actual) === true) {
return true;
}

return false;
}

function _throws(shouldThrow, block, expected, message) {
var actual;

if (util.isString(expected)) {
message = expected;
expected = null;
}

try {
block();
} catch (e) {
actual = e;
}

message = (expected && expected.name ? ‘ (‘ + expected.name + ‘).’ : ‘.’) +
(message ? ‘ ‘ + message : ‘.’);

if (shouldThrow && !actual) {
fail(actual, expected, ‘Missing expected exception’ + message);
}

if (!shouldThrow && expectedException(actual, expected)) {
fail(actual, expected, ‘Got unwanted exception’ + message);
}

if ((shouldThrow && actual && expected &&
!expectedException(actual, expected)) || (!shouldThrow && actual)) {
throw actual;
}
}

// 11. Expected to throw an error:
// assert.throws(block, Error_opt, message_opt);

assert.throws = function(block, /*optional*/error, /*optional*/message) {
_throws.apply(this, [true].concat(pSlice.call(arguments)));
};

// EXTENSION! This is annoying to write outside this module.
assert.doesNotThrow = function(block, /*optional*/message) {
_throws.apply(this, [false].concat(pSlice.call(arguments)));
};

assert.ifError = function(err) { if (err) {throw err;}};

var objectKeys = Object.keys || function (obj) {
var keys = [];
for (var key in obj) {
if (hasOwn.call(obj, key)) keys.push(key);
}
return keys;
};

},{«util/»:68}],63:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// «Software»), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

function EventEmitter() {
this._events = this._events || {};
this._maxListeners = this._maxListeners || undefined;
}
module.exports = EventEmitter;

// Backwards-compat with node 0.10.x
EventEmitter.EventEmitter = EventEmitter;

EventEmitter.prototype._events = undefined;
EventEmitter.prototype._maxListeners = undefined;

// By default EventEmitters will print a warning if more than 10 listeners are
// added to it. This is a useful default which helps finding memory leaks.
EventEmitter.defaultMaxListeners = 10;

// Obviously not all Emitters should be limited to 10. This function allows
// that to be increased. Set to zero for unlimited.
EventEmitter.prototype.setMaxListeners = function(n) {
if (!isNumber(n) || n < 0 || isNaN(n)) throw TypeError('n must be a positive number'); this._maxListeners = n; return this; }; EventEmitter.prototype.emit = function(type) { var er, handler, len, args, i, listeners; if (!this._events) this._events = {}; // If there is no 'error' event listener then throw. if (type === 'error') { if (!this._events.error || (isObject(this._events.error) && !this._events.error.length)) { er = arguments[1]; if (er instanceof Error) { throw er; // Unhandled 'error' event } throw TypeError('Uncaught, unspecified "error" event.'); } } handler = this._events[type]; if (isUndefined(handler)) return false; if (isFunction(handler)) { switch (arguments.length) { // fast cases case 1: handler.call(this); break; case 2: handler.call(this, arguments[1]); break; case 3: handler.call(this, arguments[1], arguments[2]); break; // slower default: len = arguments.length; args = new Array(len - 1); for (i = 1; i < len; i++) args[i - 1] = arguments[i]; handler.apply(this, args); } } else if (isObject(handler)) { len = arguments.length; args = new Array(len - 1); for (i = 1; i < len; i++) args[i - 1] = arguments[i]; listeners = handler.slice(); len = listeners.length; for (i = 0; i < len; i++) listeners[i].apply(this, args); } return true; }; EventEmitter.prototype.addListener = function(type, listener) { var m; if (!isFunction(listener)) throw TypeError('listener must be a function'); if (!this._events) this._events = {}; // To avoid recursion in the case that type === "newListener"! Before // adding it to the listeners, first emit "newListener". if (this._events.newListener) this.emit('newListener', type, isFunction(listener.listener) ? listener.listener : listener); if (!this._events[type]) // Optimize the case of one listener. Don't need the extra array object. this._events[type] = listener; else if (isObject(this._events[type])) // If we've already got an array, just append. this._events[type].push(listener); else // Adding the second element, need to change to array. this._events[type] = [this._events[type], listener]; // Check for listener leak if (isObject(this._events[type]) && !this._events[type].warned) { var m; if (!isUndefined(this._maxListeners)) { m = this._maxListeners; } else { m = EventEmitter.defaultMaxListeners; } if (m && m > 0 && this._events[type].length > m) {
this._events[type].warned = true;
console.error(‘(node) warning: possible EventEmitter memory ‘ +
‘leak detected. %d listeners added. ‘ +
‘Use emitter.setMaxListeners() to increase limit.’,
this._events[type].length);
if (typeof console.trace === ‘function’) {
// not supported in IE 10
console.trace();
}
}
}

return this;
};

EventEmitter.prototype.on = EventEmitter.prototype.addListener;

EventEmitter.prototype.once = function(type, listener) {
if (!isFunction(listener))
throw TypeError(‘listener must be a function’);

var fired = false;

function g() {
this.removeListener(type, g);

if (!fired) {
fired = true;
listener.apply(this, arguments);
}
}

g.listener = listener;
this.on(type, g);

return this;
};

// emits a ‘removeListener’ event iff the listener was removed
EventEmitter.prototype.removeListener = function(type, listener) {
var list, position, length, i;

if (!isFunction(listener))
throw TypeError(‘listener must be a function’);

if (!this._events || !this._events[type])
return this;

list = this._events[type];
length = list.length;
position = -1;

if (list === listener ||
(isFunction(list.listener) && list.listener === listener)) {
delete this._events[type];
if (this._events.removeListener)
this.emit(‘removeListener’, type, listener);

} else if (isObject(list)) {
for (i = length; i— > 0;) {
if (list[i] === listener ||
(list[i].listener && list[i].listener === listener)) {
position = i;
break;
}
}

if (position < 0) return this; if (list.length === 1) { list.length = 0; delete this._events[type]; } else { list.splice(position, 1); } if (this._events.removeListener) this.emit('removeListener', type, listener); } return this; }; EventEmitter.prototype.removeAllListeners = function(type) { var key, listeners; if (!this._events) return this; // not listening for removeListener, no need to emit if (!this._events.removeListener) { if (arguments.length === 0) this._events = {}; else if (this._events[type]) delete this._events[type]; return this; } // emit removeListener for all listeners on all events if (arguments.length === 0) { for (key in this._events) { if (key === 'removeListener') continue; this.removeAllListeners(key); } this.removeAllListeners('removeListener'); this._events = {}; return this; } listeners = this._events[type]; if (isFunction(listeners)) { this.removeListener(type, listeners); } else { // LIFO order while (listeners.length) this.removeListener(type, listeners[listeners.length - 1]); } delete this._events[type]; return this; }; EventEmitter.prototype.listeners = function(type) { var ret; if (!this._events || !this._events[type]) ret = []; else if (isFunction(this._events[type])) ret = [this._events[type]]; else ret = this._events[type].slice(); return ret; }; EventEmitter.listenerCount = function(emitter, type) { var ret; if (!emitter._events || !emitter._events[type]) ret = 0; else if (isFunction(emitter._events[type])) ret = 1; else ret = emitter._events[type].length; return ret; }; function isFunction(arg) { return typeof arg === 'function'; } function isNumber(arg) { return typeof arg === 'number'; } function isObject(arg) { return typeof arg === 'object' && arg !== null; } function isUndefined(arg) { return arg === void 0; } },{}],64:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // resolves . and .. elements in a path array with directory names there // must be no slashes, empty elements, or device names (c:\) in the array // (so also no leading and trailing slashes - it does not distinguish // relative and absolute paths) function normalizeArray(parts, allowAboveRoot) { // if the path tries to go above the root, `up` ends up > 0
var up = 0;
for (var i = parts.length — 1; i >= 0; i—) {
var last = parts[i];
if (last === ‘.’) {
parts.splice(i, 1);
} else if (last === ‘..’) {
parts.splice(i, 1);
up++;
} else if (up) {
parts.splice(i, 1);
up—;
}
}

// if the path is allowed to go above the root, restore leading ..s
if (allowAboveRoot) {
for (; up—; up) {
parts.unshift(‘..’);
}
}

return parts;
}

// Split a filename into [root, dir, basename, ext], unix version
// ‘root’ is just a slash, or nothing.
var splitPathRe =
/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
var splitPath = function(filename) {
return splitPathRe.exec(filename).slice(1);
};

// path.resolve([from …], to)
// posix version
exports.resolve = function() {
var resolvedPath = »,
resolvedAbsolute = false;

for (var i = arguments.length — 1; i >= -1 && !resolvedAbsolute; i—) {
var path = (i >= 0) ? arguments[i] : process.cwd();

// Skip empty and invalid entries
if (typeof path !== ‘string’) {
throw new TypeError(‘Arguments to path.resolve must be strings’);
} else if (!path) {
continue;
}

resolvedPath = path + ‘/’ + resolvedPath;
resolvedAbsolute = path.charAt(0) === ‘/’;
}

// At this point the path should be resolved to a full absolute path, but
// handle relative paths to be safe (might happen when process.cwd() fails)

// Normalize the path
resolvedPath = normalizeArray(filter(resolvedPath.split(‘/’), function(p) {
return !!p;
}), !resolvedAbsolute).join(‘/’);

return ((resolvedAbsolute ? ‘/’ : ») + resolvedPath) || ‘.’;
};

// path.normalize(path)
// posix version
exports.normalize = function(path) {
var isAbsolute = exports.isAbsolute(path),
trailingSlash = substr(path, -1) === ‘/’;

// Normalize the path
path = normalizeArray(filter(path.split(‘/’), function(p) {
return !!p;
}), !isAbsolute).join(‘/’);

if (!path && !isAbsolute) {
path = ‘.’;
}
if (path && trailingSlash) {
path += ‘/’;
}

return (isAbsolute ? ‘/’ : ») + path;
};

// posix version
exports.isAbsolute = function(path) {
return path.charAt(0) === ‘/’;
};

// posix version
exports.join = function() {
var paths = Array.prototype.slice.call(arguments, 0);
return exports.normalize(filter(paths, function(p, index) {
if (typeof p !== ‘string’) {
throw new TypeError(‘Arguments to path.join must be strings’);
}
return p;
}).join(‘/’));
};

// path.relative(from, to)
// posix version
exports.relative = function(from, to) {
from = exports.resolve(from).substr(1);
to = exports.resolve(to).substr(1);

function trim(arr) {
var start = 0;
for (; start < arr.length; start++) { if (arr[start] !== '') break; } var end = arr.length - 1; for (; end >= 0; end—) {
if (arr[end] !== ») break;
}

if (start > end) return [];
return arr.slice(start, end — start + 1);
}

var fromParts = trim(from.split(‘/’));
var toParts = trim(to.split(‘/’));

var length = Math.min(fromParts.length, toParts.length);
var samePartsLength = length;
for (var i = 0; i < length; i++) { if (fromParts[i] !== toParts[i]) { samePartsLength = i; break; } } var outputParts = []; for (var i = samePartsLength; i < fromParts.length; i++) { outputParts.push('..'); } outputParts = outputParts.concat(toParts.slice(samePartsLength)); return outputParts.join('/'); }; exports.sep = '/'; exports.delimiter = ':'; exports.dirname = function(path) { var result = splitPath(path), root = result[0], dir = result[1]; if (!root && !dir) { // No dirname whatsoever return '.'; } if (dir) { // It has a dirname, strip trailing slash dir = dir.substr(0, dir.length - 1); } return root + dir; }; exports.basename = function(path, ext) { var f = splitPath(path)[2]; // TODO: make this comparison case-insensitive on windows? if (ext && f.substr(-1 * ext.length) === ext) { f = f.substr(0, f.length - ext.length); } return f; }; exports.extname = function(path) { return splitPath(path)[3]; }; function filter (xs, f) { if (xs.filter) return xs.filter(f); var res = []; for (var i = 0; i < xs.length; i++) { if (f(xs[i], i, xs)) res.push(xs[i]); } return res; } // String.prototype.substr - negative index don't work in IE8 var substr = 'ab'.substr(-1) === 'b' ? function (str, start, len) { return str.substr(start, len) } : function (str, start, len) { if (start < 0) start = str.length + start; return str.substr(start, len); } ; }).call(this,require("+xKvab")) },{"+xKvab":65}],65:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; process.nextTick = (function () { var canSetImmediate = typeof window !== 'undefined' && window.setImmediate; var canPost = typeof window !== 'undefined' && window.postMessage && window.addEventListener ; if (canSetImmediate) { return function (f) { return window.setImmediate(f) }; } if (canPost) { var queue = []; window.addEventListener('message', function (ev) { var source = ev.source; if ((source === window || source === null) && ev.data === 'process-tick') { ev.stopPropagation(); if (queue.length > 0) {
var fn = queue.shift();
fn();
}
}
}, true);

return function nextTick(fn) {
queue.push(fn);
window.postMessage(‘process-tick’, ‘*’);
};
}

return function nextTick(fn) {
setTimeout(fn, 0);
};
})();

process.title = ‘browser’;
process.browser = true;
process.env = {};
process.argv = [];

function noop() {}

process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;

process.binding = function (name) {
throw new Error(‘process.binding is not supported’);
}

// TODO(shtylman)
process.cwd = function () { return ‘/’ };
process.chdir = function (dir) {
throw new Error(‘process.chdir is not supported’);
};

},{}],66:[function(require,module,exports){
if (typeof Object.create === ‘function’) {
// implementation from standard node.js ‘util’ module
module.exports = function inherits(ctor, superCtor) {
ctor.super_ = superCtor
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
};
} else {
// old school shim for old browsers
module.exports = function inherits(ctor, superCtor) {
ctor.super_ = superCtor
var TempCtor = function () {}
TempCtor.prototype = superCtor.prototype
ctor.prototype = new TempCtor()
ctor.prototype.constructor = ctor
}
}

},{}],67:[function(require,module,exports){
module.exports = function isBuffer(arg) {
return arg && typeof arg === ‘object’
&& typeof arg.copy === ‘function’
&& typeof arg.fill === ‘function’
&& typeof arg.readUInt8 === ‘function’;
}
},{}],68:[function(require,module,exports){
(function (process,global){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// «Software»), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

var formatRegExp = /%[sdj%]/g;
exports.format = function(f) {
if (!isString(f)) {
var objects = [];
for (var i = 0; i < arguments.length; i++) { objects.push(inspect(arguments[i])); } return objects.join(' '); } var i = 1; var args = arguments; var len = args.length; var str = String(f).replace(formatRegExp, function(x) { if (x === '%%') return '%'; if (i >= len) return x;
switch (x) {
case ‘%s’: return String(args[i++]);
case ‘%d’: return Number(args[i++]);
case ‘%j’:
try {
return JSON.stringify(args[i++]);
} catch (_) {
return ‘[Circular]’;
}
default:
return x;
}
});
for (var x = args[i]; i < len; x = args[++i]) { if (isNull(x) || !isObject(x)) { str += ' ' + x; } else { str += ' ' + inspect(x); } } return str; }; // Mark that a method should not be used. // Returns a modified function which warns once by default. // If --no-deprecation is set, then it is a no-op. exports.deprecate = function(fn, msg) { // Allow for deprecating things in the process of starting up. if (isUndefined(global.process)) { return function() { return exports.deprecate(fn, msg).apply(this, arguments); }; } if (process.noDeprecation === true) { return fn; } var warned = false; function deprecated() { if (!warned) { if (process.throwDeprecation) { throw new Error(msg); } else if (process.traceDeprecation) { console.trace(msg); } else { console.error(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; }; var debugs = {}; var debugEnviron; exports.debuglog = function(set) { if (isUndefined(debugEnviron)) debugEnviron = process.env.NODE_DEBUG || ''; set = set.toUpperCase(); if (!debugs[set]) { if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { var pid = process.pid; debugs[set] = function() { var msg = exports.format.apply(exports, arguments); console.error('%s %d: %s', set, pid, msg); }; } else { debugs[set] = function() {}; } } return debugs[set]; }; /** * Echos the value of a value. Trys to print the value out * in the best way possible given the different types. * * @param {Object} obj The object to print out. * @param {Object} opts Optional options object that alters the output. */ /* legacy: obj, showHidden, depth, colors*/ function inspect(obj, opts) { // default options var ctx = { seen: [], stylize: stylizeNoColor }; // legacy... if (arguments.length >= 3) ctx.depth = arguments[2];
if (arguments.length >= 4) ctx.colors = arguments[3];
if (isBoolean(opts)) {
// legacy…
ctx.showHidden = opts;
} else if (opts) {
// got an «options» object
exports._extend(ctx, opts);
}
// set default options
if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
if (isUndefined(ctx.depth)) ctx.depth = 2;
if (isUndefined(ctx.colors)) ctx.colors = false;
if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
if (ctx.colors) ctx.stylize = stylizeWithColor;
return formatValue(ctx, obj, ctx.depth);
}
exports.inspect = inspect;

// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
inspect.colors = {
‘bold’ : [1, 22],
‘italic’ : [3, 23],
‘underline’ : [4, 24],
‘inverse’ : [7, 27],
‘white’ : [37, 39],
‘grey’ : [90, 39],
‘black’ : [30, 39],
‘blue’ : [34, 39],
‘cyan’ : [36, 39],
‘green’ : [32, 39],
‘magenta’ : [35, 39],
‘red’ : [31, 39],
‘yellow’ : [33, 39]
};

// Don’t use ‘blue’ not visible on cmd.exe
inspect.styles = {
‘special’: ‘cyan’,
‘number’: ‘yellow’,
‘boolean’: ‘yellow’,
‘undefined’: ‘grey’,
‘null’: ‘bold’,
‘string’: ‘green’,
‘date’: ‘magenta’,
// «name»: intentionally not styling
‘regexp’: ‘red’
};

function stylizeWithColor(str, styleType) {
var style = inspect.styles[styleType];

if (style) {
return ‘\u001b[‘ + inspect.colors[style][0] + ‘m’ + str +
‘\u001b[‘ + inspect.colors[style][1] + ‘m’;
} else {
return str;
}
}

function stylizeNoColor(str, styleType) {
return str;
}

function arrayToHash(array) {
var hash = {};

array.forEach(function(val, idx) {
hash[val] = true;
});

return hash;
}

function formatValue(ctx, value, recurseTimes) {
// Provide a hook for user-specified inspect functions.
// Check that value is an object with an inspect function on it
if (ctx.customInspect &&
value &&
isFunction(value.inspect) &&
// Filter out the util module, it’s inspect function is special
value.inspect !== exports.inspect &&
// Also filter out any prototype objects using the circular check.
!(value.constructor && value.constructor.prototype === value)) {
var ret = value.inspect(recurseTimes, ctx);
if (!isString(ret)) {
ret = formatValue(ctx, ret, recurseTimes);
}
return ret;
}

// Primitive types cannot have properties
var primitive = formatPrimitive(ctx, value);
if (primitive) {
return primitive;
}

// Look up the keys of the object.
var keys = Object.keys(value);
var visibleKeys = arrayToHash(keys);

if (ctx.showHidden) {
keys = Object.getOwnPropertyNames(value);
}

// IE doesn’t make error fields non-enumerable
// http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
if (isError(value)
&& (keys.indexOf(‘message’) >= 0 || keys.indexOf(‘description’) >= 0)) {
return formatError(value);
}

// Some type of object without properties can be shortcutted.
if (keys.length === 0) {
if (isFunction(value)) {
var name = value.name ? ‘: ‘ + value.name : »;
return ctx.stylize(‘[Function’ + name + ‘]’, ‘special’);
}
if (isRegExp(value)) {
return ctx.stylize(RegExp.prototype.toString.call(value), ‘regexp’);
}
if (isDate(value)) {
return ctx.stylize(Date.prototype.toString.call(value), ‘date’);
}
if (isError(value)) {
return formatError(value);
}
}

var base = », array = false, braces = [‘{‘, ‘}’];

// Make Array say that they are Array
if (isArray(value)) {
array = true;
braces = [‘[‘, ‘]’];
}

// Make functions say that they are functions
if (isFunction(value)) {
var n = value.name ? ‘: ‘ + value.name : »;
base = ‘ [Function’ + n + ‘]’;
}

// Make RegExps say that they are RegExps
if (isRegExp(value)) {
base = ‘ ‘ + RegExp.prototype.toString.call(value);
}

// Make dates with properties first say the date
if (isDate(value)) {
base = ‘ ‘ + Date.prototype.toUTCString.call(value);
}

// Make error with message first say the error
if (isError(value)) {
base = ‘ ‘ + formatError(value);
}

if (keys.length === 0 && (!array || value.length == 0)) {
return braces[0] + base + braces[1];
}

if (recurseTimes < 0) { if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } else { return ctx.stylize('[Object]', 'special'); } } ctx.seen.push(value); var output; if (array) { output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); } else { output = keys.map(function(key) { return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); }); } ctx.seen.pop(); return reduceToSingleString(output, base, braces); } function formatPrimitive(ctx, value) { if (isUndefined(value)) return ctx.stylize('undefined', 'undefined'); if (isString(value)) { var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') .replace(/'/g, "\\'") .replace(/\\"/g, '"') + '\''; return ctx.stylize(simple, 'string'); } if (isNumber(value)) return ctx.stylize('' + value, 'number'); if (isBoolean(value)) return ctx.stylize('' + value, 'boolean'); // For some reason typeof null is "object", so special case here. if (isNull(value)) return ctx.stylize('null', 'null'); } function formatError(value) { return '[' + Error.prototype.toString.call(value) + ']'; } function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { var output = []; for (var i = 0, l = value.length; i < l; ++i) { if (hasOwnProperty(value, String(i))) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true)); } else { output.push(''); } } keys.forEach(function(key) { if (!key.match(/^\d+$/)) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true)); } }); return output; } function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { var name, str, desc; desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; if (desc.get) { if (desc.set) { str = ctx.stylize('[Getter/Setter]', 'special'); } else { str = ctx.stylize('[Getter]', 'special'); } } else { if (desc.set) { str = ctx.stylize('[Setter]', 'special'); } } if (!hasOwnProperty(visibleKeys, key)) { name = '[' + key + ']'; } if (!str) { if (ctx.seen.indexOf(desc.value) < 0) { if (isNull(recurseTimes)) { str = formatValue(ctx, desc.value, null); } else { str = formatValue(ctx, desc.value, recurseTimes - 1); } if (str.indexOf('\n') > -1) {
if (array) {
str = str.split(‘\n’).map(function(line) {
return ‘ ‘ + line;
}).join(‘\n’).substr(2);
} else {
str = ‘\n’ + str.split(‘\n’).map(function(line) {
return ‘ ‘ + line;
}).join(‘\n’);
}
}
} else {
str = ctx.stylize(‘[Circular]’, ‘special’);
}
}
if (isUndefined(name)) {
if (array && key.match(/^\d+$/)) {
return str;
}
name = JSON.stringify(» + key);
if (name.match(/^»([a-zA-Z_][a-zA-Z_0-9]*)»$/)) {
name = name.substr(1, name.length — 2);
name = ctx.stylize(name, ‘name’);
} else {
name = name.replace(/’/g, «\\'»)
.replace(/\\»/g, ‘»‘)
.replace(/(^»|»$)/g, «‘»);
name = ctx.stylize(name, ‘string’);
}
}

return name + ‘: ‘ + str;
}

function reduceToSingleString(output, base, braces) {
var numLinesEst = 0;
var length = output.reduce(function(prev, cur) {
numLinesEst++;
if (cur.indexOf(‘\n’) >= 0) numLinesEst++;
return prev + cur.replace(/\u001b\[\d\d?m/g, »).length + 1;
}, 0);

if (length > 60) {
return braces[0] +
(base === » ? » : base + ‘\n ‘) +
‘ ‘ +
output.join(‘,\n ‘) +
‘ ‘ +
braces[1];
}

return braces[0] + base + ‘ ‘ + output.join(‘, ‘) + ‘ ‘ + braces[1];
}

// NOTE: These type checking functions intentionally don’t use `instanceof`
// because it is fragile and can be easily faked with `Object.create()`.
function isArray(ar) {
return Array.isArray(ar);
}
exports.isArray = isArray;

function isBoolean(arg) {
return typeof arg === ‘boolean’;
}
exports.isBoolean = isBoolean;

function isNull(arg) {
return arg === null;
}
exports.isNull = isNull;

function isNullOrUndefined(arg) {
return arg == null;
}
exports.isNullOrUndefined = isNullOrUndefined;

function isNumber(arg) {
return typeof arg === ‘number’;
}
exports.isNumber = isNumber;

function isString(arg) {
return typeof arg === ‘string’;
}
exports.isString = isString;

function isSymbol(arg) {
return typeof arg === ‘symbol’;
}
exports.isSymbol = isSymbol;

function isUndefined(arg) {
return arg === void 0;
}
exports.isUndefined = isUndefined;

function isRegExp(re) {
return isObject(re) && objectToString(re) === ‘[object RegExp]’;
}
exports.isRegExp = isRegExp;

function isObject(arg) {
return typeof arg === ‘object’ && arg !== null;
}
exports.isObject = isObject;

function isDate(d) {
return isObject(d) && objectToString(d) === ‘[object Date]’;
}
exports.isDate = isDate;

function isError(e) {
return isObject(e) &&
(objectToString(e) === ‘[object Error]’ || e instanceof Error);
}
exports.isError = isError;

function isFunction(arg) {
return typeof arg === ‘function’;
}
exports.isFunction = isFunction;

function isPrimitive(arg) {
return arg === null ||
typeof arg === ‘boolean’ ||
typeof arg === ‘number’ ||
typeof arg === ‘string’ ||
typeof arg === ‘symbol’ || // ES6 symbol
typeof arg === ‘undefined’;
}
exports.isPrimitive = isPrimitive;

exports.isBuffer = require(‘./support/isBuffer’);

function objectToString(o) {
return Object.prototype.toString.call(o);
}

function pad(n) {
return n < 10 ? '0' + n.toString(10) : n.toString(10); } var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; // 26 Feb 16:19:34 function timestamp() { var d = new Date(); var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':'); return [d.getDate(), months[d.getMonth()], time].join(' '); } // log is just a thin wrapper to console.log that prepends a timestamp exports.log = function() { console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); }; /** * Inherit the prototype methods from one constructor into another. * * The Function.prototype.inherits from lang.js rewritten as a standalone * function (not on Function.prototype). NOTE: If this file is to be loaded * during bootstrapping this function needs to be rewritten using some native * functions as prototype setup using normal JavaScript does not work as * expected during bootstrapping (see mirror.js in r114903). * * @param {function} ctor Constructor function which needs to inherit the * prototype. * @param {function} superCtor Constructor function to inherit prototype from. */ exports.inherits = require('inherits'); exports._extend = function(origin, add) { // Don't do anything if add isn't an object if (!add || !isObject(add)) return origin; var keys = Object.keys(add); var i = keys.length; while (i--) { origin[keys[i]] = add[keys[i]]; } return origin; }; function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } }).call(this,require("+xKvab"),typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"+xKvab":65,"./support/isBuffer":67,"inherits":66}],69:[function(require,module,exports){ var DependencyManager = require("./src/dm"), loaderAMD = require("./src/dm/adapter/loader/amd"), loaderCJS = require("./src/dm/adapter/loader/cjs"), asyncRSVP = require("./src/dm/adapter/async/rsvp"); module.exports = { DependencyManager: DependencyManager, loader: { amd: loaderAMD, cjs: loaderCJS }, async: { RSVP: asyncRSVP } }; },{"./src/dm":70,"./src/dm/adapter/async/rsvp":73,"./src/dm/adapter/loader/amd":75,"./src/dm/adapter/loader/cjs":76}],70:[function(require,module,exports){ /* import { objectType, isString, isNumber, isFunction, isBoolean, isDate, isObject, isRegExp, isArray, isUndefined, forEachOwn, forEachSimple, map, clone, sprintf } from "./dm/utils"; import Async from "./dm/adapter/async"; import Loader from "./dm/adapter/loader"; */ var utils = require("./dm/utils"), Async = require("./dm/adapter/async"), Loader = require("./dm/adapter/loader"), Factory = require("./dm/factory"), inherits = require("inherits-js"), objectType = utils.objectType, isString = utils.isString, isNumber = utils.isNumber, isFunction = utils.isFunction, isBoolean = utils.isBoolean, isDate = utils.isDate, isObject = utils.isObject, isRegExp = utils.isRegExp, isArray = utils.isArray, isUndefined = utils.isUndefined, forEach = utils.forEach, forEachOwn = utils.forEachOwn, forEachSimple = utils.forEachSimple, map = utils.map, bind = utils.bind, clone = utils.clone, extend = utils.extend, sprintf = utils.sprintf, async = utils.async, DefaultFactory = require("./dm/factory/default"), defaultFactory, DependencyManager; // may be turn it inside as internal service? "@:::factory.default" defaultFactory = new DefaultFactory(); /** * DM Constructor. * @constructor */ DependencyManager = function(options) { /** * Service map. * * @private * @type {Object} */ var _config = null; var _configCopy = null; /** * Global properties. * * @private * @type {Object} */ var _parameters = {}; /** * Options for DM. * @type {Object} */ this.options = extend({}, this.constructor.DEFAULTS, options || {}); /** * Sets up the service map. * * @param {Object} config * @param {Object} [parameters] * @throws {Error} */ this.setConfig = function(config, parameters) { if (_config !== null) { throw new Error("Dependency Manager is already configured"); } if (!isObject(config)) { throw new Error("Config is expected to be an Object"); } if (isObject(parameters)) { forEachOwn(parameters, function(value, key) { this.setParameter(key, value); }, this); } _config = config; _configCopy = clone(config); }; /** * Returns the deep copy of config. * * @returns {Object} */ this.getConfig = function(key) { if (_config === null) { throw new Error("Dependency Manager is not configured yet"); } return key ? _configCopy[key] : _configCopy; }; /** * Sets up the global parameter. */ this.setParameter = function(key, value) { if (!isUndefined(_parameters[key])) { throw new Error("Dependency Manager property '" + key + "' is already set"); } _parameters[key] = value; }; /** * Returns value of property. * * @param {String} key * * @returns {*} */ this.getParameter = function(key) { return !isUndefined(_parameters[key]) ? _parameters[key] : null; }; /** * Services map * @type {{}} */ this.services = {}; }; DependencyManager.prototype = (function() { /** * Template for checking reference to service. * * Could be applied to string in format: * @[:[\[,[]\]]]
*
* @type {RegExp}
* @private
* @static
*/
var SERVICE_REGEX = /^@([^:]+)(?::([^\[\]]+)(\[.*\])?)?$/i;

/**
* Template for checking reference to property.
*
* @type {RegExp}
* @private
* @static
*/
var PROPERTY_REGEX = /^%(.*)%$/i;

/**
* Template for checking reference to property in string context.
*
* @type {RegExp}
* @private
* @static
*/
var LIVE_PROPERTY_REGEX = /%\{([^%]+?)\}/gi;

/**
* Template for checking reference to resource.
*
* @type {RegExp}
* @private
* @static
*/
var RESOURCE_REGEX = /^#(?:([^!]+)!)?(.*)#$/i;

return {
constructor: DependencyManager,

setAsync: function(adapter) {
if (!(adapter instanceof Async)) {
throw new Error(«Async is expected»);
}

this.async = adapter;

return this;
},

setLoader: function(adapter) {
if (!(adapter instanceof Loader)) {
throw new Error(«Loader is expected»);
}

this.loader = adapter;

return this;
},

// @service:getSome(@service:getVar(text, hello, @someService, %property%))
parseString: function(string) {
var self = this,
args, name,
property, handler, callArgs,
path,
promises;

if (!isString(string)) {
return self.async.reject(new Error(«String is expected»));
}

// todo Refactor parsing in this way:
// todo Parsers in constructor, add ability to register custom parsers
//
// [PropertyTemplateParser, PropertyLinkParser, ContainerLinkParser, ServiceLinkParser, ResourceParser]
// chain.add(…);
// chain.add(…);
// chain.parse(string);
//
// Finally there could be:
// — final (returning) link parsers
// — continuous (not returning) template parses
//
// Links are @, #…#, %…%
// Templates are @{service[method|property|toString]}, #{resource}, %{parameter}

// Live replacement property
// We do not resolve promise with this
// Cause it can contain another useful matching
if (string.match(LIVE_PROPERTY_REGEX)) {
string = string.replace(LIVE_PROPERTY_REGEX, function(match, name) {
return self.getParameter(name) || match;
});
}

// Property
if ((args = string.match(PROPERTY_REGEX))) {
name = args[1];
return self.async.resolve(self.getParameter(name));
}

// Self link
if (string === DependencyManager.SELF) {
return this.async.resolve(this);
}

// Service
if ((args = string.match(SERVICE_REGEX))) {
name = args[1];
property = args[2];
callArgs = args[3];

promises = [this.parseString(name)];

if (property && isString(property)) {
promises.push(this.parseString(property));

if (callArgs) {
try {
callArgs = JSON.parse(args[3]);
} catch (err) {
return self.async.reject(new Error(«Service method call parse error»));
}

callArgs = map(callArgs, this.parse, this);

promises.push(this.async.all(callArgs));
}
}

return this.async.all(promises)
.then(function(results) {
var key, options;

key = results[0];
options = {
property: results[1],
arguments: results[2]
};

return self.get(key, options);
});
}

// Resource
if ((args = string.match(RESOURCE_REGEX))) {
path = args[2];
handler = args[1];

promises = [this.parseString(path)];

if (handler && isString(handler)) {
promises.push(this.parseString(handler));
}

return this.async.all(promises).then(function(args) {
return self.getResource.apply(self, args);
});
}

return this.async.resolve(string);
},

parseObject: function(object) {
var self = this,
iterator, parsed, promises, escaped;

switch (objectType(object)) {
case «Object»: {
parsed = {};
iterator = forEachOwn;
break;
}

case «Array»: {
parsed = [];
iterator = forEachSimple;
break;
}

default: {
return self.async.reject(new Error(«Object or Array is expected»));
}
}

if ((escaped = DependencyManager.unEscape(object))) {
return this.async.resolve(escaped);
}

promises = [];

iterator(object, function(value, key) {
promises.push(self.parse(value).then(function(value) {
parsed[key] = value;
}));
});

return self.async.all(promises)
.then(function() {
return parsed;
});
},

/**
* Finds out references to services, parameters and resources in given object.
* Returns promise of getting them, which is resolved then with object having
* parsed values.
*
* @param config {*}
*/
parse: function(config) {
switch (objectType(config)) {
case ‘String’: {
return this.parseString(config);
}

case ‘Object’:
case ‘Array’: {
return this.parseObject(config);
}

default: {
return this.async.resolve(config);
}
}
},

/**
* Собирает сервис.
*
* @param config {Object}
*
* @returns {Promise}
*/
build: function(config) {
var self = this,
options;

options = {
base: this.options.base
};

// do not combine path loading and parsing arguments, cause it can produce side effects
// on amd builds — when dependencies compiled in ‘path’ file, but loaded earlier from separate files
return this.loader.require(config.path, options)
.then(function(constructor) {
return self.async.all([
self.parse(config.arguments || []),
self.parse(config.calls || []),
self.parse(config.properties || {}),
self.parse(config.factory)
])
.then(function(inputs) {
var definition, factory;

definition = {
constructor: constructor,
arguments: inputs[0],
calls: inputs[1],
properties: inputs[2]
};

factory = inputs[3] || defaultFactory;

if (isObject(factory)) {
if (!isFunction(factory.factory)) {
throw new TypeError(«Given factory object does not have #factory method»);
}

factory = bind(factory.factory, factory);
} else if (!isFunction(factory)) {
throw new TypeError(«Given factory must be a function»);
}

// could be a value or a Promise
return factory(definition);
});
});
},

// @handler:handle!/var/resource
// %tpl%!/var/template.html
// %tpl%!%path%
getResource: function(path, handler) {
var options;

if (!isString(path)) {
return this.async.reject(new Error(«Path must be a string»));
}

options = {
base: this.options.base
};

if (isFunction(handler)) {
return this.loader.read(path, options).then(handler);
}

// path handler to loader for any cases
options.handler = handler;

return this.loader.read(path, options);
},

/**
*
* @param {string} key
* @param {Object} [options]
*/
has: function(key, options) {
return !!this.getConfig(key);
},

/**
*
* @param {string} key
* @param {Object} [options]
*/
initialized: function(key, options) {
return !!this.services[key];
},

/**
*
* @param {string} key
* @param {*} service
* @param {Object} [options]
*/
set: function(key, service, options) {
var config;

if (!(config = this.getConfig(key))) {
throw new Error(sprintf(«Service with key ‘%s’ is not present in configuration», key));
}

if (!config.synthetic) {
throw new Error(sprintf(«Could not inject service with key ‘%s’, cause it is not synthetic», key));
}

this.services[key] = this.async.resolve(service);
},

/**
*
*/
get: function(key, options) {
var config, promise,
alias,
isShared, isSynthetic, isAlias, isSingleProperty;

if (!isString(key)) {
return this.async.reject(new Error(sprintf(«Key is expected to be string, %s given», typeof key)));
}

if (!(config = this.getConfig(key))) {
return this.async.reject(new Error(sprintf(«Service with key ‘%s’ is not present in configuration», key)));
}

options = options || {};

isShared = isBoolean(config.share) ? config.share : true;
isSynthetic = isBoolean(config.synthetic) ? config.synthetic : false;
isAlias = isString(config.alias) ? true : false;

// Sign of custom property (synthetic, aliased or smth)
isSingleProperty = isSynthetic || isAlias;

if (!isSingleProperty && !isString(config.path)) {
return this.async.reject(new Error(sprintf(«Path is expected in service configuration with key ‘%s'», key)));
}

if (isSynthetic && !this.initialized(key)) {
return this.async.reject(new Error(sprintf(«Service with key ‘%s’ is synthetic, and not injected yet», key)));
}

if (isAlias) {
if (!this.has(alias = config.alias)) {
return this.async.reject(new Error(sprintf(«Service with key ‘%s’ could not be alias for not existing ‘%s’ service», key, alias)));
}

return this.get(alias);
}

if (!isShared) {
promise = this.build(config);
} else if (!(promise = this.services[key])) {
promise = this.services[key] = this.build(config);
}

// todo move this logic in Service parser
return promise.then(function(service) {
var property, isFunc;

if (isString(options.property)) {
property = service[options.property];
isFunc = isFunction(property);

if (isArray(options.arguments)) {
if (!isFunc) {
throw new TypeError(sprintf(«Service ‘%s’ does not have the method ‘%s'», key, options.property));
}

return property.apply(service, options.arguments);
}

return isFunc ? bind(property, service) : property;
}

return service;
});
}
};
})();

// Default options
DependencyManager.DEFAULTS = {
base: null
};

DependencyManager.ESCAPE_FLAG = ‘__escape__’;
DependencyManager.ESCAPE_VALUE = ‘__value__’;
DependencyManager.SELF = «@_@»;

DependencyManager.escape = function(value) {
var wrapper = {};

wrapper[DependencyManager.ESCAPE_FLAG] = true;
wrapper[DependencyManager.ESCAPE_VALUE] = value;

return wrapper;
};

DependencyManager.unEscape = function(obj) {
if (obj[DependencyManager.ESCAPE_FLAG] === true) {
return obj[DependencyManager.ESCAPE_VALUE];
}

return null;
};

DependencyManager.extend = function(prototypeProps, staticProps) {
return inherits(this, prototypeProps, staticProps);
};

module.exports = DependencyManager;

// Module registration
// ——————-
/*
var isNode = typeof module !== «undefined» && module.exports,
isAMD = typeof define === ‘function’ && typeof define.amd === ‘object’ && define.amd;

if (isNode) {
module.exports = DependencyManager;
} else if (isAMD) {
define([], function() {return DependencyManager;});
} else if ( typeof window === «object» && typeof window.document === «object» ) {
window.DependencyManager = DependencyManager;
}*/

},{«./dm/adapter/async»:72,»./dm/adapter/loader»:74,»./dm/factory»:77,»./dm/factory/default»:78,»./dm/utils»:79,»inherits-js»:80}],71:[function(require,module,exports){
var inherits = require(«inherits-js»),
Adapter;

Adapter = function(adaptee) {
this.adaptee = adaptee;
};

Adapter.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Adapter;
},{«inherits-js»:80}],72:[function(require,module,exports){
var Adapter = require(«../adapter»),
Async;

Async = Adapter.extend({
/**
* Creates new Promise with given resolver.
*
* @param {Function} resolver
*/
promise: function(resolver) {
throw new Error(«Method ‘promise’ must be implemented»);
},

/**
* Creates new Promise, that waiting for all given promises/values is resolved.
*
* @param {Array} list
*/
all: function(list) {
throw new Error(«Method ‘all’ must be implemented»);
},

/**
* Creates new resolved with given value Promise.
*
* @param {*} value
*/
resolve: function(value) {
throw new Error(«Method ‘resolve’ must be implemented»);
},

/**
* Creates new rejected with given value Promise.
*
* @param {*} value
*/
reject: function(value) {
throw new Error(«Method ‘reject’ must be implemented»);
}
});

module.exports = Async;
},{«../adapter»:71}],73:[function(require,module,exports){
var Async = require(«../async»),
RSVP;

RSVP = Async.extend({
constructor: function() {
Async.prototype.constructor.apply(this, arguments);
this.RSVP = this.adaptee;
},

promise: function(resolver) {
return new this.RSVP.Promise(resolver);
},

all: function(promises) {
return this.RSVP.all(promises);
},

resolve: function(value) {
return this.RSVP.Promise.resolve(value);
},

reject: function(error) {
return this.RSVP.Promise.reject(error);
}
});

module.exports = RSVP;
},{«../async»:72}],74:[function(require,module,exports){
var Adapter = require(«../adapter»),
Async = require(«./async»),
Loader;

Loader = Adapter.extend({
/**
* Injects async adapter.
*
* @param {Async} adapter
*/
setAsync: function(adapter) {
if (!adapter instanceof Async) {
throw new Error(«Async is expected»);
}

this.async = adapter;

return this;
},

/**
* Requires a module.
*
* @param {string} path
* @param {Object} options
*/
require: function(path, options) {
throw new Error(«Method must be implemented»);
},

/**
* Loads resource.
*
* @param {string} path
* @param {Object} options
*/
read: function(path, options) {
throw new Error(«Method must be implemented»);
}
});

module.exports = Loader;
},{«../adapter»:71,»./async»:72}],75:[function(require,module,exports){
var Loader = require(«../loader»),
Requirejs;

Requirejs = Loader.extend({
constructor: function() {
Loader.prototype.constructor.apply(this, arguments);
this.requirejs = this.adaptee;
},

require: function(path) {
var self = this;
return this.async.promise(function(resolve, reject) {
self.requirejs([path], resolve, reject);
});
},

read: function(path, options) {
var self = this;

options = options || {};

return this.async.promise(function(resolve, reject) {
self.requirejs([[options.handler || «text», path].join(‘!’)], resolve, reject);
});
}
});

module.exports = Requirejs;
},{«../loader»:74}],76:[function(require,module,exports){
var Loader = require(«../loader»),
fs = require(«fs»),
_path = require(«path»),

CJS;

CJS = Loader.extend({
_normalizePath: function(path, options) {
var base;

if ((base = options.base)) {
// normalize path
if (path.charAt(0) === «/») {
path = path.slice(1);
}

return _path.resolve(base, path);
}

return path;
},

require: function(path, options) {
path = this._normalizePath(path, options);

return this.async.promise(function(resolve, reject) {
try {
resolve(require(path));
} catch (err) {
reject(err);
}
});
},

read: function(path, options) {
path = this._normalizePath(path, options);

// how it should work at client side with browserify?
if (fs && fs.readFile) {
return this.async.promise(function(resolve, reject) {
fs.readFile(path, function(err, src) {
if (err) {
reject(err);
} else {
resolve(src);
}
});
});
} else {
// fallback for client side
return this.require(path, options);
}
}
});

module.exports = CJS;
},{«../loader»:74,»fs»:61,»path»:64}],77:[function(require,module,exports){
var inherits = require(«inherits-js»),
Factory;

Factory = function() {
//
};

Factory.prototype = {
constructor: Factory,

/**
*
* @param definition
*
* @returns {Object|Promise}
*/
factory: function(definition) {
throw new Error(«Method must be implemented»);
}
};

Factory.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Factory;
},{«inherits-js»:80}],78:[function(require,module,exports){
var Factory = require(«../factory»),
utils = require(«../../dm/utils»),

isFunction = utils.isFunction,
forEachOwn = utils.forEachOwn,
forEachSimple = utils.forEachSimple;

module.exports = Factory.extend({
newInstanceWithArgs: function(constructor, args) {
var service;

// @see http://jsperf.com/dynamic-arguments-to-the-constructor
function Service() {}
Service.prototype = constructor.prototype;

service = new Service();

try {
constructor.apply(service, args);
} catch (error) {
console.error(«Cannot instantiate service», error);
throw error;
}

return service;
},

makeCall: function(service, method, args) {
if (isFunction(service[method])) {
service[method].apply(service, args);
}
},

setProperty: function(service, property, value) {
service[property] = value;
},

factory: function(definition) {
var self = this,
service;

// Arguments
service = this.newInstanceWithArgs(definition.constructor, definition.arguments);

// Calls
forEachSimple(definition.calls, function(call) {
self.makeCall(service, call[0], call[1]);
});

// Properties
forEachOwn(definition.properties, function(value, property) {
self.setProperty(service, property, value);
});

return service;
}
});

},{«../../dm/utils»:79,»../factory»:77}],79:[function(require,module,exports){
var toString = Object.prototype.toString;

function objectType(obj) {
if (obj === void 0) {
return ‘Undefined’;
} else if (obj === null) {
return ‘Null’;
} else {
return toString.call(obj).replace(/\[object ([a-zA-Z]+)\]/i, ‘$1’);
}
}

function isString(obj) {
return toString.call(obj) == ‘[object String]’;
}

function isNumber(obj) {
return toString.call(obj) == ‘[object Number]’;
}

function isFunction(obj) {
return toString.call(obj) == ‘[object Function]’;
}

function isBoolean(obj) {
return toString.call(obj) == ‘[object Boolean]’;
}

function isDate(obj) {
return toString.call(obj) == ‘[object Date]’;
}

function isObject(obj) {
return toString.call(obj) == ‘[object Object]’ && obj !== void 0;
}

function isRegExp(obj) {
return toString.call(obj) == ‘[object RegExp]’;
}

function isArray(obj) {
return toString.call(obj) == ‘[object Array]’;
}

function isUndefined(obj) {
return toString.call(obj) == ‘[object Undefined]’ || obj === void 0;
}

function noop() {
//
}

var async = {
each: function(obj, iterator, callback) {
var remain, next;

callback = callback || noop;

remain = keys(obj).length;

if (!remain) {
return callback();
}

next = function(err) {
if (err) {
callback(err);
callback = noop;
} else {
remain—;

if (!remain) {
callback();
}
}
};

forEach(obj, function(value, index) {
iterator(value, index, next);
});

return null;
},

eachSeries: function(obj, iterator, callback) {
var index, iteration, next, indexes, remain;

callback = callback || noop;

indexes = keys(obj);
remain = indexes.length;
index = 0;

next = function(err) {
if (err) {
callback(err);
callback = noop;
} else {
remain—;
index++;

if (!remain) {
callback();
} else {
iteration();
}
}
};

iteration = function() {
var key;

key = indexes[index];

iterator(obj[key], key, next);
};

iteration();
},

map: function(arr, iterator, callback) {
var result;

result = [];

this.each(arr, function(value, index, next) {
iterator(value, index, function(err, value) {
result[index] = value;
next(err);
});
}, function(err) {
callback(err, result);
});
},

reduce: function(obj, memo, iterator, callback) {
this.eachSeries(obj, function(value, index, next) {
iterator(memo, value, index, function(err, value) {
memo = value;
next(err);
});
}, function(err) {
callback(err, memo);
});
}
};

function keys(obj) {
var result;

result = [];

if (!isObject(obj) && !isArray(obj)) {
throw new TypeError(«Object or Array is expected»);
}

if (Object.keys) {
return Object.keys(obj);
}

forEach(obj, function(value, key) {
result.push(key);
});

return result;
}

function forEach(obj, iterator, context) {
if (isArray(obj)) {
return forEachSimple(obj, iterator, context);
} else if (isObject(obj)) {
return forEachOwn(obj, iterator, context);
}

throw new TypeError(«Array or Object is expected»);
}

// Iterates over object
// Breaks, if iterator return the value
function forEachOwn(obj, iterator, context) {
var result;

for (var x in obj) {
if (obj.hasOwnProperty(x)) {
result = iterator.call(context, obj[x], x, obj);

if (result !== undefined) {
return result;
}
}
}

return result;
}

// Iterates over array
// Breaks, if iterator return the value
function forEachSimple(arr, iterator, context) {
var result;

for (var x = 0; x < arr.length; x++) { result = iterator.call(context, arr[x], x, arr); if (result !== undefined) { return result; } } return result; } function map(array, iterator, context) { var results = []; if (array === null) { return results; } if (isFunction(array.map)) { return array.map(iterator, context); } forEachSimple(array, function(value, index, list) { results[results.length] = iterator.call(context, value, index, list); }); return results; } function bind(func, context) { var args, slice; slice = Array.prototype.slice; if (isFunction(func.bind)) { return func.bind.apply(func, slice.call(arguments, 1)); } args = slice.call(arguments, 2); return function() { return func.apply(context, args.concat(slice.call(arguments))); }; } // Shallow copy of sprintf // Only uses '%s' placeholder function sprintf(pattern) { var args = Array.prototype.slice.call(arguments, 1), counter = 0; if (!isString(pattern)) { throw new Error("String is expected"); } return pattern.replace(/%s/g, function(match) { return (args[counter++]).toString() || match; }); } // Clone deeply function clone(value) { var result, isArr; if (typeof value == "object") { /* jshint ignore:start */ if (isBoolean(value)) { return new Boolean(+value); } if (isDate(value)) { return new Date(+value); } if (isNumber(value)) { return new Number(value); } if (isString(value)) { return new String(value); } if (isRegExp(value)) { result = new RegExp(value.source, /\w*$/.exec(value)); result.lastIndex = value.lastIndex; return result; } isArr = isArray(value); result = isArr ? new Array(value.length) : new Object(); /* jshint ignore:end */ } else { return value; } (isArr ? forEachSimple : forEachOwn)(value, function(value, key) { result[key] = clone(value); }); return result; } // Extend object with others function extend(obj) { forEachSimple(Array.prototype.slice.call(arguments, 1), function(source) { if (source) { forEachOwn(source, function(value, key) { obj[key] = value; }); } }); return obj; } module.exports = { objectType: objectType, isString: isString, isNumber: isNumber, isFunction: isFunction, isBoolean: isBoolean, isDate: isDate, isObject: isObject, isRegExp: isRegExp, isArray: isArray, isUndefined: isUndefined, forEach: forEach, forEachOwn: forEachOwn, forEachSimple: forEachSimple, map: map, sprintf: sprintf, clone: clone, extend: extend, bind: bind, async: async, keys: keys }; },{}],80:[function(require,module,exports){ var extend = require("./utils/extend"); module.exports = function(Parent, protoProps, staticProps) { var Child; protoProps = protoProps || {}; staticProps = staticProps || {}; if (protoProps.hasOwnProperty("constructor") && typeof protoProps.constructor === 'function') { Child = protoProps.constructor; } else { Child = function() { Parent.apply(this, arguments); }; } // set the static props to the new Enum extend(Child, Parent, staticProps); // create prototype of Child, that created with Parent prototype // // __proto__ <---- __proto__ // ^ ^ // | | // Parent Child // function Surrogate(){} Surrogate.prototype = Parent.prototype; Child.prototype = new Surrogate(); // extend prototype extend(Child.prototype, protoProps, { constructor: Child }); return Child; }; },{"./utils/extend":82}],81:[function(require,module,exports){ /** * Each iterator. * * @param {object} obj * @param {function} func * @param {object} [context] * * @returns {*} */ module.exports = function(obj, func, context) { var result; context || (context = null); for (var x in obj) { if (obj.hasOwnProperty(x)) { result = func.call(context, obj[x], x, obj); if (result !== undefined) { return result; } } } return result; }; },{}],82:[function(require,module,exports){ var each = require("./each"); /** * Extends one object by multiple others. * * @param {object} to * * @returns {object} */ module.exports = function(to) { var from = Array.prototype.slice.call(arguments, 1); var func = function(value, prop) { to[prop] = value; }; for (var x = 0; x < from.length; x++) { each(from[x], func); } return to; }; },{"./each":81}],83:[function(require,module,exports){ (function(){ var _global = this; /** * JS Implementation of MurmurHash2 * * @author Gary Court
* @see http://github.com/garycourt/murmurhash-js
* @author Austin Appleby
* @see http://sites.google.com/site/murmurhash/
*
* @param {string} str ASCII only
* @param {number} seed Positive integer only
* @return {number} 32-bit positive integer hash
*/
function MurmurHashV2(str, seed) {
var
l = str.length,
h = seed ^ l,
i = 0,
k;

while (l >= 4) {
k =
((str.charCodeAt(i) & 0xff)) |
((str.charCodeAt(++i) & 0xff) << 8) | ((str.charCodeAt(++i) & 0xff) << 16) | ((str.charCodeAt(++i) & 0xff) << 24); k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16)); k ^= k >>> 24;
k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16)); h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k; l -= 4; ++i; } switch (l) { case 3: h ^= (str.charCodeAt(i + 2) & 0xff) << 16; case 2: h ^= (str.charCodeAt(i + 1) & 0xff) << 8; case 1: h ^= (str.charCodeAt(i) & 0xff); h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)); } h ^= h >>> 13;
h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)); h ^= h >>> 15;

return h >>> 0;
};

/**
* JS Implementation of MurmurHash3 (r136) (as of May 20, 2011)
*
* @author Gary Court
* @see http://github.com/garycourt/murmurhash-js
* @author Austin Appleby
* @see http://sites.google.com/site/murmurhash/
*
* @param {string} key ASCII only
* @param {number} seed Positive integer only
* @return {number} 32-bit positive integer hash
*/
function MurmurHashV3(key, seed) {
var remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i;

remainder = key.length & 3; // key.length % 4
bytes = key.length — remainder;
h1 = seed;
c1 = 0xcc9e2d51;
c2 = 0x1b873593;
i = 0;

while (i < bytes) { k1 = ((key.charCodeAt(i) & 0xff)) | ((key.charCodeAt(++i) & 0xff) << 8) | ((key.charCodeAt(++i) & 0xff) << 16) | ((key.charCodeAt(++i) & 0xff) << 24); ++i; k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff; k1 = (k1 << 15) | (k1 >>> 17);
k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff; h1 ^= k1; h1 = (h1 << 13) | (h1 >>> 19);
h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff; h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16)); } k1 = 0; switch (remainder) { case 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16; case 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8; case 1: k1 ^= (key.charCodeAt(i) & 0xff); k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; k1 = (k1 << 15) | (k1 >>> 17);
k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; h1 ^= k1; } h1 ^= key.length; h1 ^= h1 >>> 16;
h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff; h1 ^= h1 >>> 13;
h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff; h1 ^= h1 >>> 16;

return h1 >>> 0;
}

var murmur = MurmurHashV3;
murmur.v2 = MurmurHashV2;
murmur.v3 = MurmurHashV3;

if (typeof(module) != ‘undefined’) {
module.exports = murmur;
} else {
var _previousRoot = _global.murmur;
murmur.noConflict = function() {
_global.murmur = _previousRoot;
return murmur;
}
_global.murmur = murmur;
}
}());

},{}],84:[function(require,module,exports){
(function (process){
/*!
* @overview RSVP — a tiny implementation of Promises/A+.
* @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors
* @license Licensed under MIT license
* See https://raw.githubusercontent.com/tildeio/rsvp.js/master/LICENSE
* @version 3.0.14
*/

(function() {
«use strict»;

function $$rsvp$events$$indexOf(callbacks, callback) {
for (var i=0, l=callbacks.length; i 1) {
throw new Error(‘Second argument not supported’);
}
if (typeof o !== ‘object’) {
throw new TypeError(‘Argument must be an object’);
}
$$utils$$F.prototype = o;
return new $$utils$$F();
});

var $$instrument$$queue = [];

var $$instrument$$default = function instrument(eventName, promise, child) {
if (1 === $$instrument$$queue.push({
name: eventName,
payload: {
guid: promise._guidKey + promise._id,
eventName: eventName,
detail: promise._result,
childGuid: child && promise._guidKey + child._id,
label: promise._label,
timeStamp: $$utils$$now(),
stack: new Error(promise._label).stack
}})) {

setTimeout(function() {
var entry;
for (var i = 0; i < $$instrument$$queue.length; i++) { entry = $$instrument$$queue[i]; $$rsvp$config$$config.trigger(entry.name, entry.payload); } $$instrument$$queue.length = 0; }, 50); } }; function $$$internal$$noop() {} var $$$internal$$PENDING = void 0; var $$$internal$$FULFILLED = 1; var $$$internal$$REJECTED = 2; var $$$internal$$GET_THEN_ERROR = new $$$internal$$ErrorObject(); function $$$internal$$getThen(promise) { try { return promise.then; } catch(error) { $$$internal$$GET_THEN_ERROR.error = error; return $$$internal$$GET_THEN_ERROR; } } function $$$internal$$tryThen(then, value, fulfillmentHandler, rejectionHandler) { try { then.call(value, fulfillmentHandler, rejectionHandler); } catch(e) { return e; } } function $$$internal$$handleForeignThenable(promise, thenable, then) { $$rsvp$config$$config.async(function(promise) { var sealed = false; var error = $$$internal$$tryThen(then, thenable, function(value) { if (sealed) { return; } sealed = true; if (thenable !== value) { $$$internal$$resolve(promise, value); } else { $$$internal$$fulfill(promise, value); } }, function(reason) { if (sealed) { return; } sealed = true; $$$internal$$reject(promise, reason); }, 'Settle: ' + (promise._label || ' unknown promise')); if (!sealed && error) { sealed = true; $$$internal$$reject(promise, error); } }, promise); } function $$$internal$$handleOwnThenable(promise, thenable) { if (thenable._state === $$$internal$$FULFILLED) { $$$internal$$fulfill(promise, thenable._result); } else if (promise._state === $$$internal$$REJECTED) { $$$internal$$reject(promise, thenable._result); } else { $$$internal$$subscribe(thenable, undefined, function(value) { if (thenable !== value) { $$$internal$$resolve(promise, value); } else { $$$internal$$fulfill(promise, value); } }, function(reason) { $$$internal$$reject(promise, reason); }); } } function $$$internal$$handleMaybeThenable(promise, maybeThenable) { if (maybeThenable.constructor === promise.constructor) { $$$internal$$handleOwnThenable(promise, maybeThenable); } else { var then = $$$internal$$getThen(maybeThenable); if (then === $$$internal$$GET_THEN_ERROR) { $$$internal$$reject(promise, $$$internal$$GET_THEN_ERROR.error); } else if (then === undefined) { $$$internal$$fulfill(promise, maybeThenable); } else if ($$utils$$isFunction(then)) { $$$internal$$handleForeignThenable(promise, maybeThenable, then); } else { $$$internal$$fulfill(promise, maybeThenable); } } } function $$$internal$$resolve(promise, value) { if (promise === value) { $$$internal$$fulfill(promise, value); } else if ($$utils$$objectOrFunction(value)) { $$$internal$$handleMaybeThenable(promise, value); } else { $$$internal$$fulfill(promise, value); } } function $$$internal$$publishRejection(promise) { if (promise._onerror) { promise._onerror(promise._result); } $$$internal$$publish(promise); } function $$$internal$$fulfill(promise, value) { if (promise._state !== $$$internal$$PENDING) { return; } promise._result = value; promise._state = $$$internal$$FULFILLED; if (promise._subscribers.length === 0) { if ($$rsvp$config$$config.instrument) { $$instrument$$default('fulfilled', promise); } } else { $$rsvp$config$$config.async($$$internal$$publish, promise); } } function $$$internal$$reject(promise, reason) { if (promise._state !== $$$internal$$PENDING) { return; } promise._state = $$$internal$$REJECTED; promise._result = reason; $$rsvp$config$$config.async($$$internal$$publishRejection, promise); } function $$$internal$$subscribe(parent, child, onFulfillment, onRejection) { var subscribers = parent._subscribers; var length = subscribers.length; parent._onerror = null; subscribers[length] = child; subscribers[length + $$$internal$$FULFILLED] = onFulfillment; subscribers[length + $$$internal$$REJECTED] = onRejection; if (length === 0 && parent._state) { $$rsvp$config$$config.async($$$internal$$publish, parent); } } function $$$internal$$publish(promise) { var subscribers = promise._subscribers; var settled = promise._state; if ($$rsvp$config$$config.instrument) { $$instrument$$default(settled === $$$internal$$FULFILLED ? 'fulfilled' : 'rejected', promise); } if (subscribers.length === 0) { return; } var child, callback, detail = promise._result; for (var i = 0; i < subscribers.length; i += 3) { child = subscribers[i]; callback = subscribers[i + settled]; if (child) { $$$internal$$invokeCallback(settled, child, callback, detail); } else { callback(detail); } } promise._subscribers.length = 0; } function $$$internal$$ErrorObject() { this.error = null; } var $$$internal$$TRY_CATCH_ERROR = new $$$internal$$ErrorObject(); function $$$internal$$tryCatch(callback, detail) { try { return callback(detail); } catch(e) { $$$internal$$TRY_CATCH_ERROR.error = e; return $$$internal$$TRY_CATCH_ERROR; } } function $$$internal$$invokeCallback(settled, promise, callback, detail) { var hasCallback = $$utils$$isFunction(callback), value, error, succeeded, failed; if (hasCallback) { value = $$$internal$$tryCatch(callback, detail); if (value === $$$internal$$TRY_CATCH_ERROR) { failed = true; error = value.error; value = null; } else { succeeded = true; } if (promise === value) { $$$internal$$reject(promise, new TypeError('A promises callback cannot return that same promise.')); return; } } else { value = detail; succeeded = true; } if (promise._state !== $$$internal$$PENDING) { // noop } else if (hasCallback && succeeded) { $$$internal$$resolve(promise, value); } else if (failed) { $$$internal$$reject(promise, error); } else if (settled === $$$internal$$FULFILLED) { $$$internal$$fulfill(promise, value); } else if (settled === $$$internal$$REJECTED) { $$$internal$$reject(promise, value); } } function $$$internal$$initializePromise(promise, resolver) { try { resolver(function resolvePromise(value){ $$$internal$$resolve(promise, value); }, function rejectPromise(reason) { $$$internal$$reject(promise, reason); }); } catch(e) { $$$internal$$reject(promise, e); } } function $$enumerator$$makeSettledResult(state, position, value) { if (state === $$$internal$$FULFILLED) { return { state: 'fulfilled', value: value }; } else { return { state: 'rejected', reason: value }; } } function $$enumerator$$Enumerator(Constructor, input, abortOnReject, label) { this._instanceConstructor = Constructor; this.promise = new Constructor($$$internal$$noop, label); this._abortOnReject = abortOnReject; if (this._validateInput(input)) { this._input = input; this.length = input.length; this._remaining = input.length; this._init(); if (this.length === 0) { $$$internal$$fulfill(this.promise, this._result); } else { this.length = this.length || 0; this._enumerate(); if (this._remaining === 0) { $$$internal$$fulfill(this.promise, this._result); } } } else { $$$internal$$reject(this.promise, this._validationError()); } } $$enumerator$$Enumerator.prototype._validateInput = function(input) { return $$utils$$isArray(input); }; $$enumerator$$Enumerator.prototype._validationError = function() { return new Error('Array Methods must be provided an Array'); }; $$enumerator$$Enumerator.prototype._init = function() { this._result = new Array(this.length); }; var $$enumerator$$default = $$enumerator$$Enumerator; $$enumerator$$Enumerator.prototype._enumerate = function() { var length = this.length; var promise = this.promise; var input = this._input; for (var i = 0; promise._state === $$$internal$$PENDING && i < length; i++) { this._eachEntry(input[i], i); } }; $$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) { var c = this._instanceConstructor; if ($$utils$$isMaybeThenable(entry)) { if (entry.constructor === c && entry._state !== $$$internal$$PENDING) { entry._onerror = null; this._settledAt(entry._state, i, entry._result); } else { this._willSettleAt(c.resolve(entry), i); } } else { this._remaining--; this._result[i] = this._makeResult($$$internal$$FULFILLED, i, entry); } }; $$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) { var promise = this.promise; if (promise._state === $$$internal$$PENDING) { this._remaining--; if (this._abortOnReject && state === $$$internal$$REJECTED) { $$$internal$$reject(promise, value); } else { this._result[i] = this._makeResult(state, i, value); } } if (this._remaining === 0) { $$$internal$$fulfill(promise, this._result); } }; $$enumerator$$Enumerator.prototype._makeResult = function(state, i, value) { return value; }; $$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) { var enumerator = this; $$$internal$$subscribe(promise, undefined, function(value) { enumerator._settledAt($$$internal$$FULFILLED, i, value); }, function(reason) { enumerator._settledAt($$$internal$$REJECTED, i, reason); }); }; var $$promise$all$$default = function all(entries, label) { return new $$enumerator$$default(this, entries, true /* abort on reject */, label).promise; }; var $$promise$race$$default = function race(entries, label) { /*jshint validthis:true */ var Constructor = this; var promise = new Constructor($$$internal$$noop, label); if (!$$utils$$isArray(entries)) { $$$internal$$reject(promise, new TypeError('You must pass an array to race.')); return promise; } var length = entries.length; function onFulfillment(value) { $$$internal$$resolve(promise, value); } function onRejection(reason) { $$$internal$$reject(promise, reason); } for (var i = 0; promise._state === $$$internal$$PENDING && i < length; i++) { $$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection); } return promise; }; var $$promise$resolve$$default = function resolve(object, label) { /*jshint validthis:true */ var Constructor = this; if (object && typeof object === 'object' && object.constructor === Constructor) { return object; } var promise = new Constructor($$$internal$$noop, label); $$$internal$$resolve(promise, object); return promise; }; var $$promise$reject$$default = function reject(reason, label) { /*jshint validthis:true */ var Constructor = this; var promise = new Constructor($$$internal$$noop, label); $$$internal$$reject(promise, reason); return promise; }; var $$rsvp$promise$$guidKey = 'rsvp_' + $$utils$$now() + '-'; var $$rsvp$promise$$counter = 0; function $$rsvp$promise$$needsResolver() { throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); } function $$rsvp$promise$$needsNew() { throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); } var $$rsvp$promise$$default = $$rsvp$promise$$Promise; /** Promise objects represent the eventual result of an asynchronous operation. The primary way of interacting with a promise is through its `then` method, which registers callbacks to receive either a promise’s eventual value or the reason why the promise cannot be fulfilled. Terminology ----------- - `promise` is an object or function with a `then` method whose behavior conforms to this specification. - `thenable` is an object or function that defines a `then` method. - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). - `exception` is a value that is thrown using the throw statement. - `reason` is a value that indicates why a promise was rejected. - `settled` the final resting state of a promise, fulfilled or rejected. A promise can be in one of three states: pending, fulfilled, or rejected. Promises that are fulfilled have a fulfillment value and are in the fulfilled state. Promises that are rejected have a rejection reason and are in the rejected state. A fulfillment value is never a thenable. Promises can also be said to *resolve* a value. If this value is also a promise, then the original promise's settled state will match the value's settled state. So a promise that *resolves* a promise that rejects will itself reject, and a promise that *resolves* a promise that fulfills will itself fulfill. Basic Usage: ------------ ```js var promise = new Promise(function(resolve, reject) { // on success resolve(value); // on failure reject(reason); }); promise.then(function(value) { // on fulfillment }, function(reason) { // on rejection }); ``` Advanced Usage: --------------- Promises shine when abstracting away asynchronous interactions such as `XMLHttpRequest`s. ```js function getJSON(url) { return new Promise(function(resolve, reject){ var xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onreadystatechange = handler; xhr.responseType = 'json'; xhr.setRequestHeader('Accept', 'application/json'); xhr.send(); function handler() { if (this.readyState === this.DONE) { if (this.status === 200) { resolve(this.response); } else { reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); } } }; }); } getJSON('/posts.json').then(function(json) { // on fulfillment }, function(reason) { // on rejection }); ``` Unlike callbacks, promises are great composable primitives. ```js Promise.all([ getJSON('/posts'), getJSON('/comments') ]).then(function(values){ values[0] // => postsJSON
values[1] // => commentsJSON

return values;
});
«`

@class RSVP.Promise
@param {function} resolver
@param {String} label optional string for labeling the promise.
Useful for tooling.
@constructor
*/
function $$rsvp$promise$$Promise(resolver, label) {
this._id = $$rsvp$promise$$counter++;
this._label = label;
this._state = undefined;
this._result = undefined;
this._subscribers = [];

if ($$rsvp$config$$config.instrument) {
$$instrument$$default(‘created’, this);
}

if ($$$internal$$noop !== resolver) {
if (!$$utils$$isFunction(resolver)) {
$$rsvp$promise$$needsResolver();
}

if (!(this instanceof $$rsvp$promise$$Promise)) {
$$rsvp$promise$$needsNew();
}

$$$internal$$initializePromise(this, resolver);
}
}

// deprecated
$$rsvp$promise$$Promise.cast = $$promise$resolve$$default;

$$rsvp$promise$$Promise.all = $$promise$all$$default;
$$rsvp$promise$$Promise.race = $$promise$race$$default;
$$rsvp$promise$$Promise.resolve = $$promise$resolve$$default;
$$rsvp$promise$$Promise.reject = $$promise$reject$$default;

$$rsvp$promise$$Promise.prototype = {
constructor: $$rsvp$promise$$Promise,

_guidKey: $$rsvp$promise$$guidKey,

_onerror: function (reason) {
$$rsvp$config$$config.trigger(‘error’, reason);
},

/**
The primary way of interacting with a promise is through its `then` method,
which registers callbacks to receive either a promise’s eventual value or the
reason why the promise cannot be fulfilled.

«`js
findUser().then(function(user){
// user is available
}, function(reason){
// user is unavailable, and you are given the reason why
});
«`

Chaining
———

The return value of `then` is itself a promise. This second, ‘downstream’
promise is resolved with the return value of the first promise’s fulfillment
or rejection handler, or rejected if the handler throws an exception.

«`js
findUser().then(function (user) {
return user.name;
}, function (reason) {
return ‘default name’;
}).then(function (userName) {
// If `findUser` fulfilled, `userName` will be the user’s name, otherwise it
// will be `’default name’`
});

findUser().then(function (user) {
throw new Error(‘Found user, but still unhappy’);
}, function (reason) {
throw new Error(‘`findUser` rejected and we’re unhappy’);
}).then(function (value) {
// never reached
}, function (reason) {
// if `findUser` fulfilled, `reason` will be ‘Found user, but still unhappy’.
// If `findUser` rejected, `reason` will be ‘`findUser` rejected and we’re unhappy’.
});
«`
If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.

«`js
findUser().then(function (user) {
throw new PedagogicalException(‘Upstream error’);
}).then(function (value) {
// never reached
}).then(function (value) {
// never reached
}, function (reason) {
// The `PedgagocialException` is propagated all the way down to here
});
«`

Assimilation
————

Sometimes the value you want to propagate to a downstream promise can only be
retrieved asynchronously. This can be achieved by returning a promise in the
fulfillment or rejection handler. The downstream promise will then be pending
until the returned promise is settled. This is called *assimilation*.

«`js
findUser().then(function (user) {
return findCommentsByAuthor(user);
}).then(function (comments) {
// The user’s comments are now available
});
«`

If the assimliated promise rejects, then the downstream promise will also reject.

«`js
findUser().then(function (user) {
return findCommentsByAuthor(user);
}).then(function (comments) {
// If `findCommentsByAuthor` fulfills, we’ll have the value here
}, function (reason) {
// If `findCommentsByAuthor` rejects, we’ll have the reason here
});
«`

Simple Example
—————

Synchronous Example

«`javascript
var result;

try {
result = findResult();
// success
} catch(reason) {
// failure
}
«`

Errback Example

«`js
findResult(function(result, err){
if (err) {
// failure
} else {
// success
}
});
«`

Promise Example;

«`javascript
findResult().then(function(result){
// success
}, function(reason){
// failure
});
«`

Advanced Example
—————

Synchronous Example

«`javascript
var author, books;

try {
author = findAuthor();
books = findBooksByAuthor(author);
// success
} catch(reason) {
// failure
}
«`

Errback Example

«`js

function foundBooks(books) {

}

function failure(reason) {

}

findAuthor(function(author, err){
if (err) {
failure(err);
// failure
} else {
try {
findBoooksByAuthor(author, function(books, err) {
if (err) {
failure(err);
} else {
try {
foundBooks(books);
} catch(reason) {
failure(reason);
}
}
});
} catch(error) {
failure(err);
}
// success
}
});
«`

Promise Example;

«`javascript
findAuthor().
then(findBooksByAuthor).
then(function(books){
// found books
})[‘catch’](function(reason){
// something went wrong
});
«`

@method then
@param {Function} onFulfilled
@param {Function} onRejected
@param {String} label optional string for labeling the promise.
Useful for tooling.
@return {Promise}
*/
then: function(onFulfillment, onRejection, label) {
var parent = this;
var state = parent._state;

if (state === $$$internal$$FULFILLED && !onFulfillment || state === $$$internal$$REJECTED && !onRejection) {
if ($$rsvp$config$$config.instrument) {
$$instrument$$default(‘chained’, this, this);
}
return this;
}

parent._onerror = null;

var child = new this.constructor($$$internal$$noop, label);
var result = parent._result;

if ($$rsvp$config$$config.instrument) {
$$instrument$$default(‘chained’, parent, child);
}

if (state) {
var callback = arguments[state — 1];
$$rsvp$config$$config.async(function(){
$$$internal$$invokeCallback(state, child, callback, result);
});
} else {
$$$internal$$subscribe(parent, child, onFulfillment, onRejection);
}

return child;
},

/**
`catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
as the catch block of a try/catch statement.

«`js
function findAuthor(){
throw new Error(‘couldn’t find that author’);
}

// synchronous
try {
findAuthor();
} catch(reason) {
// something went wrong
}

// async with promises
findAuthor()[‘catch’](function(reason){
// something went wrong
});
«`

@method catch
@param {Function} onRejection
@param {String} label optional string for labeling the promise.
Useful for tooling.
@return {Promise}
*/
‘catch’: function(onRejection, label) {
return this.then(null, onRejection, label);
},

/**
`finally` will be invoked regardless of the promise’s fate just as native
try/catch/finally behaves

Synchronous example:

«`js
findAuthor() {
if (Math.random() > 0.5) {
throw new Error();
}
return new Author();
}

try {
return findAuthor(); // succeed or fail
} catch(error) {
return findOtherAuther();
} finally {
// always runs
// doesn’t affect the return value
}
«`

Asynchronous example:

«`js
findAuthor()[‘catch’](function(reason){
return findOtherAuther();
})[‘finally’](function(){
// author was either found, or not
});
«`

@method finally
@param {Function} callback
@param {String} label optional string for labeling the promise.
Useful for tooling.
@return {Promise}
*/
‘finally’: function(callback, label) {
var constructor = this.constructor;

return this.then(function(value) {
return constructor.resolve(callback()).then(function(){
return value;
});
}, function(reason) {
return constructor.resolve(callback()).then(function(){
throw reason;
});
}, label);
}
};

function $$rsvp$node$$Result() {
this.value = undefined;
}

var $$rsvp$node$$ERROR = new $$rsvp$node$$Result();
var $$rsvp$node$$GET_THEN_ERROR = new $$rsvp$node$$Result();

function $$rsvp$node$$getThen(obj) {
try {
return obj.then;
} catch(error) {
$$rsvp$node$$ERROR.value= error;
return $$rsvp$node$$ERROR;
}
}

function $$rsvp$node$$tryApply(f, s, a) {
try {
f.apply(s, a);
} catch(error) {
$$rsvp$node$$ERROR.value = error;
return $$rsvp$node$$ERROR;
}
}

function $$rsvp$node$$makeObject(_, argumentNames) {
var obj = {};
var name;
var i;
var length = _.length;
var args = new Array(length);

for (var x = 0; x < length; x++) { args[x] = _[x]; } for (i = 0; i < argumentNames.length; i++) { name = argumentNames[i]; obj[name] = args[i + 1]; } return obj; } function $$rsvp$node$$arrayResult(_) { var length = _.length; var args = new Array(length - 1); for (var i = 1; i < length; i++) { args[i - 1] = _[i]; } return args; } function $$rsvp$node$$wrapThenable(then, promise) { return { then: function(onFulFillment, onRejection) { return then.call(promise, onFulFillment, onRejection); } }; } var $$rsvp$node$$default = function denodeify(nodeFunc, options) { var fn = function() { var self = this; var l = arguments.length; var args = new Array(l + 1); var arg; var promiseInput = false; for (var i = 0; i < l; ++i) { arg = arguments[i]; if (!promiseInput) { // TODO: clean this up promiseInput = $$rsvp$node$$needsPromiseInput(arg); if (promiseInput === $$rsvp$node$$GET_THEN_ERROR) { var p = new $$rsvp$promise$$default($$$internal$$noop); $$$internal$$reject(p, $$rsvp$node$$GET_THEN_ERROR.value); return p; } else if (promiseInput && promiseInput !== true) { arg = $$rsvp$node$$wrapThenable(promiseInput, arg); } } args[i] = arg; } var promise = new $$rsvp$promise$$default($$$internal$$noop); args[l] = function(err, val) { if (err) $$$internal$$reject(promise, err); else if (options === undefined) $$$internal$$resolve(promise, val); else if (options === true) $$$internal$$resolve(promise, $$rsvp$node$$arrayResult(arguments)); else if ($$utils$$isArray(options)) $$$internal$$resolve(promise, $$rsvp$node$$makeObject(arguments, options)); else $$$internal$$resolve(promise, val); }; if (promiseInput) { return $$rsvp$node$$handlePromiseInput(promise, args, nodeFunc, self); } else { return $$rsvp$node$$handleValueInput(promise, args, nodeFunc, self); } }; fn.__proto__ = nodeFunc; return fn; }; function $$rsvp$node$$handleValueInput(promise, args, nodeFunc, self) { var result = $$rsvp$node$$tryApply(nodeFunc, self, args); if (result === $$rsvp$node$$ERROR) { $$$internal$$reject(promise, result.value); } return promise; } function $$rsvp$node$$handlePromiseInput(promise, args, nodeFunc, self){ return $$rsvp$promise$$default.all(args).then(function(args){ var result = $$rsvp$node$$tryApply(nodeFunc, self, args); if (result === $$rsvp$node$$ERROR) { $$$internal$$reject(promise, result.value); } return promise; }); } function $$rsvp$node$$needsPromiseInput(arg) { if (arg && typeof arg === 'object') { if (arg.constructor === $$rsvp$promise$$default) { return true; } else { return $$rsvp$node$$getThen(arg); } } else { return false; } } var $$rsvp$all$$default = function all(array, label) { return $$rsvp$promise$$default.all(array, label); }; function $$rsvp$all$settled$$AllSettled(Constructor, entries, label) { this._superConstructor(Constructor, entries, false /* don't abort on reject */, label); } $$rsvp$all$settled$$AllSettled.prototype = $$utils$$o_create($$enumerator$$default.prototype); $$rsvp$all$settled$$AllSettled.prototype._superConstructor = $$enumerator$$default; $$rsvp$all$settled$$AllSettled.prototype._makeResult = $$enumerator$$makeSettledResult; $$rsvp$all$settled$$AllSettled.prototype._validationError = function() { return new Error('allSettled must be called with an array'); }; var $$rsvp$all$settled$$default = function allSettled(entries, label) { return new $$rsvp$all$settled$$AllSettled($$rsvp$promise$$default, entries, label).promise; }; var $$rsvp$race$$default = function race(array, label) { return $$rsvp$promise$$default.race(array, label); }; function $$promise$hash$$PromiseHash(Constructor, object, label) { this._superConstructor(Constructor, object, true, label); } var $$promise$hash$$default = $$promise$hash$$PromiseHash; $$promise$hash$$PromiseHash.prototype = $$utils$$o_create($$enumerator$$default.prototype); $$promise$hash$$PromiseHash.prototype._superConstructor = $$enumerator$$default; $$promise$hash$$PromiseHash.prototype._init = function() { this._result = {}; }; $$promise$hash$$PromiseHash.prototype._validateInput = function(input) { return input && typeof input === 'object'; }; $$promise$hash$$PromiseHash.prototype._validationError = function() { return new Error('Promise.hash must be called with an object'); }; $$promise$hash$$PromiseHash.prototype._enumerate = function() { var promise = this.promise; var input = this._input; var results = []; for (var key in input) { if (promise._state === $$$internal$$PENDING && input.hasOwnProperty(key)) { results.push({ position: key, entry: input[key] }); } } var length = results.length; this._remaining = length; var result; for (var i = 0; promise._state === $$$internal$$PENDING && i < length; i++) { result = results[i]; this._eachEntry(result.entry, result.position); } }; var $$rsvp$hash$$default = function hash(object, label) { return new $$promise$hash$$default($$rsvp$promise$$default, object, label).promise; }; function $$rsvp$hash$settled$$HashSettled(Constructor, object, label) { this._superConstructor(Constructor, object, false, label); } $$rsvp$hash$settled$$HashSettled.prototype = $$utils$$o_create($$promise$hash$$default.prototype); $$rsvp$hash$settled$$HashSettled.prototype._superConstructor = $$enumerator$$default; $$rsvp$hash$settled$$HashSettled.prototype._makeResult = $$enumerator$$makeSettledResult; $$rsvp$hash$settled$$HashSettled.prototype._validationError = function() { return new Error('hashSettled must be called with an object'); }; var $$rsvp$hash$settled$$default = function hashSettled(object, label) { return new $$rsvp$hash$settled$$HashSettled($$rsvp$promise$$default, object, label).promise; }; var $$rsvp$rethrow$$default = function rethrow(reason) { setTimeout(function() { throw reason; }); throw reason; }; var $$rsvp$defer$$default = function defer(label) { var deferred = { }; deferred.promise = new $$rsvp$promise$$default(function(resolve, reject) { deferred.resolve = resolve; deferred.reject = reject; }, label); return deferred; }; var $$rsvp$map$$default = function map(promises, mapFn, label) { return $$rsvp$promise$$default.all(promises, label).then(function(values) { if (!$$utils$$isFunction(mapFn)) { throw new TypeError("You must pass a function as map's second argument."); } var length = values.length; var results = new Array(length); for (var i = 0; i < length; i++) { results[i] = mapFn(values[i]); } return $$rsvp$promise$$default.all(results, label); }); }; var $$rsvp$resolve$$default = function resolve(value, label) { return $$rsvp$promise$$default.resolve(value, label); }; var $$rsvp$reject$$default = function reject(reason, label) { return $$rsvp$promise$$default.reject(reason, label); }; var $$rsvp$filter$$default = function filter(promises, filterFn, label) { return $$rsvp$promise$$default.all(promises, label).then(function(values) { if (!$$utils$$isFunction(filterFn)) { throw new TypeError("You must pass a function as filter's second argument."); } var length = values.length; var filtered = new Array(length); for (var i = 0; i < length; i++) { filtered[i] = filterFn(values[i]); } return $$rsvp$promise$$default.all(filtered, label).then(function(filtered) { var results = new Array(length); var newLength = 0; for (var i = 0; i < length; i++) { if (filtered[i]) { results[newLength] = values[i]; newLength++; } } results.length = newLength; return results; }); }); }; var $$rsvp$asap$$len = 0; var $$rsvp$asap$$default = function asap(callback, arg) { $$rsvp$asap$$queue[$$rsvp$asap$$len] = callback; $$rsvp$asap$$queue[$$rsvp$asap$$len + 1] = arg; $$rsvp$asap$$len += 2; if ($$rsvp$asap$$len === 2) { // If len is 1, that means that we need to schedule an async flush. // If additional callbacks are queued before the queue is flushed, they // will be processed by this flush that we are scheduling. $$rsvp$asap$$scheduleFlush(); } }; var $$rsvp$asap$$browserGlobal = (typeof window !== 'undefined') ? window : {}; var $$rsvp$asap$$BrowserMutationObserver = $$rsvp$asap$$browserGlobal.MutationObserver || $$rsvp$asap$$browserGlobal.WebKitMutationObserver; // test for web worker but not in IE10 var $$rsvp$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined'; // node function $$rsvp$asap$$useNextTick() { return function() { process.nextTick($$rsvp$asap$$flush); }; } function $$rsvp$asap$$useMutationObserver() { var iterations = 0; var observer = new $$rsvp$asap$$BrowserMutationObserver($$rsvp$asap$$flush); var node = document.createTextNode(''); observer.observe(node, { characterData: true }); return function() { node.data = (iterations = ++iterations % 2); }; } // web worker function $$rsvp$asap$$useMessageChannel() { var channel = new MessageChannel(); channel.port1.onmessage = $$rsvp$asap$$flush; return function () { channel.port2.postMessage(0); }; } function $$rsvp$asap$$useSetTimeout() { return function() { setTimeout($$rsvp$asap$$flush, 1); }; } var $$rsvp$asap$$queue = new Array(1000); function $$rsvp$asap$$flush() { for (var i = 0; i < $$rsvp$asap$$len; i+=2) { var callback = $$rsvp$asap$$queue[i]; var arg = $$rsvp$asap$$queue[i+1]; callback(arg); $$rsvp$asap$$queue[i] = undefined; $$rsvp$asap$$queue[i+1] = undefined; } $$rsvp$asap$$len = 0; } var $$rsvp$asap$$scheduleFlush; // Decide what async method to use to triggering processing of queued callbacks: if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') { $$rsvp$asap$$scheduleFlush = $$rsvp$asap$$useNextTick(); } else if ($$rsvp$asap$$BrowserMutationObserver) { $$rsvp$asap$$scheduleFlush = $$rsvp$asap$$useMutationObserver(); } else if ($$rsvp$asap$$isWorker) { $$rsvp$asap$$scheduleFlush = $$rsvp$asap$$useMessageChannel(); } else { $$rsvp$asap$$scheduleFlush = $$rsvp$asap$$useSetTimeout(); } // default async is asap; $$rsvp$config$$config.async = $$rsvp$asap$$default; var $$rsvp$$cast = $$rsvp$resolve$$default; function $$rsvp$$async(callback, arg) { $$rsvp$config$$config.async(callback, arg); } function $$rsvp$$on() { $$rsvp$config$$config.on.apply($$rsvp$config$$config, arguments); } function $$rsvp$$off() { $$rsvp$config$$config.off.apply($$rsvp$config$$config, arguments); } // Set up instrumentation through `window.__PROMISE_INTRUMENTATION__` if (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') { var $$rsvp$$callbacks = window['__PROMISE_INSTRUMENTATION__']; $$rsvp$config$$configure('instrument', true); for (var $$rsvp$$eventName in $$rsvp$$callbacks) { if ($$rsvp$$callbacks.hasOwnProperty($$rsvp$$eventName)) { $$rsvp$$on($$rsvp$$eventName, $$rsvp$$callbacks[$$rsvp$$eventName]); } } } var rsvp$umd$$RSVP = { 'race': $$rsvp$race$$default, 'Promise': $$rsvp$promise$$default, 'allSettled': $$rsvp$all$settled$$default, 'hash': $$rsvp$hash$$default, 'hashSettled': $$rsvp$hash$settled$$default, 'denodeify': $$rsvp$node$$default, 'on': $$rsvp$$on, 'off': $$rsvp$$off, 'map': $$rsvp$map$$default, 'filter': $$rsvp$filter$$default, 'resolve': $$rsvp$resolve$$default, 'reject': $$rsvp$reject$$default, 'all': $$rsvp$all$$default, 'rethrow': $$rsvp$rethrow$$default, 'defer': $$rsvp$defer$$default, 'EventTarget': $$rsvp$events$$default, 'configure': $$rsvp$config$$configure, 'async': $$rsvp$$async }; /* global define:true module:true window: true */ if (typeof define === 'function' && define.amd) { define(function() { return rsvp$umd$$RSVP; }); } else if (typeof module !== 'undefined' && module.exports) { module.exports = rsvp$umd$$RSVP; } else if (typeof this !== 'undefined') { this['RSVP'] = rsvp$umd$$RSVP; } }).call(this); }).call(this,require("+xKvab")) },{"+xKvab":65}],85:[function(require,module,exports){ module.exports={"parameters":{"onload":null,"submit_direct":"https://form-test.kupivkredit.ru:443/form","sdk_path":"https://form-test.kupivkredit.ru:443/sdk/v1/sdk.js","button_path":"https://kupivkredit-test-fe.tcsbank.ru:443/button/index.php","build":"17299b8a21f600c82c96520e261846dbd216a073"},"services":{"factory":{"path":"/sdk/src/utils/factory.js"},"factory.sdk":{"path":"/sdk/src/utils/factory/sdk.js"},"bus":{"path":"/common/script/src/events/bus/emitter.js"},"uuid":{"path":"/sdk/src/uuid/murmurhash.js"},"utils":{"path":"/sdk/src/utils/impl.js","arguments":["@events.element"]},"query":{"path":"/common/script/src/location/query/document.js"},"cookie":{"path":"/common/script/src/cookie/service/default.js"},"cookie.prefix":{"path":"/common/script/src/cookie/service/default.js","arguments":[{"namespace":"kvk"}]},"utm":{"path":"/common/script/src/utm/utm/default.js","arguments":[{"cookie":{"expires":10800000}}],"calls":[["injectCookie",["@cookie.prefix"]],["addSource",["@utm.source.query.plain",false]],["addSource",["@utm.source.cookie.plain",false]],["addSource",["@utm.source.cookie.utmz",true]],["addSource",["@utm.source.query.utm_source",true]],["addSource",["@utm.source.query.lp",true]]]},"utm.source.query.plain":{"path":"/common/script/src/utm/source/query/plain.js","calls":[["injectQuery",["@query"]]]},"utm.source.query.utm_source":{"path":"/common/script/src/utm/source/query/utm_source.js","calls":[["injectQuery",["@query"]]]},"utm.source.query.lp":{"path":"/common/script/src/utm/source/query/lp.js","calls":[["injectQuery",["@query"]]]},"utm.source.cookie.plain":{"path":"/common/script/src/utm/source/cookie/plain.js","calls":[["injectCookie",["@cookie.prefix"]]]},"utm.source.cookie.utmz":{"path":"/common/script/src/utm/source/cookie/utmz.js","calls":[["injectCookie",["@cookie"]]]},"utm.source.composite.cookie":{"path":"/common/script/src/utm/source/composite.js","calls":[["addSource",["@utm.source.cookie.plain"]],["addSource",["@utm.source.cookie.utmz"]]]},"sdk.adapter":{"path":"/sdk/src/sdk/adapter.js","arguments":["@sdk.loader",{"button_path":"%{button_path}"}]},"sdk.loader":{"path":"/sdk/src/sdk/loader/script.js","arguments":[{"path":"%{sdk_path}","callback":"kvk_sdk_loader_%{build}"}]},"sdk":{"path":"/sdk/src/sdk/sdk.js","factory":"@factory.sdk","arguments":[{"onload":"%onload%"}],"calls":[["setBus",["@bus"]],["add",["ui","@ui",{"isFunctor":true}]]]},"ui":{"path":"/sdk/src/sdk/ui/impl.js","calls":[["setBus",["@bus"]],["addElementBuilder",["form","@builder.form"]],["addEventsHandler",["@events.handler.bus"]]]},"builder.form":{"path":"/sdk/src/sdk/ui/element/builder/form.js","calls":[["setUUID",["@uuid"]],["setSubmitter",["@submitter.form"]],["setCommunicationMaster",["@communication.master"]],["setUtils",["@utils"]],["setElementEventManager",["@events.element"]]]},"submitter.form":{"path":"/sdk/src/sdk/ui/element/submitter/form.js","calls":[["setTransport",["@transport.direct"]],["injectUTM",["@utm"]]]},"transport.direct":{"path":"/sdk/src/transport/form.js","calls":[["setUUID",["@uuid"]],["setElementEventManager",["@events.element"]],["setUtils",["@utils"]]],"arguments":[{"action":"%submit_direct%","method":"POST"}]},"communication.master":{"path":"/common/script/src/communication/master/default.js","arguments":["@uuid"],"calls":[["injectCommutation",["@communication.commutation"]]]},"communication.commutation":{"path":"/common/script/src/communication/commutation/condition.js","arguments":[{"postMessage":"@communication.commutation.post_message","hash":"@communication.commutation.hash"}]},"communication.commutation.hash":{"path":"/common/script/src/communication/commutation/hash.js","arguments":[{"reader":{"interval":100}}]},"communication.commutation.post_message":{"path":"/common/script/src/communication/commutation/post-message.js"},"events.handler.bus":{"path":"/common/script/src/events/handler/bus.js","calls":[["setBus",["@bus"]]]},"events.element":{"path":"/common/script/src/events/element/default.js"}}} },{}],86:[function(require,module,exports){ var DM = require("dm"), BroodyPromise = require("broody-promises"), config = require("./config.json"), dm, async, loader, SDK; async = new (DM.async.RSVP.extend({ promise: function(resolver) { return new BroodyPromise(resolver); }, all: function(list) { return BroodyPromise.all(list); }, resolve: function(value) { return BroodyPromise.resolve(value); }, reject: function(value) { return BroodyPromise.reject(value); } })); loader = (new DM.loader.cjs(require)).setAsync(async); dm = (new DM.DependencyManager()).setAsync(async).setLoader(loader); dm.setConfig(config.services, config.parameters); module.exports = dm; },{"./config.json":85,"broody-promises":58,"dm":69}],87:[function(require,module,exports){ var sdk; module.exports = sdk = require("./dm") .get("sdk") .done(); // call wrapper function, if it is present for bundling if (typeof register == "function") { register(sdk); } },{"./dm":86}],"/sdk/src/sdk/sdk.js":[function(require,module,exports){ module.exports=require('wfDo2d'); },{}],"wfDo2d":[function(require,module,exports){ /** * Kupivkredit SDK. * * @package kvk * @author Sergey Kamardin
*/

var _ = require(«lodash»),
inherits = require(«inherits-js»),
assert = require(«assert»),
util = require(«util»),

SDK;

SDK = function(options) {
this.options = _.extend({}, this.constructor.DEFAULTS, options);
};

SDK.DEFAULTS = {};

SDK.prototype = {
constructor: SDK,

/**
* Inject the bus.
*
* @param {Bus} bus
*/
setBus: function(bus) {
this.bus = bus;
},

/**
* Initialize sdk.
*
* @param {Object} parameters
* @param {Object} [options]
*/
initialize: function(parameters, options) {
// do nothing
},

onload: function() {
var fnName;

if (fnName = this.options.onload) {
if (_.isFunction(window[fnName])) {
window[fnName].call(null, this);
} else {
// warn
}
}
},

/**
* Add sdk module.
*
* @param {String} name
* @param {Object} object
* @param {Object} [options]
*
* @returns {SDK}
*/
add: function(name, object, options) {
assert(_.isUndefined(this[name]), util.format(«Can not register module with name ‘%s'», name));
assert(_.isObject(object), util.format(«Object is expected for module with name ‘%s'», name));

options = options || {};

if (options.isFunctor) {
this[name] = function() {
return object.call.apply(object, arguments);
}
} else {
this[name] = object;
}

if (_.isFunction(object.boot)) {
object.boot(options);
}

return this;
}
};

SDK.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = SDK;
},{«assert»:62,»inherits-js»:80,»lodash»:»7ZYSzK»,»util»:68}],90:[function(require,module,exports){
var EventEmitter = require(«../../../common/script/src/events/emitter/node»),
_ = require(«lodash»),
UI;

/**
* UI
*
* @class UI
* @extends EventEmitter
* @author Sergey Kamardin
*/
UI = EventEmitter.extend(
/**
* @lends UI.prototype
*/
{
constructor: function(options) {
EventEmitter.prototype.constructor.apply(this, arguments);

this.options = _.extend({}, this.constructor.DEFAULTS, options);
},

/**
* Inject the bus.
*
* @param {Bus} bus
*/
setBus: function(bus) {
this.bus = bus;
},

addEventsHandler: function(handler) {
throw new Error(«Method must be implemented»);
},

call: function(name, parameters, options) {
throw new Error(«Method must be implemented»);
},

addElement: function(name, element) {
throw new Error(«Method must be implemented»);
}
}
);

module.exports = UI;
},{«../../../common/script/src/events/emitter/node»:31,»lodash»:»7ZYSzK»}],91:[function(require,module,exports){
var EventEmitter = require(«../../../../common/script/src/events/emitter/node»),
_ = require(«lodash»),
Element;

/**
* Element
*
* @class Element
* @extends EventEmitter
* @author Sergey Kamardin
*/
Element = EventEmitter.extend(
/**
* @lends Element.prototype
*/
{
constructor: function(options) {
EventEmitter.prototype.constructor.apply(this, arguments);

this.options = _.extend({}, this.constructor.DEFAULTS, options);
},

setUtils: function(utils) {
this.utils = utils;
},

setElementEventManager: function(events) {
this.events = events;
}
}
);

module.exports = Element;
},{«../../../../common/script/src/events/emitter/node»:31,»lodash»:»7ZYSzK»}],92:[function(require,module,exports){
/**
* Builder
*
* @package Builder
* @author Sergey Kamardin
*/

var _ = require(«lodash»),
inherits = require(«inherits-js»),
Builder;

Builder = function(options) {
this.options = _.extend({}, this.constructor.DEFAULTS, options);
};

Builder.DEFAULTS = {};

Builder.prototype = {
constructor: Builder,

setUtils: function(utils) {
this.utils = utils;
},

setElementEventManager: function(events) {
this.events = events;
},

build: function(parameters, options) {
throw new Error(«Method must be implemented»);
},

getConstructor: function() {
throw new Error(«Method must be implemented»);
}
};

Builder.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Builder;
},{«inherits-js»:80,»lodash»:»7ZYSzK»}],»8SfbTa»:[function(require,module,exports){
/**
* Builder
*
* @package Builder
* @author Sergey Kamardin
*/

var Builder = require(«../builder»),
Form = require(«../form»),
_ = require(«lodash»);

module.exports = Builder.extend({
setSubmitter: function(submitter) {
this.submitter = submitter;
},

setUUID: function(uuid) {
this.uuid = uuid;
},

setCommunicationMaster: function(communicationMaster) {
this.communicationMaster = communicationMaster;
},

build: function(parameters, options) {
var form;

form = new Form(options);

form.setSubmitter(this.submitter);
form.setUUID(this.uuid);
form.setUtils(this.utils);
form.setElementEventManager(this.events);
form.setCommunicationMaster(this.communicationMaster);

form.initialize(parameters);

return form;
}
});
},{«../builder»:92,»../form»:95,»lodash»:»7ZYSzK»}],»/sdk/src/sdk/ui/element/builder/form.js»:[function(require,module,exports){
module.exports=require(‘8SfbTa’);
},{}],95:[function(require,module,exports){
/**
* Element
*
* @package Element
* @author Sergey Kamardin
*/

var Element = require(«../element»),
_ = require(«lodash»),
Promise = require(«broody-promises»),
ProxyTrait = require(«../../../../../common/script/src/events/trait/proxy»);

module.exports = Element.extend(_.extend({
constructor: function(options) {
Element.prototype.constructor.apply(this, arguments);

this.background = null;
this.frame = null;
this.parameters = null;
this.pending = null;
this.connection = null;
},

setUUID: function(uuid) {
this.uuid = uuid;
},

setSubmitter: function(submitter) {
this.submitter = submitter;
},

setCommunicationMaster: function(communicationMaster) {
this.communicationMaster = communicationMaster;
},

initialize: function(parameters) {
var err;

if (err = this.submitter.validate(parameters)) {
throw err;
}

this.parameters = parameters;
},

_createLoader: function() {
var loader;

loader = document.createElement(«div»);

_.extend(loader.style, {
«position»: «absolute»,
«top»: «0»,
«left»: «0»,
«bottom»: «0»,
«right»: «0»,
«width»: «100%»,
«height»: «100%»,
«zIndex»: «9998»,
«background»: «#fff»,
«opacity»: «0.5»,
«filter»: «alpha(opacity=50)»
});

return Promise.resolve(loader);
},

_getContainer: function() {
var self = this,
container;

if (!(container = this.container)) {
this.container = container = Promise.all([this.utils.getDocumentHeight(), this.utils.getHighestIndex()])
.then(function(list) {
var height, index, container;

height = list[0];
index = list[1];

container = document.createElement(«div»);

_.extend(container.style, {
«position»: «absolute»,
«top»: «0»,
«left»: «0»,
«width»: «100%»,
«height»: height + «px»,
«zIndex»: index.toString()
});

self.events.on(window, «resize», (function() {
var timeoutID;

return function() {
clearTimeout(timeoutID);

timeoutID = setTimeout(function() {
// getting height of viewport — the doc height, or higher
self.utils.getCanvasHeight(height).then(function(height) {
container.style.height = height + «px»;
});
}, 30);
};
})());

return container;
});
}

return container;
},

_getBackground: function() {
var background;

if (!(background = this.background)) {
this.background = background = this.utils.getDocumentHeight().then(function(height) {
var background;

background = document.createElement(«div»);

_.extend(background.style, {
«position»: «absolute»,
«top»: «0»,
«left»: «0»,
«width»: «100%»,
«height»: «100%»,
«zIndex»: «9997»,
«background»: «#000»,
«opacity»: «0.4»,
«filter»: «alpha(opacity=40)»
});

return background;
});
}

return background;
},

_getFrame: function() {
var self = this,
frame;

if (!(frame = this.frame)) {
this.frame = frame = Promise.all([this.utils.getBodyScrollTop()])
.then(function(list) {
var scrollTop;

scrollTop = list[0];

frame = document.createElement(«iframe»);

frame.setAttribute(«allowTransparency», «true»);
frame.setAttribute(«frameBorder», «0»);
frame.setAttribute(«scrolling», «auto»);
frame.setAttribute(«name», self.uuid.generate(«kvk_form»));

frame.scrollIntoView = function() {
self.utils.getBodyScrollTop()
.then(function(actualScrollTop) {
if (actualScrollTop == scrollTop) {
return;
}

self.utils.animate(function(easing) {
self.utils.setBodyScrollTop(actualScrollTop — ((actualScrollTop — scrollTop) * easing));
}, 500, «easeOutQuart»);
});
};

_.extend(frame.style, {
«border»: «0px»,
«position»: «absolute»,
«top»: scrollTop + «px»,
«left»: «0»,
«width»: «100%»,
«height»: «100%»,
«zIndex»: «9998»
});

return frame;
});
}

return frame;
},

_listenConnection: function(connection) {
var self = this;

this.connection = connection;

// «_NEW_» => «open»
// «onClose» => «close»
// «onStep» => «page» (ignored)
// «onFormComplete» => «complete»
// «onDecision» => «decision»
// «onAccept» => «admit»
// «onCancel» => «deny»
// ——————————
// «onBeforeClose» => «escape» // todo

// proxy events to client
_.forEach([«decision», «admit», «deny», «escape», «complete»], function(event) {
connection.on(event, self._proxy(event, {
self: true
}));
});

connection.on(«rpc:request», function(request) {
var method, params, id;

method = request.method;
params = request.params;
id = request.id;

switch (method) {
case «viewport:height»: {
self.utils.getViewportHeight()
.then(function(height) {
connection.response(id, { result: height });
});

break;
}
}
});

connection.on(«close», function() {
self.close();
});
},

open: function() {
var self = this,
pending;

if (!(pending = this.pending)) {
pending = this.pending = this.utils.documentReady()
.then(function() {
return Promise.all([self._getContainer(), self._getBackground(), self._getFrame(), self._createLoader()]);
})
.then(function(deps) {
var container, background, frame, loader;

container = deps[0];
background = deps[1];
frame = deps[2];
loader = deps[3];

container.appendChild(background);
container.appendChild(loader);
container.appendChild(frame);

document.body.appendChild(container);

return self.submitter.submit(self.parameters, self.options, { frame: frame })
.then(function() {
container.removeChild(loader);
})
.then(function() {
return self.communicationMaster.connect(frame.contentWindow, {
location: self.submitter.getUrl()
});
})
.then(function(connection) {
self._listenConnection(connection);
});
});
}

return Promise.all([self._getContainer(), self._getFrame(), pending])
.then(function(list) {
var container, frame;

container = list[0];
frame = list[1];

// if it was closed
container.style.display = «block»;

frame.scrollIntoView();

self.emit(«open»);

self.connection.on(«page», function() {
frame.scrollIntoView();
});
// self.connection.on(«dimensions», function(dimensions) {
// self._getFrame().then(function(frame) {
// _.extend(frame.style, dimensions);
// });
// });
});
},

close: function() {
var self = this;

return this._getContainer()
.then(function(container) {
container.style.display = «none»;
self.emit(«close»);
});
}
},
_.extend(
{
DEFAULTS: {}
},
ProxyTrait
)
));
},{«../../../../../common/script/src/events/trait/proxy»:35,»../element»:91,»broody-promises»:58,»lodash»:»7ZYSzK»}],96:[function(require,module,exports){
/**
* Submitter
*
* @package submitter
* @author Sergey Kamardin
*/

var _ = require(«lodash»),
inherits = require(«inherits-js»),
Promise = require(«broody-promises»),
util = require(«util»),

Submitter;

Submitter = function(options) {
this.options = _.extend({}, this.constructor.DEFAULTS, options);
};

Submitter.DEFAULTS = {};

Submitter.prototype = {
constructor: Submitter,

parameters: {
// key: necessary
},

setTransport: function(transport) {
this.transport = transport;
},

_extract: function(parameters) {
return _.reduce(this.parameters, function(memo, definition) {
var key, isNecessary, defaultValue, value;

key = definition.name;
isNecessary = definition.necessary;
defaultValue = definition.value;

if (_.isUndefined(value = parameters[key])) {
if (isNecessary) {
throw new Error(util.format(«Necessary parameter ‘%s’ is expected», key));
} else {
value = defaultValue;
}
}

memo[key] = value;

return memo;
}, {});
},

validate: function(parameters) {
try {
this._extract(parameters);
return null;
} catch (err) {
return err;
}
},

submit: function(parameters, options, cfg) {
var self = this;

return this.getExtra()
.then(function(extra) {
return self.transport.send({
parameters: _.extend(self._extract(parameters), { extra: extra }),
options: options
}, cfg);
});
},

getUrl: function() {
return this.transport.getUrl();
},

getExtra: function() {
return Promise.resolve({});
}
};

Submitter.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Submitter;
},{«broody-promises»:58,»inherits-js»:80,»lodash»:»7ZYSzK»,»util»:68}],»/sdk/src/sdk/ui/element/submitter/form.js»:[function(require,module,exports){
module.exports=require(‘jIG+UT’);
},{}],»jIG+UT»:[function(require,module,exports){
/**
* Submitter
*
* @package Submitter
* @author Sergey Kamardin
*/

var Submitter = require(«../submitter»),
UTM = require(«../../../../../../common/script/src/utm/utm»),
assert = require(«assert»),
Promise = require(«broody-promises»),
_ = require(«lodash»);

module.exports = Submitter.extend({
parameters: [
{
name: «sign»,
necessary: true
},
{
name: «order»,
necessary: true
},
{
name: «type»,
necessary: false,
value: «full»
},
{
name: «login»,
necessary: false,
value: null
}
,
{
name: «goodIdentity»,
necessary: false,
value: null
}
],

injectUTM: function(utm) {
assert(_.isEmpty(this.utm), «UTM is already set»);
assert(utm instanceof UTM, «UTM is expected»);
this.utm = utm;
},

getExtra: function() {
var self = this;

return new Promise(function(resolve, reject) {
self.utm.get(function(err, utm) {
if (err) {
reject(err);
return;
}

resolve({utm: utm});
});
});
}
});
},{«../../../../../../common/script/src/utm/utm»:55,»../submitter»:96,»assert»:62,»broody-promises»:58,»lodash»:»7ZYSzK»}],»/sdk/src/sdk/ui/impl.js»:[function(require,module,exports){
module.exports=require(‘H6HCnk’);
},{}],»H6HCnk»:[function(require,module,exports){
/**
* UI
*
* @package UI
* @author Sergey Kamardin
*/

var UI = require(«../ui»),
util = require(«util»),
assert = require(«assert»),
_ = require(«lodash»),
Builder = require(«./element/builder»),
Handler = require(«../../../../common/script/src/events/handler»),
EventEmitter = require(«../../../../common/script/src/events/emitter»),
ProxyTrait = require(«../../../../common/script/src/events/trait/proxy»);

module.exports = UI.extend(_.extend({
constructor: function() {
UI.prototype.constructor.apply(this, arguments);

this.builders = {};
this.elements = {};
this.handlers = [];
},

addEventsHandler: function(handler) {
assert(handler instanceof Handler, «Handler is expected»);
this.handlers.push(handler);
},

registerElement: function(name, element) {
var elements;

if (!(elements = this.elements[name])) {
this.elements[name] = [element];
} else {
elements.push(element);
}

element.on(EventEmitter.ALL, this._proxy({
prefixer: function(event) {
return util.format(«ui:%s:%s», name, event);
}
}));
},

call: function(name, parameters, options) {
var builder, element;

if (!(builder = this.builders[name])) {
throw new Error(util.format(«Unknown element ‘%s'», name));
}

this.registerElement(name, (element = builder.build(parameters, options)));

return element;
},

addElementBuilder: function(name, builder) {
assert(builder instanceof Builder, «Builder is expected»);
this.builders[name] = builder;
}
}, ProxyTrait));
},{«../../../../common/script/src/events/emitter»:30,»../../../../common/script/src/events/handler»:32,»../../../../common/script/src/events/trait/proxy»:35,»../ui»:90,»./element/builder»:92,»assert»:62,»lodash»:»7ZYSzK»,»util»:68}],»/sdk/src/transport/form.js»:[function(require,module,exports){
module.exports=require(‘PIvlzb’);
},{}],»PIvlzb»:[function(require,module,exports){
/**
* Transport
*
* @package Transport
* @author Sergey Kamardin
*/

var Transport = require(«./transport»),
_ = require(«lodash»),
Promise = require(«broody-promises»),

FormTransport;

FormTransport = Transport.extend({
_createFrame: function() {
var frame, unique;

frame = document.createElement(«iframe»);
unique = this.uuid.generate(«kvk_transport»);

frame.setAttribute(«allowTransparency», «true»);
frame.setAttribute(«frameBorder», «0»);
frame.setAttribute(«name», unique);

_.extend(frame.style, {
border: «0px»,
position: «absolute»,
top: «-10000px»,
left: «-10000px»
});

return frame;
},

setElementEventManager: function(events) {
this.events = events;
},

setUtils: function(utils) {
this.utils = utils;
},

send: function(parameters, options) {
var self = this;

return new Promise(function(resolve) {
var form, frame;

form = document.createElement(«form»);

if (!(frame = options.frame)) {
frame = self._createFrame();
document.body.appendChild(frame);
} else {
if (!frame.getAttribute(«name»)) {
throw new Error(«Frame must have name»);
}
}

self.events.once(frame, «load», resolve);

form.setAttribute(«method», self.options.method);
form.setAttribute(«action», self.options.action);
form.setAttribute(«target», frame.getAttribute(«name»));

_.forEach(self.utils.flatten(parameters), function(value, parameter) {
var input;

input = document.createElement(‘input’);

input.setAttribute(«type», «hidden»);
input.setAttribute(«name», parameter);

if (!_.isNull(value)) {
input.setAttribute(«value», value);
}

form.appendChild(input);
});

document.body.appendChild(form);

form.submit();
});
}
});

FormTransport.DEFAULTS = {
method: «POST»
};

module.exports = FormTransport;
},{«./transport»:103,»broody-promises»:58,»lodash»:»7ZYSzK»}],103:[function(require,module,exports){
/**
* Transport
*
* @package Transport
* @author Sergey Kamardin
*/

var _ = require(«lodash»),
inherits = require(«inherits-js»),
Transport;

Transport = function(options) {
this.options = _.extend({}, this.constructor.DEFAULTS, options);
};

Transport.DEFAULTS = {};

Transport.prototype = {
constructor: Transport,

setUUID: function(uuid) {
this.uuid = uuid;
},

send: function(parameters, options) {
throw new Error(«Method must be implemented»);
},

getUrl: function() {
return this.options.action;
}
};

Transport.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Transport;
},{«inherits-js»:80,»lodash»:»7ZYSzK»}],»cEACDx»:[function(require,module,exports){
var _ = require(«lodash»);

module.exports = {
each: function(obj, iterator, callback) {
var remain, next;

callback = callback || _.noop;

remain = _.keys(obj).length;

if (!remain) {
return callback();
}

next = function(err) {
if (err) {
callback(err);
callback = _.noop;
} else {
remain—;

if (!remain) {
callback();
}
}
};

_.forEach(obj, function(value, index) {
iterator(value, index, next);
});

return null;
},

eachSeries: function(obj, iterator, callback) {
var index, iteration, next, indexes, remain;

callback = callback || _.noop;

indexes = _.keys(obj);
remain = indexes.length;
index = 0;

if (!remain) {
return callback();
}

next = function(err) {
if (err) {
callback(err);
} else {
remain—;
index++;

if (!remain) {
callback();
} else {
iteration();
}
}
};

iteration = function() {
var key;

key = indexes[index];

try {
iterator(obj[key], key, next);
} catch (err) {
next(err);
}
};

iteration();
},

map: function(arr, iterator, callback) {
var result;

result = [];

this.each(arr, function(value, index, next) {
iterator(value, function(err, value) {
result[index] = value;
next(err);
});
}, function(err) {
callback(err, result);
});
},

reduce: function(obj, memo, iterator, callback) {
this.eachSeries(obj, function(value, index, next) {
try {
iterator(memo, value, function(err, value) {
memo = value;
next(err);
});
} catch (err) {
next(err);
}
}, function(err) {
callback(err, memo);
});
}
};
},{«lodash»:»7ZYSzK»}],»async»:[function(require,module,exports){
module.exports=require(‘cEACDx’);
},{}],»27mqzb»:[function(require,module,exports){
/**
* Router factory
*
* @package util
* @author Sergey Kamardin
*/

var _ = require(«lodash»),
inherits = require(«inherits-js»),
Factory;

Factory = function() {
};

Factory.prototype = {
constructor: Factory,

_new: function(constructor, args) {
var service;

function Service() {}
Service.prototype = constructor.prototype;

service = new Service();

try {
constructor.apply(service, args);
} catch (error) {
console.error(«Cannot instantiate service», error);
throw error;
}

return service;
},

_makeCall: function(service, key, args) {
if (_.isFunction(service[key])) {
service[key].apply(service, args);
}
},

_setProperty: function(service, key, value) {
service[key] = value;
},

_factory: function(definition) {
var self = this,
service;

// Arguments
service = this._new(definition.constructor, definition.arguments);

// Calls
_.each(definition.calls, function(call) {
self._makeCall(service, call[0], call[1]);
});

// Properties
_.each(definition.properties, function(value, key) {
self._setProperty(service, key, value);
});

return service;
},

_initialize: function(service) {
if (_.isFunction(service.initialize)) {
service.initialize();
}
},

factory: function (definition) {
var service = this._factory(definition);

this._initialize(service);

return service;
}
};

Factory.extend = function(protos, statics) {
return inherits(this, protos, statics);
};

module.exports = Factory;
},{«inherits-js»:80,»lodash»:»7ZYSzK»}],»/sdk/src/utils/factory.js»:[function(require,module,exports){
module.exports=require(’27mqzb’);
},{}],»IOBVlz»:[function(require,module,exports){
/**
* Factory
*
* @package Factory
* @author Sergey Kamardin
*/

var Factory = require(«../factory»),
_ = require(«lodash»);

module.exports = Factory.extend({
_initialize: function(service) {
service.onload();
}
});

},{«../factory»:»27mqzb»,»lodash»:»7ZYSzK»}],»/sdk/src/utils/factory/sdk.js»:[function(require,module,exports){
module.exports=require(‘IOBVlz’);
},{}],»/sdk/src/utils/impl.js»:[function(require,module,exports){
module.exports=require(‘GAgsTt’);
},{}],»GAgsTt»:[function(require,module,exports){
var Utils = require(«./utils»),
Promise = require(«broody-promises»),
_ = require(«lodash»),
_easing = require(«../../../common/script/src/util/easing»),
DefaultUtils;

/**
* DefaultUtils
*
* @class DefaultUtils
* @extends Utils
* @author Sergey Kamardin
*/
DefaultUtils = Utils.extend(
/**
* @lends DefaultUtils.prototype
*/
{
// DOMReady + images + scripts handler
/*pageReady: function() {
var self = this;

return new Promise(function(resolve) {
var resolveOnce;

if (document.readyState === «complete») {
resolve();
} else {
resolveOnce = _.once(resolve);

self.events.once(window, «load», resolveOnce);

// fallback for broken scripts/images
if (document.readyState === «interactive») {
setTimeout(resolveOnce, 1000);
}
}
});
},*/

// DOMReady handler
documentReady: function() {
var self = this;

return new Promise(function(resolve) {
var resolveOnce;

// jquery says that interactive is bringing some jsp errors
// but some kvk partners have interactive state on payment pages
// so keep on interactive and pray
if (document.readyState === «complete» || document.readyState === «interactive») {
resolve();
} else {
resolveOnce = _.once(resolve);
self.events.once(window, «load», resolveOnce);
self.events.once(window, «DOMContentLoaded», resolveOnce);
}
});
},

getDocumentHeight: function() {
return this.documentReady()
.then(function() {
var body, element;

body = document.body;
element = document.documentElement;

return Math.max(
Math.max(body.scrollHeight, element.scrollHeight),
Math.max(body.offsetHeight, element.offsetHeight),
Math.max(body.clientHeight, element.clientHeight)
);
});
},

getViewportHeight: function() {
return this.documentReady()
.then(function() {
return Math.max(document.documentElement.clientHeight, window.innerHeight || 0)
});
},

getCanvasHeight: function(height) {
return Promise.all([height || this.getDocumentHeight(), this.getViewportHeight()])
.then(function(list) {
var docHeight, winHeight;

docHeight = list[0];
winHeight = list[1];

return docHeight > winHeight ? docHeight : winHeight;
});
//
// return Promise.resolve(window.innerHeight);
},

getBodyScrollTop: function() {
return this.documentReady()
.then(function() {
return parseInt((document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop), 10);
});
},

getStyle: function(element, property) {
try {
if (window.getComputedStyle) {
return document.defaultView.getComputedStyle(element, null).getPropertyValue(property);
} else if (element.currentStyle) {
return element.currentStyle[property];
} else if (element.style) {
return element.style[property] || null;
}
} catch (err) {}

return null;
},

getHighestIndex: function(defaultIndex) {
var self = this;

defaultIndex = defaultIndex || 9999;

function indexes(element) {
var test, zIndex;

if (self.getStyle(element, «position») === «static») {
return _.reduce(element.children || [], function(list, child) {
return list.concat(indexes(child));
}, []);
}

test = true;
test = test && (zIndex = self.getStyle(element, «z-index»)) !== «auto»;
test = test && !_.isNaN(zIndex = parseInt(zIndex));

return test ? [zIndex] : [];
}

return this.documentReady()
.then(function() {
var list;

list = indexes(document.body).concat(defaultIndex);

if (list.length > 5000) {
return defaultIndex;
}

return Math.max.apply(Math, list);
});
},

setBodyScrollTop: function(value) {
return this.documentReady()
.then(function() {
var element;

element = (document.documentElement && document.documentElement.scrollTop) ? document.documentElement : document.body;

element.scrollTop = value;
});
},

flatten: function(obj) {
function flatten(obj) {
return _.reduce(obj, function(memo, value, key) {
if (_.isObject(value)) {
_.forEach(flatten(value), function(v, k) {
memo[key + «.» + k] = v;
});
} else {
memo[key] = value;
}

return memo;
}, {})
}

return flatten(obj);
},

animate: (function() {
var requestAnimationFrame;

function now() {
return Date.now ? Date.now() : (new Date).getTime();
}

requestAnimationFrame = window.requestAnimationFrame || (function() {
var vendors, found,
lastTime;

vendors = [‘ms’, ‘moz’, ‘webkit’, ‘o’];

for(var x = 0; x < vendors.length && !found; ++x) { found = window[vendors[x]+'RequestAnimationFrame']; } if (!found) { lastTime = 0; found = function(fn) { var timeoutID, currentTime, timeToNext, nextLastTime; currentTime = now(); timeToNext = Math.max(0, 16 - (currentTime - lastTime)); nextLastTime = currentTime + timeToNext; // console.log("poly", timeToNext, nextLastTime); timeoutID = setTimeout(function() { fn.call(null, nextLastTime); }, timeToNext); lastTime = nextLastTime; return timeoutID; }; } return found; })(); return function(fn, duration, easing) { easing = _easing[easing] || _easing["linear"]; return new Promise(function(resolve) { var start; start = now(); function tick() { var time, factor, current; current = now(); time = current - start; if (time < duration) { factor = easing(time, 0, 1, duration); // console.log(time, factor); fn.call(null, factor); requestAnimationFrame(tick); } else { fn.call(null, 1); // console.log(time, 'STOP'); resolve(); } } requestAnimationFrame(tick); }); } })() } ); module.exports = DefaultUtils; },{"../../../common/script/src/util/easing":39,"./utils":112,"broody-promises":58,"lodash":"7ZYSzK"}],112:[function(require,module,exports){ var _ = require("lodash"), inherits = require("inherits-js"), Events = require("../../../common/script/src/events/element"), Utils; /** * Utils * * @class Utils * @constructor * @abstract * * @param {Events} events * @param {Object} [options] * * @author Sergey Kamardin
*/
Utils = function(events, options) {
if (!(events instanceof Events)) {
throw new TypeError(«Events is expected»);
}

this.events = events;
this.options = _.extend({}, this.constructor.DEFAULTS, options);
};

Utils.DEFAULTS = {};

Utils.prototype = {
constructor: Utils,

/**
* @abstract
*/
flatten: function(obj) {
throw new Error(«Method ‘flatten’ must be implemented»);
},

/**
* @abstract
*/
unflatten: function(obj) {
throw new Error(«Method ‘unflatten’ must be implemented»);
},

/**
* @abstract
*/
documentReady: function() {
throw new Error(«Method ‘windowReady’ must be implemented»);
},

/**
* @abstract
*/
getDocumentHeight: function() {
throw new Error(«Method must be implemented»);
},

/**
* @abstract
*/
getCanvasHeight: function(height) {
throw new Error(«Method must be implemented»);
},

/**
* @abstract
*/
getViewportHeight: function() {
throw new Error(«Method must be implemented»);
},

/**
* @abstract
*/
getBodyScrollTop: function() {
throw new Error(«Method must be implemented»);
},

/**
* @abstract
*/
getBodyScrollLeft: function() {
throw new Error(«Method must be implemented»);
},

/**
* @abstract
*/
animate: function(fn, duration, easing) {
throw new Error(«Method must be implemented»);
}
};

Utils.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = Utils;
},{«../../../common/script/src/events/element»:27,»inherits-js»:80,»lodash»:»7ZYSzK»}],»/sdk/src/uuid/murmurhash.js»:[function(require,module,exports){
module.exports=require(‘wBycvh’);
},{}],»wBycvh»:[function(require,module,exports){
/**
* UUID
*
* @package UUID
* @author Sergey Kamardin
*/

var UUID = require(«./uuid»),
_ = require(«lodash»),
murmurhash = require(«murmurhash»);

module.exports = UUID.extend({
generate: function(key) {
var buffer;

buffer = [];

buffer.push(new Date().getTime());
buffer.push(Math.random() * (1000 — 1) + 1);

return (_.isString(key) ? key : «»).concat(murmurhash(buffer.join(»)));
}
});
},{«./uuid»:115,»lodash»:»7ZYSzK»,»murmurhash»:83}],115:[function(require,module,exports){
/**
* UUID
*
* @package UUID
* @author Sergey Kamardin
*/

var _ = require(«lodash»),
inherits = require(«inherits-js»),
UUID;

UUID = function(options) {
this.options = _.extend({}, UUID.DEFAULTS, options);
};

UUID.DEFAULTS = {};

UUID.prototype = {
constructor: UUID,

generate: function(key, options) {
throw new Error(«Method must be implemented»);
}
};

UUID.extend = function(prots, statics) {
return inherits(this, prots, statics);
};

module.exports = UUID;

},{«inherits-js»:80,»lodash»:»7ZYSzK»}],»7ZYSzK»:[function(require,module,exports){
(function (global){
/**
* @license
* Lo-Dash 2.4.1 (Custom Build)
* Build: `lodash exports=»node» include=»forEach,map,extend,merge,find,isNull,isNaN,isEmpty,isUndefined,isFunction,isBoolean,isString,isObject,has,reduce,once,indexOf,remove,bind,any,times,pluck,chain,where,keys,difference» -d -o lodash.js`
* Copyright 2012-2013 The Dojo Foundation
* Based on Underscore.js 1.5.2
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
* Available under MIT license
*/
;(function() {

/** Used to pool arrays and objects used internally */
var arrayPool = [],
objectPool = [];

/** Used internally to indicate various things */
var indicatorObject = {};

/** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */
var keyPrefix = +new Date + »;

/** Used as the size when optimizations are enabled for large arrays */
var largeArraySize = 75;

/** Used as the max size of the `arrayPool` and `objectPool` */
var maxPoolSize = 40;

/** Used to detected named functions */
var reFuncName = /^\s*function[ \n\r\t]+\w/;

/** Used to detect functions containing a `this` reference */
var reThis = /\bthis\b/;

/** Used to fix the JScript [[DontEnum]] bug */
var shadowedProps = [
‘constructor’, ‘hasOwnProperty’, ‘isPrototypeOf’, ‘propertyIsEnumerable’,
‘toLocaleString’, ‘toString’, ‘valueOf’
];

/** `Object#toString` result shortcuts */
var argsClass = ‘[object Arguments]’,
arrayClass = ‘[object Array]’,
boolClass = ‘[object Boolean]’,
dateClass = ‘[object Date]’,
errorClass = ‘[object Error]’,
funcClass = ‘[object Function]’,
numberClass = ‘[object Number]’,
objectClass = ‘[object Object]’,
regexpClass = ‘[object RegExp]’,
stringClass = ‘[object String]’;

/** Used as the property descriptor for `__bindData__` */
var descriptor = {
‘configurable’: false,
‘enumerable’: false,
‘value’: null,
‘writable’: false
};

/** Used as the data object for `iteratorTemplate` */
var iteratorData = {
‘args’: »,
‘array’: null,
‘bottom’: »,
‘firstArg’: »,
‘init’: »,
‘keys’: null,
‘loop’: »,
‘shadowedProps’: null,
‘support’: null,
‘top’: »,
‘useHas’: false
};

/** Used to determine if values are of the language type Object */
var objectTypes = {
‘boolean’: false,
‘function’: true,
‘object’: true,
‘number’: false,
‘string’: false,
‘undefined’: false
};

/** Used as a reference to the global object */
var root = (objectTypes[typeof window] && window) || this;

/** Detect free variable `exports` */
var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;

/** Detect free variable `module` */
var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;

/** Detect the popular CommonJS extension `module.exports` */
var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;

/** Detect free variable `global` from Node.js or Browserified code and use it as `root` */
var freeGlobal = objectTypes[typeof global] && global;
if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {
root = freeGlobal;
}

/*—————————————————————————*/

/**
* The base implementation of `_.indexOf` without support for binary searches
* or `fromIndex` constraints.
*
* @private
* @param {Array} array The array to search.
* @param {*} value The value to search for.
* @param {number} [fromIndex=0] The index to search from.
* @returns {number} Returns the index of the matched value or `-1`.
*/
function baseIndexOf(array, value, fromIndex) {
var index = (fromIndex || 0) — 1,
length = array ? array.length : 0;

while (++index < length) { if (array[index] === value) { return index; } } return -1; } /** * An implementation of `_.contains` for cache objects that mimics the return * signature of `_.indexOf` by returning `0` if the value is found, else `-1`. * * @private * @param {Object} cache The cache object to inspect. * @param {*} value The value to search for. * @returns {number} Returns `0` if `value` is found, else `-1`. */ function cacheIndexOf(cache, value) { var type = typeof value; cache = cache.cache; if (type == 'boolean' || value == null) { return cache[value] ? 0 : -1; } if (type != 'number' && type != 'string') { type = 'object'; } var key = type == 'number' ? value : keyPrefix + value; cache = (cache = cache[type]) && cache[key]; return type == 'object' ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)
: (cache ? 0 : -1);
}

/**
* Adds a given value to the corresponding cache object.
*
* @private
* @param {*} value The value to add to the cache.
*/
function cachePush(value) {
var cache = this.cache,
type = typeof value;

if (type == ‘boolean’ || value == null) {
cache[value] = true;
} else {
if (type != ‘number’ && type != ‘string’) {
type = ‘object’;
}
var key = type == ‘number’ ? value : keyPrefix + value,
typeCache = cache[type] || (cache[type] = {});

if (type == ‘object’) {
(typeCache[key] || (typeCache[key] = [])).push(value);
} else {
typeCache[key] = true;
}
}
}

/**
* Creates a cache object to optimize linear searches of large arrays.
*
* @private
* @param {Array} [array=[]] The array to search.
* @returns {null|Object} Returns the cache object or `null` if caching should not be used.
*/
function createCache(array) {
var index = -1,
length = array.length,
first = array[0],
mid = array[(length / 2) | 0],
last = array[length — 1];

if (first && typeof first == ‘object’ &&
mid && typeof mid == ‘object’ && last && typeof last == ‘object’) {
return false;
}
var cache = getObject();
cache[‘false’] = cache[‘null’] = cache[‘true’] = cache[‘undefined’] = false;

var result = getObject();
result.array = array;
result.cache = cache;
result.push = cachePush;

while (++index < length) { result.push(array[index]); } return result; } /** * Gets an array from the array pool or creates a new one if the pool is empty. * * @private * @returns {Array} The array from the pool. */ function getArray() { return arrayPool.pop() || []; } /** * Gets an object from the object pool or creates a new one if the pool is empty. * * @private * @returns {Object} The object from the pool. */ function getObject() { return objectPool.pop() || { 'array': null, 'cache': null, 'false': false, 'null': false, 'number': null, 'object': null, 'push': null, 'string': null, 'true': false, 'undefined': false }; } /** * Checks if `value` is a DOM node in IE < 9. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if the `value` is a DOM node, else `false`. */ function isNode(value) { // IE < 9 presents DOM nodes as `Object` objects except they have `toString` // methods that are `typeof` "string" and still can coerce nodes to strings return typeof value.toString != 'function' && typeof (value + '') == 'string'; } /** * Releases the given array back to the array pool. * * @private * @param {Array} [array] The array to release. */ function releaseArray(array) { array.length = 0; if (arrayPool.length < maxPoolSize) { arrayPool.push(array); } } /** * Releases the given object back to the object pool. * * @private * @param {Object} [object] The object to release. */ function releaseObject(object) { var cache = object.cache; if (cache) { releaseObject(cache); } object.array = object.cache =object.object = object.number = object.string =null; if (objectPool.length < maxPoolSize) { objectPool.push(object); } } /** * Slices the `collection` from the `start` index up to, but not including, * the `end` index. * * Note: This function is used instead of `Array#slice` to support node lists * in IE < 9 and to ensure dense arrays are returned. * * @private * @param {Array|Object|string} collection The collection to slice. * @param {number} start The start index. * @param {number} end The end index. * @returns {Array} Returns the new array. */ function slice(array, start, end) { start || (start = 0); if (typeof end == 'undefined') { end = array ? array.length : 0; } var index = -1, length = end - start || 0, result = Array(length < 0 ? 0 : length); while (++index < length) { result[index] = array[start + index]; } return result; } /*--------------------------------------------------------------------------*/ /** * Used for `Array` method references. * * Normally `Array.prototype` would suffice, however, using an array literal * avoids issues in Narwhal. */ var arrayRef = []; /** Used for native method references */ var errorProto = Error.prototype, objectProto = Object.prototype, stringProto = String.prototype; /** Used to resolve the internal [[Class]] of values */ var toString = objectProto.toString; /** Used to detect if a method is native */ var reNative = RegExp('^' + String(toString) .replace(/[.*+?^${}()|[\]\\]/g, '\\$&') .replace(/toString| for [^\]]+/g, '.*?') + '$' ); /** Native method shortcuts */ var fnToString = Function.prototype.toString, getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf, hasOwnProperty = objectProto.hasOwnProperty, push = arrayRef.push, propertyIsEnumerable = objectProto.propertyIsEnumerable, splice = arrayRef.splice, unshift = arrayRef.unshift; /** Used to set meta data on functions */ var defineProperty = (function() { // IE 8 only accepts DOM elements try { var o = {}, func = isNative(func = Object.defineProperty) && func, result = func(o, o, o) && func; } catch(e) { } return result; }()); /* Native method shortcuts for methods with the same name as other `lodash` methods */ var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate, nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray, nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys, nativeMax = Math.max; /** Used to avoid iterating non-enumerable properties in IE < 9 */ var nonEnumProps = {}; nonEnumProps[arrayClass] = nonEnumProps[dateClass] = nonEnumProps[numberClass] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true }; nonEnumProps[boolClass] = nonEnumProps[stringClass] = { 'constructor': true, 'toString': true, 'valueOf': true }; nonEnumProps[errorClass] = nonEnumProps[funcClass] = nonEnumProps[regexpClass] = { 'constructor': true, 'toString': true }; nonEnumProps[objectClass] = { 'constructor': true }; (function() { var length = shadowedProps.length; while (length--) { var key = shadowedProps[length]; for (var className in nonEnumProps) { if (hasOwnProperty.call(nonEnumProps, className) && !hasOwnProperty.call(nonEnumProps[className], key)) { nonEnumProps[className][key] = false; } } } }()); /*--------------------------------------------------------------------------*/ /** * Creates a `lodash` object which wraps the given value to enable intuitive * method chaining. * * In addition to Lo-Dash methods, wrappers also have the following `Array` methods: * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`, * and `unshift` * * Chaining is supported in custom builds as long as the `value` method is * implicitly or explicitly included in the build. * * The chainable wrapper functions are: * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`, * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`, * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`, * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`, * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`, * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`, * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`, * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`, * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`, * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`, * and `zip` * * The non-chainable wrapper functions are: * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`, * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`, * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`, * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`, * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`, * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`, * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`, * `template`, `unescape`, `uniqueId`, and `value` * * The wrapper functions `first` and `last` return wrapped values when `n` is * provided, otherwise they return unwrapped values. * * Explicit chaining can be enabled by using the `_.chain` method. * * @name _ * @constructor * @category Chaining * @param {*} value The value to wrap in a `lodash` instance. * @returns {Object} Returns a `lodash` instance. * @example * * var wrapped = _([1, 2, 3]); * * // returns an unwrapped value * wrapped.reduce(function(sum, num) { * return sum + num; * }); * // => 6
*
* // returns a wrapped value
* var squares = wrapped.map(function(num) {
* return num * num;
* });
*
* _.isArray(squares);
* // => false
*
* _.isArray(squares.value());
* // => true
*/
function lodash(value) {
// don’t wrap if already wrapped, even if wrapped by a different `lodash` constructor
return (value && typeof value == ‘object’ && !isArray(value) && hasOwnProperty.call(value, ‘__wrapped__’))
? value
: new lodashWrapper(value);
}

/**
* A fast path for creating `lodash` wrapper objects.
*
* @private
* @param {*} value The value to wrap in a `lodash` instance.
* @param {boolean} chainAll A flag to enable chaining for all methods
* @returns {Object} Returns a `lodash` instance.
*/
function lodashWrapper(value, chainAll) {
this.__chain__ = !!chainAll;
this.__wrapped__ = value;
}
// ensure `new lodashWrapper` is an instance of `lodash`
lodashWrapper.prototype = lodash.prototype;

/**
* An object used to flag environments features.
*
* @static
* @memberOf _
* @type Object
*/
var support = lodash.support = {};

(function() {
var ctor = function() { this.x = 1; },
object = { ‘0’: 1, ‘length’: 1 },
props = [];

ctor.prototype = { ‘valueOf’: 1, ‘y’: 1 };
for (var key in new ctor) { props.push(key); }
for (key in arguments) { }

/**
* Detect if an `arguments` object’s [[Class]] is resolvable (all but Firefox < 4, IE < 9). * * @memberOf _.support * @type boolean */ support.argsClass = toString.call(arguments) == argsClass; /** * Detect if `arguments` objects are `Object` objects (all but Narwhal and Opera < 10.5). * * @memberOf _.support * @type boolean */ support.argsObject = arguments.constructor == Object && !(arguments instanceof Array); /** * Detect if `name` or `message` properties of `Error.prototype` are * enumerable by default. (IE < 9, Safari < 5.1) * * @memberOf _.support * @type boolean */ support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') || propertyIsEnumerable.call(errorProto, 'name'); /** * Detect if `prototype` properties are enumerable by default. * * Firefox < 3.6, Opera > 9.50 — Opera < 11.60, and Safari < 5.1 * (if the prototype or a property on the prototype has been set) * incorrectly sets a function's `prototype` property [[Enumerable]] * value to `true`. * * @memberOf _.support * @type boolean */ support.enumPrototypes = propertyIsEnumerable.call(ctor, 'prototype'); /** * Detect if functions can be decompiled by `Function#toString` * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps). * * @memberOf _.support * @type boolean */ support.funcDecomp = !isNative(root.WinRTError) && reThis.test(function() { return this; }); /** * Detect if `Function#name` is supported (all but IE). * * @memberOf _.support * @type boolean */ support.funcNames = typeof Function.name == 'string'; /** * Detect if `arguments` object indexes are non-enumerable * (Firefox < 4, IE < 9, PhantomJS, Safari < 5.1). * * @memberOf _.support * @type boolean */ support.nonEnumArgs = key != 0; /** * Detect if properties shadowing those on `Object.prototype` are non-enumerable. * * In IE < 9 an objects own properties, shadowing non-enumerable ones, are * made non-enumerable as well (a.k.a the JScript [[DontEnum]] bug). * * @memberOf _.support * @type boolean */ support.nonEnumShadows = !/valueOf/.test(props); /** * Detect if own properties are iterated after inherited properties (all but IE < 9). * * @memberOf _.support * @type boolean */ support.ownLast = props[0] != 'x'; /** * Detect if `Array#shift` and `Array#splice` augment array-like objects correctly. * * Firefox < 10, IE compatibility mode, and IE < 9 have buggy Array `shift()` * and `splice()` functions that fail to remove the last element, `value[0]`, * of array-like objects even though the `length` property is set to `0`. * The `shift()` method is buggy in IE 8 compatibility mode, while `splice()` * is buggy regardless of mode in IE < 9 and buggy in compatibility mode in IE 9. * * @memberOf _.support * @type boolean */ support.spliceObjects = (arrayRef.splice.call(object, 0, 1), !object[0]); /** * Detect lack of support for accessing string characters by index. * * IE < 8 can't access characters by index and IE 8 can only access * characters by index on string literals. * * @memberOf _.support * @type boolean */ support.unindexedChars = ('x'[0] + Object('x')[0]) != 'xx'; /** * Detect if a DOM node's [[Class]] is resolvable (all but IE < 9) * and that the JS engine errors when attempting to coerce an object to * a string without a `toString` function. * * @memberOf _.support * @type boolean */ try { support.nodeClass = !(toString.call(document) == objectClass && !({ 'toString': 0 } + '')); } catch(e) { support.nodeClass = true; } }(1)); /*--------------------------------------------------------------------------*/ /** * The template used to create iterator functions. * * @private * @param {Object} data The data object used to populate the text. * @returns {string} Returns the interpolated text. */ var iteratorTemplate = function(obj) { var __p = 'var index, iterable = ' + (obj.firstArg) + ', result = ' + (obj.init) + ';\nif (!iterable) return result;\n' + (obj.top) + ';'; if (obj.array) { __p += '\nvar length = iterable.length; index = -1;\nif (' + (obj.array) + ') { '; if (support.unindexedChars) { __p += '\n if (isString(iterable)) {\n iterable = iterable.split(\'\')\n } '; } __p += '\n while (++index < length) {\n ' + (obj.loop) + ';\n }\n}\nelse { '; } else if (support.nonEnumArgs) { __p += '\n var length = iterable.length; index = -1;\n if (length && isArguments(iterable)) {\n while (++index < length) {\n index += \'\';\n ' + (obj.loop) + ';\n }\n } else { '; } if (support.enumPrototypes) { __p += '\n var skipProto = typeof iterable == \'function\';\n '; } if (support.enumErrorProps) { __p += '\n var skipErrorProps = iterable === errorProto || iterable instanceof Error;\n '; } var conditions = []; if (support.enumPrototypes) { conditions.push('!(skipProto && index == "prototype")'); } if (support.enumErrorProps) { conditions.push('!(skipErrorProps && (index == "message" || index == "name"))'); } if (obj.useHas && obj.keys) { __p += '\n var ownIndex = -1,\n ownProps = objectTypes[typeof iterable] && keys(iterable),\n length = ownProps ? ownProps.length : 0;\n\n while (++ownIndex < length) {\n index = ownProps[ownIndex];\n'; if (conditions.length) { __p += ' if (' + (conditions.join(' && ')) + ') {\n '; } __p += (obj.loop) + '; '; if (conditions.length) { __p += '\n }'; } __p += '\n } '; } else { __p += '\n for (index in iterable) {\n'; if (obj.useHas) { conditions.push("hasOwnProperty.call(iterable, index)"); } if (conditions.length) { __p += ' if (' + (conditions.join(' && ')) + ') {\n '; } __p += (obj.loop) + '; '; if (conditions.length) { __p += '\n }'; } __p += '\n } '; if (support.nonEnumShadows) { __p += '\n\n if (iterable !== objectProto) {\n var ctor = iterable.constructor,\n isProto = iterable === (ctor && ctor.prototype),\n className = iterable === stringProto ? stringClass : iterable === errorProto ? errorClass : toString.call(iterable),\n nonEnum = nonEnumProps[className];\n '; for (k = 0; k < 7; k++) { __p += '\n index = \'' + (obj.shadowedProps[k]) + '\';\n if ((!(isProto && nonEnum[index]) && hasOwnProperty.call(iterable, index))'; if (!obj.useHas) { __p += ' || (!nonEnum[index] && iterable[index] !== objectProto[index])'; } __p += ') {\n ' + (obj.loop) + ';\n } '; } __p += '\n } '; } } if (obj.array || support.nonEnumArgs) { __p += '\n}'; } __p += (obj.bottom) + ';\nreturn result'; return __p }; /*--------------------------------------------------------------------------*/ /** * The base implementation of `_.bind` that creates the bound function and * sets its meta data. * * @private * @param {Array} bindData The bind data array. * @returns {Function} Returns the new bound function. */ function baseBind(bindData) { var func = bindData[0], partialArgs = bindData[2], thisArg = bindData[4]; function bound() { // `Function#bind` spec // http://es5.github.io/#x15.3.4.5 if (partialArgs) { // avoid `arguments` object deoptimizations by using `slice` instead // of `Array.prototype.slice.call` and not assigning `arguments` to a // variable as a ternary expression var args = slice(partialArgs); push.apply(args, arguments); } // mimic the constructor's `return` behavior // http://es5.github.io/#x13.2.2 if (this instanceof bound) { // ensure `new bound` is an instance of `func` var thisBinding = baseCreate(func.prototype), result = func.apply(thisBinding, args || arguments); return isObject(result) ? result : thisBinding; } return func.apply(thisArg, args || arguments); } setBindData(bound, bindData); return bound; } /** * The base implementation of `_.create` without support for assigning * properties to the created object. * * @private * @param {Object} prototype The object to inherit from. * @returns {Object} Returns the new object. */ function baseCreate(prototype, properties) { return isObject(prototype) ? nativeCreate(prototype) : {}; } // fallback for browsers without `Object.create` if (!nativeCreate) { baseCreate = (function() { function Object() {} return function(prototype) { if (isObject(prototype)) { Object.prototype = prototype; var result = new Object; Object.prototype = null; } return result || root.Object(); }; }()); } /** * The base implementation of `_.createCallback` without support for creating * "_.pluck" or "_.where" style callbacks. * * @private * @param {*} [func=identity] The value to convert to a callback. * @param {*} [thisArg] The `this` binding of the created callback. * @param {number} [argCount] The number of arguments the callback accepts. * @returns {Function} Returns a callback function. */ function baseCreateCallback(func, thisArg, argCount) { if (typeof func != 'function') { return identity; } // exit early for no `thisArg` or already bound by `Function#bind` if (typeof thisArg == 'undefined' || !('prototype' in func)) { return func; } var bindData = func.__bindData__; if (typeof bindData == 'undefined') { if (support.funcNames) { bindData = !func.name; } bindData = bindData || !support.funcDecomp; if (!bindData) { var source = fnToString.call(func); if (!support.funcNames) { bindData = !reFuncName.test(source); } if (!bindData) { // checks if `func` references the `this` keyword and stores the result bindData = reThis.test(source); setBindData(func, bindData); } } } // exit early if there are no `this` references or `func` is bound if (bindData === false || (bindData !== true && bindData[1] & 1)) { return func; } switch (argCount) { case 1: return function(value) { return func.call(thisArg, value); }; case 2: return function(a, b) { return func.call(thisArg, a, b); }; case 3: return function(value, index, collection) { return func.call(thisArg, value, index, collection); }; case 4: return function(accumulator, value, index, collection) { return func.call(thisArg, accumulator, value, index, collection); }; } return bind(func, thisArg); } /** * The base implementation of `createWrapper` that creates the wrapper and * sets its meta data. * * @private * @param {Array} bindData The bind data array. * @returns {Function} Returns the new function. */ function baseCreateWrapper(bindData) { var func = bindData[0], bitmask = bindData[1], partialArgs = bindData[2], partialRightArgs = bindData[3], thisArg = bindData[4], arity = bindData[5]; var isBind = bitmask & 1, isBindKey = bitmask & 2, isCurry = bitmask & 4, isCurryBound = bitmask & 8, key = func; function bound() { var thisBinding = isBind ? thisArg : this; if (partialArgs) { var args = slice(partialArgs); push.apply(args, arguments); } if (partialRightArgs || isCurry) { args || (args = slice(arguments)); if (partialRightArgs) { push.apply(args, partialRightArgs); } if (isCurry && args.length < arity) { bitmask |= 16 & ~32; return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]); } } args || (args = arguments); if (isBindKey) { func = thisBinding[key]; } if (this instanceof bound) { thisBinding = baseCreate(func.prototype); var result = func.apply(thisBinding, args); return isObject(result) ? result : thisBinding; } return func.apply(thisBinding, args); } setBindData(bound, bindData); return bound; } /** * The base implementation of `_.difference` that accepts a single array * of values to exclude. * * @private * @param {Array} array The array to process. * @param {Array} [values] The array of values to exclude. * @returns {Array} Returns a new array of filtered values. */ function baseDifference(array, values) { var index = -1, indexOf = getIndexOf(), length = array ? array.length : 0, isLarge = length >= largeArraySize && indexOf === baseIndexOf,
result = [];

if (isLarge) {
var cache = createCache(values);
if (cache) {
indexOf = cacheIndexOf;
values = cache;
} else {
isLarge = false;
}
}
while (++index < length) { var value = array[index]; if (indexOf(values, value) < 0) { result.push(value); } } if (isLarge) { releaseObject(values); } return result; } /** * The base implementation of `_.flatten` without support for callback * shorthands or `thisArg` binding. * * @private * @param {Array} array The array to flatten. * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level. * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects. * @param {number} [fromIndex=0] The index to start from. * @returns {Array} Returns a new flattened array. */ function baseFlatten(array, isShallow, isStrict, fromIndex) { var index = (fromIndex || 0) - 1, length = array ? array.length : 0, result = []; while (++index < length) { var value = array[index]; if (value && typeof value == 'object' && typeof value.length == 'number' && (isArray(value) || isArguments(value))) { // recursively flatten arrays (susceptible to call stack limits) if (!isShallow) { value = baseFlatten(value, isShallow, isStrict); } var valIndex = -1, valLength = value.length, resIndex = result.length; result.length += valLength; while (++valIndex < valLength) { result[resIndex++] = value[valIndex]; } } else if (!isStrict) { result.push(value); } } return result; } /** * The base implementation of `_.isEqual`, without support for `thisArg` binding, * that allows partial "_.where" style comparisons. * * @private * @param {*} a The value to compare. * @param {*} b The other value to compare. * @param {Function} [callback] The function to customize comparing values. * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons. * @param {Array} [stackA=[]] Tracks traversed `a` objects. * @param {Array} [stackB=[]] Tracks traversed `b` objects. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. */ function baseIsEqual(a, b, callback, isWhere, stackA, stackB) { // used to indicate that when comparing objects, `a` has at least the properties of `b` if (callback) { var result = callback(a, b); if (typeof result != 'undefined') { return !!result; } } // exit early for identical values if (a === b) { // treat `+0` vs. `-0` as not equal return a !== 0 || (1 / a == 1 / b); } var type = typeof a, otherType = typeof b; // exit early for unlike primitive values if (a === a && !(a && objectTypes[type]) && !(b && objectTypes[otherType])) { return false; } // exit early for `null` and `undefined` avoiding ES3's Function#call behavior // http://es5.github.io/#x15.3.4.4 if (a == null || b == null) { return a === b; } // compare [[Class]] names var className = toString.call(a), otherClass = toString.call(b); if (className == argsClass) { className = objectClass; } if (otherClass == argsClass) { otherClass = objectClass; } if (className != otherClass) { return false; } switch (className) { case boolClass: case dateClass: // coerce dates and booleans to numbers, dates to milliseconds and booleans // to `1` or `0` treating invalid dates coerced to `NaN` as not equal return +a == +b; case numberClass: // treat `NaN` vs. `NaN` as equal return (a != +a) ? b != +b // but treat `+0` vs. `-0` as not equal : (a == 0 ? (1 / a == 1 / b) : a == +b); case regexpClass: case stringClass: // coerce regexes to strings (http://es5.github.io/#x15.10.6.4) // treat string primitives and their corresponding object instances as equal return a == String(b); } var isArr = className == arrayClass; if (!isArr) { // unwrap any `lodash` wrapped values var aWrapped = hasOwnProperty.call(a, '__wrapped__'), bWrapped = hasOwnProperty.call(b, '__wrapped__'); if (aWrapped || bWrapped) { return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB); } // exit for functions and DOM nodes if (className != objectClass || (!support.nodeClass && (isNode(a) || isNode(b)))) { return false; } // in older versions of Opera, `arguments` objects have `Array` constructors var ctorA = !support.argsObject && isArguments(a) ? Object : a.constructor, ctorB = !support.argsObject && isArguments(b) ? Object : b.constructor; // non `Object` object instances with different constructors are not equal if (ctorA != ctorB && !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) && ('constructor' in a && 'constructor' in b) ) { return false; } } // assume cyclic structures are equal // the algorithm for detecting cyclic structures is adapted from ES 5.1 // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3) var initedStack = !stackA; stackA || (stackA = getArray()); stackB || (stackB = getArray()); var length = stackA.length; while (length--) { if (stackA[length] == a) { return stackB[length] == b; } } var size = 0; result = true; // add `a` and `b` to the stack of traversed objects stackA.push(a); stackB.push(b); // recursively compare objects and arrays (susceptible to call stack limits) if (isArr) { // compare lengths to determine if a deep comparison is necessary length = a.length; size = b.length; result = size == length; if (result || isWhere) { // deep compare the contents, ignoring non-numeric properties while (size--) { var index = length, value = b[size]; if (isWhere) { while (index--) { if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) { break; } } } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) { break; } } } } else { // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys` // which, in this case, is more costly forIn(b, function(value, key, b) { if (hasOwnProperty.call(b, key)) { // count the number of properties. size++; // deep compare each property value. return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB)); } }); if (result && !isWhere) { // ensure both objects have the same number of properties forIn(a, function(value, key, a) { if (hasOwnProperty.call(a, key)) { // `size` will be `-1` if `a` has more properties than `b` return (result = --size > -1);
}
});
}
}
stackA.pop();
stackB.pop();

if (initedStack) {
releaseArray(stackA);
releaseArray(stackB);
}
return result;
}

/**
* The base implementation of `_.merge` without argument juggling or support
* for `thisArg` binding.
*
* @private
* @param {Object} object The destination object.
* @param {Object} source The source object.
* @param {Function} [callback] The function to customize merging properties.
* @param {Array} [stackA=[]] Tracks traversed source objects.
* @param {Array} [stackB=[]] Associates values with source counterparts.
*/
function baseMerge(object, source, callback, stackA, stackB) {
(isArray(source) ? forEach : forOwn)(source, function(source, key) {
var found,
isArr,
result = source,
value = object[key];

if (source && ((isArr = isArray(source)) || isPlainObject(source))) {
// avoid merging previously merged cyclic sources
var stackLength = stackA.length;
while (stackLength—) {
if ((found = stackA[stackLength] == source)) {
value = stackB[stackLength];
break;
}
}
if (!found) {
var isShallow;
if (callback) {
result = callback(value, source);
if ((isShallow = typeof result != ‘undefined’)) {
value = result;
}
}
if (!isShallow) {
value = isArr
? (isArray(value) ? value : [])
: (isPlainObject(value) ? value : {});
}
// add `source` and associated `value` to the stack of traversed objects
stackA.push(source);
stackB.push(value);

// recursively merge objects and arrays (susceptible to call stack limits)
if (!isShallow) {
baseMerge(value, source, callback, stackA, stackB);
}
}
}
else {
if (callback) {
result = callback(value, source);
if (typeof result == ‘undefined’) {
result = source;
}
}
if (typeof result != ‘undefined’) {
value = result;
}
}
object[key] = value;
});
}

/**
* Creates a function that, when called, either curries or invokes `func`
* with an optional `this` binding and partially applied arguments.
*
* @private
* @param {Function|string} func The function or method name to reference.
* @param {number} bitmask The bitmask of method flags to compose.
* The bitmask may be composed of the following flags:
* 1 — `_.bind`
* 2 — `_.bindKey`
* 4 — `_.curry`
* 8 — `_.curry` (bound)
* 16 — `_.partial`
* 32 — `_.partialRight`
* @param {Array} [partialArgs] An array of arguments to prepend to those
* provided to the new function.
* @param {Array} [partialRightArgs] An array of arguments to append to those
* provided to the new function.
* @param {*} [thisArg] The `this` binding of `func`.
* @param {number} [arity] The arity of `func`.
* @returns {Function} Returns the new function.
*/
function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {
var isBind = bitmask & 1,
isBindKey = bitmask & 2,
isCurry = bitmask & 4,
isCurryBound = bitmask & 8,
isPartial = bitmask & 16,
isPartialRight = bitmask & 32;

if (!isBindKey && !isFunction(func)) {
throw new TypeError;
}
if (isPartial && !partialArgs.length) {
bitmask &= ~16;
isPartial = partialArgs = false;
}
if (isPartialRight && !partialRightArgs.length) {
bitmask &= ~32;
isPartialRight = partialRightArgs = false;
}
var bindData = func && func.__bindData__;
if (bindData && bindData !== true) {
// clone `bindData`
bindData = slice(bindData);
if (bindData[2]) {
bindData[2] = slice(bindData[2]);
}
if (bindData[3]) {
bindData[3] = slice(bindData[3]);
}
// set `thisBinding` is not previously bound
if (isBind && !(bindData[1] & 1)) {
bindData[4] = thisArg;
}
// set if previously bound but not currently (subsequent curried functions)
if (!isBind && bindData[1] & 1) {
bitmask |= 8;
}
// set curried arity if not yet set
if (isCurry && !(bindData[1] & 4)) {
bindData[5] = arity;
}
// append partial left arguments
if (isPartial) {
push.apply(bindData[2] || (bindData[2] = []), partialArgs);
}
// append partial right arguments
if (isPartialRight) {
unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);
}
// merge flags
bindData[1] |= bitmask;
return createWrapper.apply(null, bindData);
}
// fast path for `_.bind`
var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;
return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);
}

/**
* Creates compiled iteration functions.
*
* @private
* @param {…Object} [options] The compile options object(s).
* @param {string} [options.array] Code to determine if the iterable is an array or array-like.
* @param {boolean} [options.useHas] Specify using `hasOwnProperty` checks in the object loop.
* @param {Function} [options.keys] A reference to `_.keys` for use in own property iteration.
* @param {string} [options.args] A comma separated string of iteration function arguments.
* @param {string} [options.top] Code to execute before the iteration branches.
* @param {string} [options.loop] Code to execute in the object loop.
* @param {string} [options.bottom] Code to execute after the iteration branches.
* @returns {Function} Returns the compiled function.
*/
function createIterator() {
// data properties
iteratorData.shadowedProps = shadowedProps;

// iterator options
iteratorData.array = iteratorData.bottom = iteratorData.loop = iteratorData.top = »;
iteratorData.init = ‘iterable’;
iteratorData.useHas = true;

// merge options into a template data object
for (var object, index = 0; object = arguments[index]; index++) {
for (var key in object) {
iteratorData[key] = object[key];
}
}
var args = iteratorData.args;
iteratorData.firstArg = /^[^,]+/.exec(args)[0];

// create the function factory
var factory = Function(
‘baseCreateCallback, errorClass, errorProto, hasOwnProperty, ‘ +
‘indicatorObject, isArguments, isArray, isString, keys, objectProto, ‘ +
‘objectTypes, nonEnumProps, stringClass, stringProto, toString’,
‘return function(‘ + args + ‘) {\n’ + iteratorTemplate(iteratorData) + ‘\n}’
);

// return the compiled function
return factory(
baseCreateCallback, errorClass, errorProto, hasOwnProperty,
indicatorObject, isArguments, isArray, isString, iteratorData.keys, objectProto,
objectTypes, nonEnumProps, stringClass, stringProto, toString
);
}

/**
* Gets the appropriate «indexOf» function. If the `_.indexOf` method is
* customized, this method returns the custom method, otherwise it returns
* the `baseIndexOf` function.
*
* @private
* @returns {Function} Returns the «indexOf» function.
*/
function getIndexOf() {
var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;
return result;
}

/**
* Checks if `value` is a native function.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is a native function, else `false`.
*/
function isNative(value) {
return typeof value == ‘function’ && reNative.test(value);
}

/**
* Sets `this` binding data on a given function.
*
* @private
* @param {Function} func The function to set data on.
* @param {Array} value The data array to set.
*/
var setBindData = !defineProperty ? noop : function(func, value) {
descriptor.value = value;
defineProperty(func, ‘__bindData__’, descriptor);
};

/**
* A fallback implementation of `isPlainObject` which checks if a given value
* is an object created by the `Object` constructor, assuming objects created
* by the `Object` constructor have no inherited enumerable properties and that
* there are no `Object.prototype` extensions.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
*/
function shimIsPlainObject(value) {
var ctor,
result;

// avoid non Object objects, `arguments` objects, and DOM elements
if (!(value && toString.call(value) == objectClass) ||
(ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor)) ||
(!support.argsClass && isArguments(value)) ||
(!support.nodeClass && isNode(value))) {
return false;
}
// IE < 9 iterates inherited properties before own properties. If the first // iterated property is an object's own property then there are no inherited // enumerable properties. if (support.ownLast) { forIn(value, function(value, key, object) { result = hasOwnProperty.call(object, key); return false; }); return result !== false; } // In most environments an object's own properties are iterated before // its inherited properties. If the last iterated property is an object's // own property then there are no inherited enumerable properties. forIn(value, function(value, key) { result = key; }); return typeof result == 'undefined' || hasOwnProperty.call(value, result); } /*--------------------------------------------------------------------------*/ /** * Checks if `value` is an `arguments` object. * * @static * @memberOf _ * @category Objects * @param {*} value The value to check. * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`. * @example * * (function() { return _.isArguments(arguments); })(1, 2, 3); * // => true
*
* _.isArguments([1, 2, 3]);
* // => false
*/
function isArguments(value) {
return value && typeof value == ‘object’ && typeof value.length == ‘number’ &&
toString.call(value) == argsClass || false;
}
// fallback for browsers that can’t detect `arguments` objects by [[Class]]
if (!support.argsClass) {
isArguments = function(value) {
return value && typeof value == ‘object’ && typeof value.length == ‘number’ &&
hasOwnProperty.call(value, ‘callee’) && !propertyIsEnumerable.call(value, ‘callee’) || false;
};
}

/**
* Checks if `value` is an array.
*
* @static
* @memberOf _
* @type Function
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is an array, else `false`.
* @example
*
* (function() { return _.isArray(arguments); })();
* // => false
*
* _.isArray([1, 2, 3]);
* // => true
*/
var isArray = nativeIsArray || function(value) {
return value && typeof value == ‘object’ && typeof value.length == ‘number’ &&
toString.call(value) == arrayClass || false;
};

/**
* A fallback implementation of `Object.keys` which produces an array of the
* given object’s own enumerable property names.
*
* @private
* @type Function
* @param {Object} object The object to inspect.
* @returns {Array} Returns an array of property names.
*/
var shimKeys = createIterator({
‘args’: ‘object’,
‘init’: ‘[]’,
‘top’: ‘if (!(objectTypes[typeof object])) return result’,
‘loop’: ‘result.push(index)’
});

/**
* Creates an array composed of the own enumerable property names of an object.
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The object to inspect.
* @returns {Array} Returns an array of property names.
* @example
*
* _.keys({ ‘one’: 1, ‘two’: 2, ‘three’: 3 });
* // => [‘one’, ‘two’, ‘three’] (property order is not guaranteed across environments)
*/
var keys = !nativeKeys ? shimKeys : function(object) {
if (!isObject(object)) {
return [];
}
if ((support.enumPrototypes && typeof object == ‘function’) ||
(support.nonEnumArgs && object.length && isArguments(object))) {
return shimKeys(object);
}
return nativeKeys(object);
};

/** Reusable iterator options shared by `each`, `forIn`, and `forOwn` */
var eachIteratorOptions = {
‘args’: ‘collection, callback, thisArg’,
‘top’: «callback = callback && typeof thisArg == ‘undefined’ ? callback : baseCreateCallback(callback, thisArg, 3)»,
‘array’: «typeof length == ‘number'»,
‘keys’: keys,
‘loop’: ‘if (callback(iterable[index], index, collection) === false) return result’
};

/** Reusable iterator options for `assign` and `defaults` */
var defaultsIteratorOptions = {
‘args’: ‘object, source, guard’,
‘top’:
‘var args = arguments,\n’ +
‘ argsIndex = 0,\n’ +
» argsLength = typeof guard == ‘number’ ? 2 : args.length;\n» +
‘while (++argsIndex < argsLength) {\n' + ' iterable = args[argsIndex];\n' + ' if (iterable && objectTypes[typeof iterable]) {', 'keys': keys, 'loop': "if (typeof result[index] == 'undefined') result[index] = iterable[index]", 'bottom': ' }\n}' }; /** Reusable iterator options for `forIn` and `forOwn` */ var forOwnIteratorOptions = { 'top': 'if (!objectTypes[typeof iterable]) return result;\n' + eachIteratorOptions.top, 'array': false }; /** * A function compiled to iterate `arguments` objects, arrays, objects, and * strings consistenly across environments, executing the callback for each * element in the collection. The callback is bound to `thisArg` and invoked * with three arguments; (value, index|key, collection). Callbacks may exit * iteration early by explicitly returning `false`. * * @private * @type Function * @param {Array|Object|string} collection The collection to iterate over. * @param {Function} [callback=identity] The function called per iteration. * @param {*} [thisArg] The `this` binding of `callback`. * @returns {Array|Object|string} Returns `collection`. */ var baseEach = createIterator(eachIteratorOptions); /*--------------------------------------------------------------------------*/ /** * Assigns own enumerable properties of source object(s) to the destination * object. Subsequent sources will overwrite property assignments of previous * sources. If a callback is provided it will be executed to produce the * assigned values. The callback is bound to `thisArg` and invoked with two * arguments; (objectValue, sourceValue). * * @static * @memberOf _ * @type Function * @alias extend * @category Objects * @param {Object} object The destination object. * @param {...Object} [source] The source objects. * @param {Function} [callback] The function to customize assigning values. * @param {*} [thisArg] The `this` binding of `callback`. * @returns {Object} Returns the destination object. * @example * * _.assign({ 'name': 'fred' }, { 'employer': 'slate' }); * // => { ‘name’: ‘fred’, ’employer’: ‘slate’ }
*
* var defaults = _.partialRight(_.assign, function(a, b) {
* return typeof a == ‘undefined’ ? b : a;
* });
*
* var object = { ‘name’: ‘barney’ };
* defaults(object, { ‘name’: ‘fred’, ’employer’: ‘slate’ });
* // => { ‘name’: ‘barney’, ’employer’: ‘slate’ }
*/
var assign = createIterator(defaultsIteratorOptions, {
‘top’:
defaultsIteratorOptions.top.replace(‘;’,
‘;\n’ +
«if (argsLength > 3 && typeof args[argsLength — 2] == ‘function’) {\n» +
‘ var callback = baseCreateCallback(args[—argsLength — 1], args[argsLength—], 2);\n’ +
«} else if (argsLength > 2 && typeof args[argsLength — 1] == ‘function’) {\n» +
‘ callback = args[—argsLength];\n’ +
‘}’
),
‘loop’: ‘result[index] = callback ? callback(result[index], iterable[index]) : iterable[index]’
});

/**
* Iterates over own and inherited enumerable properties of an object,
* executing the callback for each property. The callback is bound to `thisArg`
* and invoked with three arguments; (value, key, object). Callbacks may exit
* iteration early by explicitly returning `false`.
*
* @static
* @memberOf _
* @type Function
* @category Objects
* @param {Object} object The object to iterate over.
* @param {Function} [callback=identity] The function called per iteration.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Object} Returns `object`.
* @example
*
* function Shape() {
* this.x = 0;
* this.y = 0;
* }
*
* Shape.prototype.move = function(x, y) {
* this.x += x;
* this.y += y;
* };
*
* _.forIn(new Shape, function(value, key) {
* console.log(key);
* });
* // => logs ‘x’, ‘y’, and ‘move’ (property order is not guaranteed across environments)
*/
var forIn = createIterator(eachIteratorOptions, forOwnIteratorOptions, {
‘useHas’: false
});

/**
* Iterates over own enumerable properties of an object, executing the callback
* for each property. The callback is bound to `thisArg` and invoked with three
* arguments; (value, key, object). Callbacks may exit iteration early by
* explicitly returning `false`.
*
* @static
* @memberOf _
* @type Function
* @category Objects
* @param {Object} object The object to iterate over.
* @param {Function} [callback=identity] The function called per iteration.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Object} Returns `object`.
* @example
*
* _.forOwn({ ‘0’: ‘zero’, ‘1’: ‘one’, ‘length’: 2 }, function(num, key) {
* console.log(key);
* });
* // => logs ‘0’, ‘1’, and ‘length’ (property order is not guaranteed across environments)
*/
var forOwn = createIterator(eachIteratorOptions, forOwnIteratorOptions);

/**
* Creates a sorted array of property names of all enumerable properties,
* own and inherited, of `object` that have function values.
*
* @static
* @memberOf _
* @alias methods
* @category Objects
* @param {Object} object The object to inspect.
* @returns {Array} Returns an array of property names that have function values.
* @example
*
* _.functions(_);
* // => [‘all’, ‘any’, ‘bind’, ‘bindAll’, ‘clone’, ‘compact’, ‘compose’, …]
*/
function functions(object) {
var result = [];
forIn(object, function(value, key) {
if (isFunction(value)) {
result.push(key);
}
});
return result.sort();
}

/**
* Checks if the specified property name exists as a direct property of `object`,
* instead of an inherited property.
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The object to inspect.
* @param {string} key The name of the property to check.
* @returns {boolean} Returns `true` if key is a direct property, else `false`.
* @example
*
* _.has({ ‘a’: 1, ‘b’: 2, ‘c’: 3 }, ‘b’);
* // => true
*/
function has(object, key) {
return object ? hasOwnProperty.call(object, key) : false;
}

/**
* Checks if `value` is a boolean value.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.
* @example
*
* _.isBoolean(null);
* // => false
*/
function isBoolean(value) {
return value === true || value === false ||
value && typeof value == ‘object’ && toString.call(value) == boolClass || false;
}

/**
* Checks if `value` is empty. Arrays, strings, or `arguments` objects with a
* length of `0` and objects with no own enumerable properties are considered
* «empty».
*
* @static
* @memberOf _
* @category Objects
* @param {Array|Object|string} value The value to inspect.
* @returns {boolean} Returns `true` if the `value` is empty, else `false`.
* @example
*
* _.isEmpty([1, 2, 3]);
* // => false
*
* _.isEmpty({});
* // => true
*
* _.isEmpty(»);
* // => true
*/
function isEmpty(value) {
var result = true;
if (!value) {
return result;
}
var className = toString.call(value),
length = value.length;

if ((className == arrayClass || className == stringClass ||
(support.argsClass ? className == argsClass : isArguments(value))) ||
(className == objectClass && typeof length == ‘number’ && isFunction(value.splice))) {
return !length;
}
forOwn(value, function() {
return (result = false);
});
return result;
}

/**
* Checks if `value` is a function.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is a function, else `false`.
* @example
*
* _.isFunction(_);
* // => true
*/
function isFunction(value) {
return typeof value == ‘function’;
}
// fallback for older versions of Chrome and Safari
if (isFunction(/x/)) {
isFunction = function(value) {
return typeof value == ‘function’ && toString.call(value) == funcClass;
};
}

/**
* Checks if `value` is the language type of Object.
* (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String(»)`)
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is an object, else `false`.
* @example
*
* _.isObject({});
* // => true
*
* _.isObject([1, 2, 3]);
* // => true
*
* _.isObject(1);
* // => false
*/
function isObject(value) {
// check if the value is the ECMAScript language type of Object
// http://es5.github.io/#x8
// and avoid a V8 bug
// http://code.google.com/p/v8/issues/detail?id=2291
return !!(value && objectTypes[typeof value]);
}

/**
* Checks if `value` is `NaN`.
*
* Note: This is not the same as native `isNaN` which will return `true` for
* `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.
* @example
*
* _.isNaN(NaN);
* // => true
*
* _.isNaN(new Number(NaN));
* // => true
*
* isNaN(undefined);
* // => true
*
* _.isNaN(undefined);
* // => false
*/
function isNaN(value) {
// `NaN` as a primitive is the only value that is not equal to itself
// (perform the [[Class]] check first to avoid errors with some host objects in IE)
return isNumber(value) && value != +value;
}

/**
* Checks if `value` is `null`.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is `null`, else `false`.
* @example
*
* _.isNull(null);
* // => true
*
* _.isNull(undefined);
* // => false
*/
function isNull(value) {
return value === null;
}

/**
* Checks if `value` is a number.
*
* Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is a number, else `false`.
* @example
*
* _.isNumber(8.4 * 5);
* // => true
*/
function isNumber(value) {
return typeof value == ‘number’ ||
value && typeof value == ‘object’ && toString.call(value) == numberClass || false;
}

/**
* Checks if `value` is an object created by the `Object` constructor.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
* @example
*
* function Shape() {
* this.x = 0;
* this.y = 0;
* }
*
* _.isPlainObject(new Shape);
* // => false
*
* _.isPlainObject([1, 2, 3]);
* // => false
*
* _.isPlainObject({ ‘x’: 0, ‘y’: 0 });
* // => true
*/
var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {
if (!(value && toString.call(value) == objectClass) || (!support.argsClass && isArguments(value))) {
return false;
}
var valueOf = value.valueOf,
objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);

return objProto
? (value == objProto || getPrototypeOf(value) == objProto)
: shimIsPlainObject(value);
};

/**
* Checks if `value` is a string.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is a string, else `false`.
* @example
*
* _.isString(‘fred’);
* // => true
*/
function isString(value) {
return typeof value == ‘string’ ||
value && typeof value == ‘object’ && toString.call(value) == stringClass || false;
}

/**
* Checks if `value` is `undefined`.
*
* @static
* @memberOf _
* @category Objects
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.
* @example
*
* _.isUndefined(void 0);
* // => true
*/
function isUndefined(value) {
return typeof value == ‘undefined’;
}

/**
* Recursively merges own enumerable properties of the source object(s), that
* don’t resolve to `undefined` into the destination object. Subsequent sources
* will overwrite property assignments of previous sources. If a callback is
* provided it will be executed to produce the merged values of the destination
* and source properties. If the callback returns `undefined` merging will
* be handled by the method instead. The callback is bound to `thisArg` and
* invoked with two arguments; (objectValue, sourceValue).
*
* @static
* @memberOf _
* @category Objects
* @param {Object} object The destination object.
* @param {…Object} [source] The source objects.
* @param {Function} [callback] The function to customize merging properties.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Object} Returns the destination object.
* @example
*
* var names = {
* ‘characters’: [
* { ‘name’: ‘barney’ },
* { ‘name’: ‘fred’ }
* ]
* };
*
* var ages = {
* ‘characters’: [
* { ‘age’: 36 },
* { ‘age’: 40 }
* ]
* };
*
* _.merge(names, ages);
* // => { ‘characters’: [{ ‘name’: ‘barney’, ‘age’: 36 }, { ‘name’: ‘fred’, ‘age’: 40 }] }
*
* var food = {
* ‘fruits’: [‘apple’],
* ‘vegetables’: [‘beet’]
* };
*
* var otherFood = {
* ‘fruits’: [‘banana’],
* ‘vegetables’: [‘carrot’]
* };
*
* _.merge(food, otherFood, function(a, b) {
* return _.isArray(a) ? a.concat(b) : undefined;
* });
* // => { ‘fruits’: [‘apple’, ‘banana’], ‘vegetables’: [‘beet’, ‘carrot] }
*/
function merge(object) {
var args = arguments,
length = 2;

if (!isObject(object)) {
return object;
}
// allows working with `_.reduce` and `_.reduceRight` without using
// their `index` and `collection` arguments
if (typeof args[2] != ‘number’) {
length = args.length;
}
if (length > 3 && typeof args[length — 2] == ‘function’) {
var callback = baseCreateCallback(args[—length — 1], args[length—], 2);
} else if (length > 2 && typeof args[length — 1] == ‘function’) {
callback = args[—length];
}
var sources = slice(arguments, 1, length),
index = -1,
stackA = getArray(),
stackB = getArray();

while (++index < length) { baseMerge(object, sources[index], callback, stackA, stackB); } releaseArray(stackA); releaseArray(stackB); return object; } /*--------------------------------------------------------------------------*/ /** * Iterates over elements of a collection, returning an array of all elements * the callback returns truey for. The callback is bound to `thisArg` and * invoked with three arguments; (value, index|key, collection). * * If a property name is provided for `callback` the created "_.pluck" style * callback will return the property value of the given element. * * If an object is provided for `callback` the created "_.where" style callback * will return `true` for elements that have the properties of the given object, * else `false`. * * @static * @memberOf _ * @alias select * @category Collections * @param {Array|Object|string} collection The collection to iterate over. * @param {Function|Object|string} [callback=identity] The function called * per iteration. If a property name or object is provided it will be used * to create a "_.pluck" or "_.where" style callback, respectively. * @param {*} [thisArg] The `this` binding of `callback`. * @returns {Array} Returns a new array of elements that passed the callback check. * @example * * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; }); * // => [2, 4, 6]
*
* var characters = [
* { ‘name’: ‘barney’, ‘age’: 36, ‘blocked’: false },
* { ‘name’: ‘fred’, ‘age’: 40, ‘blocked’: true }
* ];
*
* // using «_.pluck» callback shorthand
* _.filter(characters, ‘blocked’);
* // => [{ ‘name’: ‘fred’, ‘age’: 40, ‘blocked’: true }]
*
* // using «_.where» callback shorthand
* _.filter(characters, { ‘age’: 36 });
* // => [{ ‘name’: ‘barney’, ‘age’: 36, ‘blocked’: false }]
*/
function filter(collection, callback, thisArg) {
var result = [];
callback = lodash.createCallback(callback, thisArg, 3);

if (isArray(collection)) {
var index = -1,
length = collection.length;

while (++index < length) { var value = collection[index]; if (callback(value, index, collection)) { result.push(value); } } } else { baseEach(collection, function(value, index, collection) { if (callback(value, index, collection)) { result.push(value); } }); } return result; } /** * Iterates over elements of a collection, returning the first element that * the callback returns truey for. The callback is bound to `thisArg` and * invoked with three arguments; (value, index|key, collection). * * If a property name is provided for `callback` the created "_.pluck" style * callback will return the property value of the given element. * * If an object is provided for `callback` the created "_.where" style callback * will return `true` for elements that have the properties of the given object, * else `false`. * * @static * @memberOf _ * @alias detect, findWhere * @category Collections * @param {Array|Object|string} collection The collection to iterate over. * @param {Function|Object|string} [callback=identity] The function called * per iteration. If a property name or object is provided it will be used * to create a "_.pluck" or "_.where" style callback, respectively. * @param {*} [thisArg] The `this` binding of `callback`. * @returns {*} Returns the found element, else `undefined`. * @example * * var characters = [ * { 'name': 'barney', 'age': 36, 'blocked': false }, * { 'name': 'fred', 'age': 40, 'blocked': true }, * { 'name': 'pebbles', 'age': 1, 'blocked': false } * ]; * * _.find(characters, function(chr) { * return chr.age < 40; * }); * // => { ‘name’: ‘barney’, ‘age’: 36, ‘blocked’: false }
*
* // using «_.where» callback shorthand
* _.find(characters, { ‘age’: 1 });
* // => { ‘name’: ‘pebbles’, ‘age’: 1, ‘blocked’: false }
*
* // using «_.pluck» callback shorthand
* _.find(characters, ‘blocked’);
* // => { ‘name’: ‘fred’, ‘age’: 40, ‘blocked’: true }
*/
function find(collection, callback, thisArg) {
callback = lodash.createCallback(callback, thisArg, 3);

if (isArray(collection)) {
var index = -1,
length = collection.length;

while (++index < length) { var value = collection[index]; if (callback(value, index, collection)) { return value; } } } else { var result; baseEach(collection, function(value, index, collection) { if (callback(value, index, collection)) { result = value; return false; } }); return result; } } /** * Iterates over elements of a collection, executing the callback for each * element. The callback is bound to `thisArg` and invoked with three arguments; * (value, index|key, collection). Callbacks may exit iteration early by * explicitly returning `false`. * * Note: As with other "Collections" methods, objects with a `length` property * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn` * may be used for object iteration. * * @static * @memberOf _ * @alias each * @category Collections * @param {Array|Object|string} collection The collection to iterate over. * @param {Function} [callback=identity] The function called per iteration. * @param {*} [thisArg] The `this` binding of `callback`. * @returns {Array|Object|string} Returns `collection`. * @example * * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(','); * // => logs each number and returns ‘1,2,3’
*
* _.forEach({ ‘one’: 1, ‘two’: 2, ‘three’: 3 }, function(num) { console.log(num); });
* // => logs each number and returns the object (property order is not guaranteed across environments)
*/
function forEach(collection, callback, thisArg) {
if (callback && typeof thisArg == ‘undefined’ && isArray(collection)) {
var index = -1,
length = collection.length;

while (++index < length) { if (callback(collection[index], index, collection) === false) { break; } } } else { baseEach(collection, callback, thisArg); } return collection; } /** * Creates an array of values by running each element in the collection * through the callback. The callback is bound to `thisArg` and invoked with * three arguments; (value, index|key, collection). * * If a property name is provided for `callback` the created "_.pluck" style * callback will return the property value of the given element. * * If an object is provided for `callback` the created "_.where" style callback * will return `true` for elements that have the properties of the given object, * else `false`. * * @static * @memberOf _ * @alias collect * @category Collections * @param {Array|Object|string} collection The collection to iterate over. * @param {Function|Object|string} [callback=identity] The function called * per iteration. If a property name or object is provided it will be used * to create a "_.pluck" or "_.where" style callback, respectively. * @param {*} [thisArg] The `this` binding of `callback`. * @returns {Array} Returns a new array of the results of each `callback` execution. * @example * * _.map([1, 2, 3], function(num) { return num * 3; }); * // => [3, 6, 9]
*
* _.map({ ‘one’: 1, ‘two’: 2, ‘three’: 3 }, function(num) { return num * 3; });
* // => [3, 6, 9] (property order is not guaranteed across environments)
*
* var characters = [
* { ‘name’: ‘barney’, ‘age’: 36 },
* { ‘name’: ‘fred’, ‘age’: 40 }
* ];
*
* // using «_.pluck» callback shorthand
* _.map(characters, ‘name’);
* // => [‘barney’, ‘fred’]
*/
function map(collection, callback, thisArg) {
var index = -1,
length = collection ? collection.length : 0,
result = Array(typeof length == ‘number’ ? length : 0);

callback = lodash.createCallback(callback, thisArg, 3);
if (isArray(collection)) {
while (++index < length) { result[index] = callback(collection[index], index, collection); } } else { baseEach(collection, function(value, key, collection) { result[++index] = callback(value, key, collection); }); } return result; } /** * Retrieves the value of a specified property from all elements in the collection. * * @static * @memberOf _ * @type Function * @category Collections * @param {Array|Object|string} collection The collection to iterate over. * @param {string} property The name of the property to pluck. * @returns {Array} Returns a new array of property values. * @example * * var characters = [ * { 'name': 'barney', 'age': 36 }, * { 'name': 'fred', 'age': 40 } * ]; * * _.pluck(characters, 'name'); * // => [‘barney’, ‘fred’]
*/
var pluck = map;

/**
* Reduces a collection to a value which is the accumulated result of running
* each element in the collection through the callback, where each successive
* callback execution consumes the return value of the previous execution. If
* `accumulator` is not provided the first element of the collection will be
* used as the initial `accumulator` value. The callback is bound to `thisArg`
* and invoked with four arguments; (accumulator, value, index|key, collection).
*
* @static
* @memberOf _
* @alias foldl, inject
* @category Collections
* @param {Array|Object|string} collection The collection to iterate over.
* @param {Function} [callback=identity] The function called per iteration.
* @param {*} [accumulator] Initial value of the accumulator.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {*} Returns the accumulated value.
* @example
*
* var sum = _.reduce([1, 2, 3], function(sum, num) {
* return sum + num;
* });
* // => 6
*
* var mapped = _.reduce({ ‘a’: 1, ‘b’: 2, ‘c’: 3 }, function(result, num, key) {
* result[key] = num * 3;
* return result;
* }, {});
* // => { ‘a’: 3, ‘b’: 6, ‘c’: 9 }
*/
function reduce(collection, callback, accumulator, thisArg) {
var noaccum = arguments.length < 3; callback = lodash.createCallback(callback, thisArg, 4); if (isArray(collection)) { var index = -1, length = collection.length; if (noaccum) { accumulator = collection[++index]; } while (++index < length) { accumulator = callback(accumulator, collection[index], index, collection); } } else { baseEach(collection, function(value, index, collection) { accumulator = noaccum ? (noaccum = false, value) : callback(accumulator, value, index, collection) }); } return accumulator; } /** * Checks if the callback returns a truey value for **any** element of a * collection. The function returns as soon as it finds a passing value and * does not iterate over the entire collection. The callback is bound to * `thisArg` and invoked with three arguments; (value, index|key, collection). * * If a property name is provided for `callback` the created "_.pluck" style * callback will return the property value of the given element. * * If an object is provided for `callback` the created "_.where" style callback * will return `true` for elements that have the properties of the given object, * else `false`. * * @static * @memberOf _ * @alias any * @category Collections * @param {Array|Object|string} collection The collection to iterate over. * @param {Function|Object|string} [callback=identity] The function called * per iteration. If a property name or object is provided it will be used * to create a "_.pluck" or "_.where" style callback, respectively. * @param {*} [thisArg] The `this` binding of `callback`. * @returns {boolean} Returns `true` if any element passed the callback check, * else `false`. * @example * * _.some([null, 0, 'yes', false], Boolean); * // => true
*
* var characters = [
* { ‘name’: ‘barney’, ‘age’: 36, ‘blocked’: false },
* { ‘name’: ‘fred’, ‘age’: 40, ‘blocked’: true }
* ];
*
* // using «_.pluck» callback shorthand
* _.some(characters, ‘blocked’);
* // => true
*
* // using «_.where» callback shorthand
* _.some(characters, { ‘age’: 1 });
* // => false
*/
function some(collection, callback, thisArg) {
var result;
callback = lodash.createCallback(callback, thisArg, 3);

if (isArray(collection)) {
var index = -1,
length = collection.length;

while (++index < length) { if ((result = callback(collection[index], index, collection))) { break; } } } else { baseEach(collection, function(value, index, collection) { return !(result = callback(value, index, collection)); }); } return !!result; } /** * Performs a deep comparison of each element in a `collection` to the given * `properties` object, returning an array of all elements that have equivalent * property values. * * @static * @memberOf _ * @type Function * @category Collections * @param {Array|Object|string} collection The collection to iterate over. * @param {Object} props The object of property values to filter by. * @returns {Array} Returns a new array of elements that have the given properties. * @example * * var characters = [ * { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }, * { 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] } * ]; * * _.where(characters, { 'age': 36 }); * // => [{ ‘name’: ‘barney’, ‘age’: 36, ‘pets’: [‘hoppy’] }]
*
* _.where(characters, { ‘pets’: [‘dino’] });
* // => [{ ‘name’: ‘fred’, ‘age’: 40, ‘pets’: [‘baby puss’, ‘dino’] }]
*/
var where = filter;

/*—————————————————————————*/

/**
* Creates an array excluding all values of the provided arrays using strict
* equality for comparisons, i.e. `===`.
*
* @static
* @memberOf _
* @category Arrays
* @param {Array} array The array to process.
* @param {…Array} [values] The arrays of values to exclude.
* @returns {Array} Returns a new array of filtered values.
* @example
*
* _.difference([1, 2, 3, 4, 5], [5, 2, 10]);
* // => [1, 3, 4]
*/
function difference(array) {
return baseDifference(array, baseFlatten(arguments, true, true, 1));
}

/**
* Gets the index at which the first occurrence of `value` is found using
* strict equality for comparisons, i.e. `===`. If the array is already sorted
* providing `true` for `fromIndex` will run a faster binary search.
*
* @static
* @memberOf _
* @category Arrays
* @param {Array} array The array to search.
* @param {*} value The value to search for.
* @param {boolean|number} [fromIndex=0] The index to search from or `true`
* to perform a binary search on a sorted array.
* @returns {number} Returns the index of the matched value or `-1`.
* @example
*
* _.indexOf([1, 2, 3, 1, 2, 3], 2);
* // => 1
*
* _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);
* // => 4
*
* _.indexOf([1, 1, 2, 2, 3, 3], 2, true);
* // => 2
*/
function indexOf(array, value, fromIndex) {
if (typeof fromIndex == ‘number’) {
var length = array ? array.length : 0;
fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0); } else if (fromIndex) { var index = sortedIndex(array, value); return array[index] === value ? index : -1; } return baseIndexOf(array, value, fromIndex); } /** * Removes all elements from an array that the callback returns truey for * and returns an array of removed elements. The callback is bound to `thisArg` * and invoked with three arguments; (value, index, array). * * If a property name is provided for `callback` the created "_.pluck" style * callback will return the property value of the given element. * * If an object is provided for `callback` the created "_.where" style callback * will return `true` for elements that have the properties of the given object, * else `false`. * * @static * @memberOf _ * @category Arrays * @param {Array} array The array to modify. * @param {Function|Object|string} [callback=identity] The function called * per iteration. If a property name or object is provided it will be used * to create a "_.pluck" or "_.where" style callback, respectively. * @param {*} [thisArg] The `this` binding of `callback`. * @returns {Array} Returns a new array of removed elements. * @example * * var array = [1, 2, 3, 4, 5, 6]; * var evens = _.remove(array, function(num) { return num % 2 == 0; }); * * console.log(array); * // => [1, 3, 5]
*
* console.log(evens);
* // => [2, 4, 6]
*/
function remove(array, callback, thisArg) {
var index = -1,
length = array ? array.length : 0,
result = [];

callback = lodash.createCallback(callback, thisArg, 3);
while (++index < length) { var value = array[index]; if (callback(value, index, array)) { result.push(value); splice.call(array, index--, 1); length--; } } return result; } /** * Uses a binary search to determine the smallest index at which a value * should be inserted into a given sorted array in order to maintain the sort * order of the array. If a callback is provided it will be executed for * `value` and each element of `array` to compute their sort ranking. The * callback is bound to `thisArg` and invoked with one argument; (value). * * If a property name is provided for `callback` the created "_.pluck" style * callback will return the property value of the given element. * * If an object is provided for `callback` the created "_.where" style callback * will return `true` for elements that have the properties of the given object, * else `false`. * * @static * @memberOf _ * @category Arrays * @param {Array} array The array to inspect. * @param {*} value The value to evaluate. * @param {Function|Object|string} [callback=identity] The function called * per iteration. If a property name or object is provided it will be used * to create a "_.pluck" or "_.where" style callback, respectively. * @param {*} [thisArg] The `this` binding of `callback`. * @returns {number} Returns the index at which `value` should be inserted * into `array`. * @example * * _.sortedIndex([20, 30, 50], 40); * // => 2
*
* // using «_.pluck» callback shorthand
* _.sortedIndex([{ ‘x’: 20 }, { ‘x’: 30 }, { ‘x’: 50 }], { ‘x’: 40 }, ‘x’);
* // => 2
*
* var dict = {
* ‘wordToNumber’: { ‘twenty’: 20, ‘thirty’: 30, ‘fourty’: 40, ‘fifty’: 50 }
* };
*
* _.sortedIndex([‘twenty’, ‘thirty’, ‘fifty’], ‘fourty’, function(word) {
* return dict.wordToNumber[word];
* });
* // => 2
*
* _.sortedIndex([‘twenty’, ‘thirty’, ‘fifty’], ‘fourty’, function(word) {
* return this.wordToNumber[word];
* }, dict);
* // => 2
*/
function sortedIndex(array, value, callback, thisArg) {
var low = 0,
high = array ? array.length : low;

// explicitly reference `identity` for better inlining in Firefox
callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;
value = callback(value);

while (low < high) { var mid = (low + high) >>> 1;
(callback(array[mid]) < value) ? low = mid + 1 : high = mid; } return low; } /*--------------------------------------------------------------------------*/ /** * Creates a function that, when called, invokes `func` with the `this` * binding of `thisArg` and prepends any additional `bind` arguments to those * provided to the bound function. * * @static * @memberOf _ * @category Functions * @param {Function} func The function to bind. * @param {*} [thisArg] The `this` binding of `func`. * @param {...*} [arg] Arguments to be partially applied. * @returns {Function} Returns the new bound function. * @example * * var func = function(greeting) { * return greeting + ' ' + this.name; * }; * * func = _.bind(func, { 'name': 'fred' }, 'hi'); * func(); * // => ‘hi fred’
*/
function bind(func, thisArg) {
return arguments.length > 2
? createWrapper(func, 17, slice(arguments, 2), null, thisArg)
: createWrapper(func, 1, null, null, thisArg);
}

/**
* Creates a function that is restricted to execute `func` once. Repeat calls to
* the function will return the value of the first call. The `func` is executed
* with the `this` binding of the created function.
*
* @static
* @memberOf _
* @category Functions
* @param {Function} func The function to restrict.
* @returns {Function} Returns the new restricted function.
* @example
*
* var initialize = _.once(createApplication);
* initialize();
* initialize();
* // `initialize` executes `createApplication` once
*/
function once(func) {
var ran,
result;

if (!isFunction(func)) {
throw new TypeError;
}
return function() {
if (ran) {
return result;
}
ran = true;
result = func.apply(this, arguments);

// clear the `func` variable so the function may be garbage collected
func = null;
return result;
};
}

/*—————————————————————————*/

/**
* Produces a callback bound to an optional `thisArg`. If `func` is a property
* name the created callback will return the property value for a given element.
* If `func` is an object the created callback will return `true` for elements
* that contain the equivalent object properties, otherwise it will return `false`.
*
* @static
* @memberOf _
* @category Utilities
* @param {*} [func=identity] The value to convert to a callback.
* @param {*} [thisArg] The `this` binding of the created callback.
* @param {number} [argCount] The number of arguments the callback accepts.
* @returns {Function} Returns a callback function.
* @example
*
* var characters = [
* { ‘name’: ‘barney’, ‘age’: 36 },
* { ‘name’: ‘fred’, ‘age’: 40 }
* ];
*
* // wrap to create custom callback shorthands
* _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {
* var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);
* return !match ? func(callback, thisArg) : function(object) {
* return match[2] == ‘gt’ ? object[match[1]] > match[3] : object[match[1]] < match[3]; * }; * }); * * _.filter(characters, 'age__gt38'); * // => [{ ‘name’: ‘fred’, ‘age’: 40 }]
*/
function createCallback(func, thisArg, argCount) {
var type = typeof func;
if (func == null || type == ‘function’) {
return baseCreateCallback(func, thisArg, argCount);
}
// handle «_.pluck» style callback shorthands
if (type != ‘object’) {
return property(func);
}
var props = keys(func),
key = props[0],
a = func[key];

// handle «_.where» style callback shorthands
if (props.length == 1 && a === a && !isObject(a)) {
// fast path the common case of providing an object with a single
// property containing a primitive value
return function(object) {
var b = object[key];
return a === b && (a !== 0 || (1 / a == 1 / b));
};
}
return function(object) {
var length = props.length,
result = false;

while (length—) {
if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {
break;
}
}
return result;
};
}

/**
* This method returns the first argument provided to it.
*
* @static
* @memberOf _
* @category Utilities
* @param {*} value Any value.
* @returns {*} Returns `value`.
* @example
*
* var object = { ‘name’: ‘fred’ };
* _.identity(object) === object;
* // => true
*/
function identity(value) {
return value;
}

/**
* Adds function properties of a source object to the destination object.
* If `object` is a function methods will be added to its prototype as well.
*
* @static
* @memberOf _
* @category Utilities
* @param {Function|Object} [object=lodash] object The destination object.
* @param {Object} source The object of functions to add.
* @param {Object} [options] The options object.
* @param {boolean} [options.chain=true] Specify whether the functions added are chainable.
* @example
*
* function capitalize(string) {
* return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
* }
*
* _.mixin({ ‘capitalize’: capitalize });
* _.capitalize(‘fred’);
* // => ‘Fred’
*
* _(‘fred’).capitalize().value();
* // => ‘Fred’
*
* _.mixin({ ‘capitalize’: capitalize }, { ‘chain’: false });
* _(‘fred’).capitalize();
* // => ‘Fred’
*/
function mixin(object, source, options) {
var chain = true,
methodNames = source && functions(source);

if (!source || (!options && !methodNames.length)) {
if (options == null) {
options = source;
}
ctor = lodashWrapper;
source = object;
object = lodash;
methodNames = functions(source);
}
if (options === false) {
chain = false;
} else if (isObject(options) && ‘chain’ in options) {
chain = options.chain;
}
var ctor = object,
isFunc = isFunction(ctor);

forEach(methodNames, function(methodName) {
var func = object[methodName] = source[methodName];
if (isFunc) {
ctor.prototype[methodName] = function() {
var chainAll = this.__chain__,
value = this.__wrapped__,
args = [value];

push.apply(args, arguments);
var result = func.apply(object, args);
if (chain || chainAll) {
if (value === result && isObject(result)) {
return this;
}
result = new ctor(result);
result.__chain__ = chainAll;
}
return result;
};
}
});
}

/**
* A no-operation function.
*
* @static
* @memberOf _
* @category Utilities
* @example
*
* var object = { ‘name’: ‘fred’ };
* _.noop(object) === undefined;
* // => true
*/
function noop() {
// no operation performed
}

/**
* Creates a «_.pluck» style function, which returns the `key` value of a
* given object.
*
* @static
* @memberOf _
* @category Utilities
* @param {string} key The name of the property to retrieve.
* @returns {Function} Returns the new function.
* @example
*
* var characters = [
* { ‘name’: ‘fred’, ‘age’: 40 },
* { ‘name’: ‘barney’, ‘age’: 36 }
* ];
*
* var getName = _.property(‘name’);
*
* _.map(characters, getName);
* // => [‘barney’, ‘fred’]
*
* _.sortBy(characters, getName);
* // => [{ ‘name’: ‘barney’, ‘age’: 36 }, { ‘name’: ‘fred’, ‘age’: 40 }]
*/
function property(key) {
return function(object) {
return object[key];
};
}

/**
* Executes the callback `n` times, returning an array of the results
* of each callback execution. The callback is bound to `thisArg` and invoked
* with one argument; (index).
*
* @static
* @memberOf _
* @category Utilities
* @param {number} n The number of times to execute the callback.
* @param {Function} callback The function called per iteration.
* @param {*} [thisArg] The `this` binding of `callback`.
* @returns {Array} Returns an array of the results of each `callback` execution.
* @example
*
* var diceRolls = _.times(3, _.partial(_.random, 1, 6));
* // => [3, 6, 4]
*
* _.times(3, function(n) { mage.castSpell(n); });
* // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively
*
* _.times(3, function(n) { this.cast(n); }, mage);
* // => also calls `mage.castSpell(n)` three times
*/
function times(n, callback, thisArg) {
n = (n = +n) > -1 ? n : 0;
var index = -1,
result = Array(n);

callback = baseCreateCallback(callback, thisArg, 1);
while (++index < n) { result[index] = callback(index); } return result; } /*--------------------------------------------------------------------------*/ /** * Creates a `lodash` object that wraps the given value with explicit * method chaining enabled. * * @static * @memberOf _ * @category Chaining * @param {*} value The value to wrap. * @returns {Object} Returns the wrapper object. * @example * * var characters = [ * { 'name': 'barney', 'age': 36 }, * { 'name': 'fred', 'age': 40 }, * { 'name': 'pebbles', 'age': 1 } * ]; * * var youngest = _.chain(characters) * .sortBy('age') * .map(function(chr) { return chr.name + ' is ' + chr.age; }) * .first() * .value(); * // => ‘pebbles is 1’
*/
function chain(value) {
value = new lodashWrapper(value);
value.__chain__ = true;
return value;
}

/**
* Enables explicit method chaining on the wrapper object.
*
* @name chain
* @memberOf _
* @category Chaining
* @returns {*} Returns the wrapper object.
* @example
*
* var characters = [
* { ‘name’: ‘barney’, ‘age’: 36 },
* { ‘name’: ‘fred’, ‘age’: 40 }
* ];
*
* // without explicit chaining
* _(characters).first();
* // => { ‘name’: ‘barney’, ‘age’: 36 }
*
* // with explicit chaining
* _(characters).chain()
* .first()
* .pick(‘age’)
* .value();
* // => { ‘age’: 36 }
*/
function wrapperChain() {
this.__chain__ = true;
return this;
}

/**
* Produces the `toString` result of the wrapped value.
*
* @name toString
* @memberOf _
* @category Chaining
* @returns {string} Returns the string result.
* @example
*
* _([1, 2, 3]).toString();
* // => ‘1,2,3’
*/
function wrapperToString() {
return String(this.__wrapped__);
}

/**
* Extracts the wrapped value.
*
* @name valueOf
* @memberOf _
* @alias value
* @category Chaining
* @returns {*} Returns the wrapped value.
* @example
*
* _([1, 2, 3]).valueOf();
* // => [1, 2, 3]
*/
function wrapperValueOf() {
return this.__wrapped__;
}

/*—————————————————————————*/

lodash.assign = assign;
lodash.bind = bind;
lodash.chain = chain;
lodash.createCallback = createCallback;
lodash.difference = difference;
lodash.filter = filter;
lodash.forEach = forEach;
lodash.forIn = forIn;
lodash.forOwn = forOwn;
lodash.functions = functions;
lodash.keys = keys;
lodash.map = map;
lodash.merge = merge;
lodash.once = once;
lodash.pluck = pluck;
lodash.property = property;
lodash.remove = remove;
lodash.times = times;
lodash.where = where;

// add aliases
lodash.collect = map;
lodash.each = forEach;
lodash.extend = assign;
lodash.methods = functions;
lodash.select = filter;

// add functions to `lodash.prototype`
mixin(lodash);

/*—————————————————————————*/

lodash.find = find;
lodash.has = has;
lodash.identity = identity;
lodash.indexOf = indexOf;
lodash.isArguments = isArguments;
lodash.isArray = isArray;
lodash.isBoolean = isBoolean;
lodash.isEmpty = isEmpty;
lodash.isFunction = isFunction;
lodash.isNaN = isNaN;
lodash.isNull = isNull;
lodash.isNumber = isNumber;
lodash.isObject = isObject;
lodash.isPlainObject = isPlainObject;
lodash.isString = isString;
lodash.isUndefined = isUndefined;
lodash.mixin = mixin;
lodash.noop = noop;
lodash.reduce = reduce;
lodash.some = some;
lodash.sortedIndex = sortedIndex;

lodash.any = some;
lodash.detect = find;
lodash.findWhere = find;
lodash.foldl = reduce;
lodash.inject = reduce;

mixin(function() {
var source = {}
forOwn(lodash, function(func, methodName) {
if (!lodash.prototype[methodName]) {
source[methodName] = func;
}
});
return source;
}(), false);

/*—————————————————————————*/

forOwn(lodash, function(func, methodName) {
var callbackable = methodName !== ‘sample’;
if (!lodash.prototype[methodName]) {
lodash.prototype[methodName]= function(n, guard) {
var chainAll = this.__chain__,
result = func(this.__wrapped__, n, guard);

return !chainAll && (n == null || (guard && !(callbackable && typeof n == ‘function’)))
? result
: new lodashWrapper(result, chainAll);
};
}
});

/*—————————————————————————*/

/**
* The semantic version number.
*
* @static
* @memberOf _
* @type string
*/
lodash.VERSION = ‘2.4.1’;

// add «Chaining» functions to the wrapper
lodash.prototype.chain = wrapperChain;
lodash.prototype.toString = wrapperToString;
lodash.prototype.value = wrapperValueOf;
lodash.prototype.valueOf = wrapperValueOf;

// add `Array` functions that return unwrapped values
baseEach([‘join’, ‘pop’, ‘shift’], function(methodName) {
var func = arrayRef[methodName];
lodash.prototype[methodName] = function() {
var chainAll = this.__chain__,
result = func.apply(this.__wrapped__, arguments);

return chainAll
? new lodashWrapper(result, chainAll)
: result;
};
});

// add `Array` functions that return the existing wrapped value
baseEach([‘push’, ‘reverse’, ‘sort’, ‘unshift’], function(methodName) {
var func = arrayRef[methodName];
lodash.prototype[methodName] = function() {
func.apply(this.__wrapped__, arguments);
return this;
};
});

// add `Array` functions that return new wrapped values
baseEach([‘concat’, ‘slice’, ‘splice’], function(methodName) {
var func = arrayRef[methodName];
lodash.prototype[methodName] = function() {
return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);
};
});

// avoid array-like object bugs with `Array#shift` and `Array#splice`
// in IE < 9, Firefox < 10, Narwhal, and RingoJS if (!support.spliceObjects) { baseEach([‘pop’, ‘shift’, ‘splice’], function(methodName) { var func = arrayRef[methodName], isSplice = methodName == ‘splice’; lodash.prototype[methodName] = function() { var chainAll = this.__chain__, value = this.__wrapped__, result = func.apply(value, arguments); if (value.length === 0) { delete value[0]; } return (chainAll || isSplice) ? new lodashWrapper(result, chainAll) : result; }; }); } /*—————————————————————————*/ if (freeExports && freeModule) { // in Node.js or RingoJS if (moduleExports) { (freeModule.exports = lodash)._ = lodash; } } }.call(this)); }).call(this,typeof self !== «undefined» ? self : typeof window !== «undefined» ? window : {}) },{}],»lodash»:[function(require,module,exports){ module.exports=require(‘7ZYSzK’); },{}]},{},[87]); return response; });

Мягкий пол (будо-маты)

Мягкий конструктор

Купить горку в Рязани - пластиковые домики и горки

Пластик. горки, домики, качели для дома и дачи

Деревянная детская площадка в Рязани

Игровые комплексы "Мой Двор" от 37 900р.

Деревянная детская площадка в Рязани

Игровые комплексы "Перфетто Спорт"

Детская площадка из металла в Рязани

Формула здоровья

Песочница 10500 руб.

Спорткомплекс из металла в Рязани

Богатырь от 24200 руб.

Комплектующие для детских площадок