From bb757a22f67bd652103f94ab5589b73c960a02c6 Mon Sep 17 00:00:00 2001 From: dominiclord Date: Thu, 19 May 2016 13:37:19 -0400 Subject: [PATCH] Reworking page visibility API + Adding more utils --- assets/scripts/modules/Button.js | 4 +- assets/scripts/modules/Title.js | 33 ++- assets/scripts/utils/array.js | 83 ++++++++ assets/scripts/utils/is.js | 37 ++++ assets/scripts/utils/visibility.js | 124 +++++++++-- www/assets/scripts/app.js | 325 ++++++++++++++++++++++++++--- www/index.html | 2 +- 7 files changed, 555 insertions(+), 53 deletions(-) create mode 100644 assets/scripts/utils/array.js create mode 100644 assets/scripts/utils/is.js diff --git a/assets/scripts/modules/Button.js b/assets/scripts/modules/Button.js index 0115547..d5092f9 100644 --- a/assets/scripts/modules/Button.js +++ b/assets/scripts/modules/Button.js @@ -5,8 +5,8 @@ export default class extends AbstractModule { constructor(options) { super(options); - this.$el.on('click', (event) => { - this.$document.trigger('title.changeLabel', [$(event.currentTarget).val()]); + this.$el.on('click.Button', (event) => { + this.$document.trigger('Title.changeLabel', [$(event.currentTarget).val()]); }); } diff --git a/assets/scripts/modules/Title.js b/assets/scripts/modules/Title.js index e752d1d..8c33014 100644 --- a/assets/scripts/modules/Title.js +++ b/assets/scripts/modules/Title.js @@ -1,5 +1,5 @@ /* jshint esnext: true */ -import { registerDocumentHiddenCallback, registerDocumentVisibleCallback } from '../utils/visibility'; +import { visibilityApi } from '../utils/visibility'; import AbstractModule from './AbstractModule'; export default class extends AbstractModule { @@ -8,12 +8,22 @@ export default class extends AbstractModule { this.$label = this.$el.find('.js-label'); - this.$document.on('title.changeLabel', (event, value) => { + this.$document.on('Title.changeLabel', (event, value) => { this.changeLabel(value); + this.destroy(); }); - registerDocumentHiddenCallback(this.logHidden); - registerDocumentVisibleCallback(this.logVisible); + this.hiddenCallbackIdent = visibilityApi({ + action: 'addCallback', + state: 'hidden', + callback: this.logHidden + }); + + this.visibleCallbackIdent = visibilityApi({ + action: 'addCallback', + state: 'visible', + callback: this.logVisible + }); } logHidden() { @@ -29,7 +39,20 @@ export default class extends AbstractModule { } destroy() { - this.$document.off('title.changeLabel'); + this.$document.off('Title.changeLabel'); + + visibilityApi({ + action: 'removeCallback', + state: 'hidden', + ident: this.hiddenCallbackIdent + }); + + visibilityApi({ + action: 'removeCallback', + state: 'visible', + ident: this.visibleCallbackIdent + }); + this.$el.off('.Title'); } } diff --git a/assets/scripts/utils/array.js b/assets/scripts/utils/array.js new file mode 100644 index 0000000..60fb514 --- /dev/null +++ b/assets/scripts/utils/array.js @@ -0,0 +1,83 @@ +import { isArray } from './is'; + +export function addToArray ( array, value ) { + var index = array.indexOf( value ); + + if ( index === -1 ) { + array.push( value ); + } +} + +export function arrayContains ( array, value ) { + for ( let i = 0, c = array.length; i < c; i++ ) { + if ( array[i] == value ) { + return true; + } + } + + return false; +} + +export function arrayContentsMatch ( a, b ) { + var i; + + if ( !isArray( a ) || !isArray( b ) ) { + return false; + } + + if ( a.length !== b.length ) { + return false; + } + + i = a.length; + while ( i-- ) { + if ( a[i] !== b[i] ) { + return false; + } + } + + return true; +} + +export function ensureArray ( x ) { + if ( typeof x === 'string' ) { + return [ x ]; + } + + if ( x === undefined ) { + return []; + } + + return x; +} + +export function lastItem ( array ) { + return array[ array.length - 1 ]; +} + +export function removeFromArray ( array, member ) { + if ( !array ) { + return; + } + + const index = array.indexOf( member ); + + if ( index !== -1 ) { + array.splice( index, 1 ); + } +} + +export function toArray ( arrayLike ) { + var array = [], i = arrayLike.length; + while ( i-- ) { + array[i] = arrayLike[i]; + } + + return array; +} + +export function findByKeyValue( array, key, value ) { + return array.filter(function( obj ) { + return obj[key] === value; + }); +} diff --git a/assets/scripts/utils/is.js b/assets/scripts/utils/is.js new file mode 100644 index 0000000..a288d61 --- /dev/null +++ b/assets/scripts/utils/is.js @@ -0,0 +1,37 @@ +var toString = Object.prototype.toString, + arrayLikePattern = /^\[object (?:Array|FileList)\]$/; + +// thanks, http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/ +export function isArray ( thing ) { + return toString.call( thing ) === '[object Array]'; +} + +export function isArrayLike ( obj ) { + return arrayLikePattern.test( toString.call( obj ) ); +} + +export function isEqual ( a, b ) { + if ( a === null && b === null ) { + return true; + } + + if ( typeof a === 'object' || typeof b === 'object' ) { + return false; + } + + return a === b; +} + +// http://stackoverflow.com/questions/18082/validate-numbers-in-javascript-isnumeric +export function isNumeric ( thing ) { + return !isNaN( parseFloat( thing ) ) && isFinite( thing ); +} + +export function isObject ( thing ) { + return ( thing && toString.call( thing ) === '[object Object]' ); +} + +export function isFunction( thing ) { + var getType = {}; + return thing && getType.toString.call(thing) === '[object Function]'; +} diff --git a/assets/scripts/utils/visibility.js b/assets/scripts/utils/visibility.js index c889570..441601b 100644 --- a/assets/scripts/utils/visibility.js +++ b/assets/scripts/utils/visibility.js @@ -1,36 +1,130 @@ /* jshint esnext: true */ -import { $document, $window, $html, $body } from '../utils/environment'; +import { isFunction } from './is'; +import { arrayContains, findByKeyValue, removeFromArray } from './array'; +import { $document, $window, $html, $body } from './environment'; const CALLBACKS = { hidden: [], visible: [] }; +const ACTIONS = [ + 'addCallback', + 'removeCallback' +]; + +const STATES = [ + 'visible', + 'hidden' +]; + +const PREFIX = 'v-'; + +let UUID = 0; + // Main event $document.on('visibilitychange', function(event) { - if(document.hidden){ + if (document.hidden) { onDocumentChange('hidden'); - }else{ + } else { onDocumentChange('visible'); } }); -function registerDocumentHiddenCallback(callback) { - CALLBACKS['hidden'].push(callback); +/** + * Add a callback + * @param {string} state + * @param {function} callback + * @return {string} ident + */ +function addCallback (state, options) { + let callback = options.callback || ''; + + if (!isFunction(callback)) { + console.warn('Callback is not a function'); + return false; + } + + let ident = PREFIX + UUID++; + + CALLBACKS[state].push({ + ident: ident, + callback: callback + }); + + return ident; } -function registerDocumentVisibleCallback(callback) { - CALLBACKS['visible'].push(callback); -} +/** + * Remove a callback + * @param {string} state Visible or hidden + * @param {string} ident Unique identifier + * @return {boolean} If operation was a success + */ +function removeCallback (state, options) { + let ident = options.ident || ''; -function onDocumentChange(state) { - let callbacks = CALLBACKS[state]; - let i = 0; - let len = callbacks.length; + if (typeof(ident) === 'undefined' || ident === '') { + console.warn('Need ident to remove callback'); + return false; + } - for (; i < len; i++) { - callbacks[i](); + let index = findByKeyValue(CALLBACKS[state], 'ident', ident)[0]; + + // console.log(ident) + // console.log(CALLBACKS[state]) + + if (typeof(index) !== 'undefined') { + removeFromArray(CALLBACKS[state], index); + return true; + } else { + console.warn('Callback could not be found'); + return false; } } -export {registerDocumentHiddenCallback, registerDocumentVisibleCallback}; +/** + * When document state changes, trigger callbacks + * @param {string} state Visible or hidden + */ +function onDocumentChange (state) { + let callbackArray = CALLBACKS[state]; + let i = 0; + let len = callbackArray.length; + + for (; i < len; i++) { + callbackArray[i].callback(); + } +} + +/** + * Public facing API for adding and removing callbacks + * @param {object} options Options + * @return {boolean|integer} Unique identifier for the callback or boolean indicating success or failure + */ +function visibilityApi (options) { + let action = options.action || ''; + let state = options.state || ''; + let ret; + + // Type and value checking + if (!arrayContains(ACTIONS, action)) { + console.warn('Action does not exist'); + return false; + } + if (!arrayContains(STATES, state)) { + console.warn('State does not exist'); + return false; + } + + // @todo Magic call function pls + if (action === 'addCallback') { + ret = addCallback(state, options); + } else if (action === 'removeCallback') { + ret = removeCallback(state, options); + } + + return ret; +} + +export { visibilityApi }; diff --git a/www/assets/scripts/app.js b/www/assets/scripts/app.js index afa2fc5..26f6800 100644 --- a/www/assets/scripts/app.js +++ b/www/assets/scripts/app.js @@ -148,7 +148,7 @@ $(function () { window.app.init(); }); -},{"./modules":3,"./utils/globals":8}],2:[function(require,module,exports){ +},{"./modules":3,"./utils/globals":9}],2:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -215,7 +215,7 @@ var _class = function _class(options) { exports.default = _class; -},{"../utils/environment":7}],5:[function(require,module,exports){ +},{"../utils/environment":8}],5:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -245,8 +245,8 @@ var _class = function (_AbstractModule) { var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this, options)); - _this.$el.on('click', function (event) { - _this.$document.trigger('title.changeLabel', [$(event.currentTarget).val()]); + _this.$el.on('click.Button', function (event) { + _this.$document.trigger('Title.changeLabel', [$(event.currentTarget).val()]); }); return _this; } @@ -297,12 +297,22 @@ var _class = function (_AbstractModule) { _this.$label = _this.$el.find('.js-label'); - _this.$document.on('title.changeLabel', function (event, value) { + _this.$document.on('Title.changeLabel', function (event, value) { _this.changeLabel(value); + _this.destroy(); }); - (0, _visibility.registerDocumentHiddenCallback)(_this.logHidden); - (0, _visibility.registerDocumentVisibleCallback)(_this.logVisible); + _this.hiddenCallbackIdent = (0, _visibility.visibilityApi)({ + action: 'addCallback', + state: 'hidden', + callback: _this.logHidden + }); + + _this.visibleCallbackIdent = (0, _visibility.visibilityApi)({ + action: 'addCallback', + state: 'visible', + callback: _this.logVisible + }); return _this; } @@ -324,7 +334,20 @@ var _class = function (_AbstractModule) { }, { key: 'destroy', value: function destroy() { - this.$document.off('title.changeLabel'); + this.$document.off('Title.changeLabel'); + + (0, _visibility.visibilityApi)({ + action: 'removeCallback', + state: 'hidden', + ident: this.hiddenCallbackIdent + }); + + (0, _visibility.visibilityApi)({ + action: 'removeCallback', + state: 'visible', + ident: this.visibleCallbackIdent + }); + this.$el.off('.Title'); } }]); @@ -334,7 +357,107 @@ var _class = function (_AbstractModule) { exports.default = _class; -},{"../utils/visibility":9,"./AbstractModule":4}],7:[function(require,module,exports){ +},{"../utils/visibility":11,"./AbstractModule":4}],7:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.addToArray = addToArray; +exports.arrayContains = arrayContains; +exports.arrayContentsMatch = arrayContentsMatch; +exports.ensureArray = ensureArray; +exports.lastItem = lastItem; +exports.removeFromArray = removeFromArray; +exports.toArray = toArray; +exports.findByKeyValue = findByKeyValue; + +var _is = require('./is'); + +function addToArray(array, value) { + var index = array.indexOf(value); + + if (index === -1) { + array.push(value); + } +} + +function arrayContains(array, value) { + for (var i = 0, c = array.length; i < c; i++) { + if (array[i] == value) { + return true; + } + } + + return false; +} + +function arrayContentsMatch(a, b) { + var i; + + if (!(0, _is.isArray)(a) || !(0, _is.isArray)(b)) { + return false; + } + + if (a.length !== b.length) { + return false; + } + + i = a.length; + while (i--) { + if (a[i] !== b[i]) { + return false; + } + } + + return true; +} + +function ensureArray(x) { + if (typeof x === 'string') { + return [x]; + } + + if (x === undefined) { + return []; + } + + return x; +} + +function lastItem(array) { + return array[array.length - 1]; +} + +function removeFromArray(array, member) { + if (!array) { + return; + } + + var index = array.indexOf(member); + + if (index !== -1) { + array.splice(index, 1); + } +} + +function toArray(arrayLike) { + var array = [], + i = arrayLike.length; + while (i--) { + array[i] = arrayLike[i]; + } + + return array; +} + +function findByKeyValue(array, key, value) { + return array.filter(function (obj) { + return obj[key] === value; + }); +} + +},{"./is":10}],8:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -350,7 +473,7 @@ exports.$window = $window; exports.$html = $html; exports.$body = $body; -},{}],8:[function(require,module,exports){ +},{}],9:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -367,23 +490,88 @@ var _svg2 = _interopRequireDefault(_svg); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -},{"../global/svg":2}],9:[function(require,module,exports){ +},{"../global/svg":2}],10:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -exports.registerDocumentVisibleCallback = exports.registerDocumentHiddenCallback = undefined; -var _environment = require('../utils/environment'); +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; + +exports.isArray = isArray; +exports.isArrayLike = isArrayLike; +exports.isEqual = isEqual; +exports.isNumeric = isNumeric; +exports.isObject = isObject; +exports.isFunction = isFunction; +var toString = Object.prototype.toString, + arrayLikePattern = /^\[object (?:Array|FileList)\]$/; + +// thanks, http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/ +function isArray(thing) { + return toString.call(thing) === '[object Array]'; +} + +function isArrayLike(obj) { + return arrayLikePattern.test(toString.call(obj)); +} + +function isEqual(a, b) { + if (a === null && b === null) { + return true; + } + + if ((typeof a === 'undefined' ? 'undefined' : _typeof(a)) === 'object' || (typeof b === 'undefined' ? 'undefined' : _typeof(b)) === 'object') { + return false; + } + + return a === b; +} + +// http://stackoverflow.com/questions/18082/validate-numbers-in-javascript-isnumeric +function isNumeric(thing) { + return !isNaN(parseFloat(thing)) && isFinite(thing); +} + +function isObject(thing) { + return thing && toString.call(thing) === '[object Object]'; +} + +function isFunction(thing) { + var getType = {}; + return thing && getType.toString.call(thing) === '[object Function]'; +} + +},{}],11:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.visibilityApi = undefined; + +var _is = require('./is'); + +var _array = require('./array'); + +var _environment = require('./environment'); var CALLBACKS = { hidden: [], visible: [] -}; +}; /* jshint esnext: true */ + + +var ACTIONS = ['addCallback', 'removeCallback']; + +var STATES = ['visible', 'hidden']; + +var PREFIX = 'v-'; + +var UUID = 0; // Main event -/* jshint esnext: true */ _environment.$document.on('visibilitychange', function (event) { if (document.hidden) { onDocumentChange('hidden'); @@ -392,26 +580,103 @@ _environment.$document.on('visibilitychange', function (event) { } }); -function registerDocumentHiddenCallback(callback) { - CALLBACKS['hidden'].push(callback); +/** + * Add a callback + * @param {string} state + * @param {function} callback + * @return {string} ident + */ +function addCallback(state, options) { + var callback = options.callback || ''; + + if (!(0, _is.isFunction)(callback)) { + console.warn('Callback is not a function'); + return false; + } + + var ident = PREFIX + UUID++; + + CALLBACKS[state].push({ + ident: ident, + callback: callback + }); + + return ident; } -function registerDocumentVisibleCallback(callback) { - CALLBACKS['visible'].push(callback); -} +/** + * Remove a callback + * @param {string} state Visible or hidden + * @param {string} ident Unique identifier + * @return {boolean} If operation was a success + */ +function removeCallback(state, options) { + var ident = options.ident || ''; -function onDocumentChange(state) { - var callbacks = CALLBACKS[state]; - var i = 0; - var len = callbacks.length; + if (typeof ident === 'undefined' || ident === '') { + console.warn('Need ident to remove callback'); + return false; + } - for (; i < len; i++) { - callbacks[i](); + var index = (0, _array.findByKeyValue)(CALLBACKS[state], 'ident', ident)[0]; + + // console.log(ident) + // console.log(CALLBACKS[state]) + + if (typeof index !== 'undefined') { + (0, _array.removeFromArray)(CALLBACKS[state], index); + return true; + } else { + console.warn('Callback could not be found'); + return false; } } -exports.registerDocumentHiddenCallback = registerDocumentHiddenCallback; -exports.registerDocumentVisibleCallback = registerDocumentVisibleCallback; +/** + * When document state changes, trigger callbacks + * @param {string} state Visible or hidden + */ +function onDocumentChange(state) { + var callbackArray = CALLBACKS[state]; + var i = 0; + var len = callbackArray.length; -},{"../utils/environment":7}]},{},[1,2,3,4,5,6,7,8,9]) -//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9ncnVudC1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhc3NldHMvc2NyaXB0cy9BcHAuanMiLCJhc3NldHMvc2NyaXB0cy9nbG9iYWwvc3ZnLmpzIiwiYXNzZXRzL3NjcmlwdHMvbW9kdWxlcy5qcyIsImFzc2V0cy9zY3JpcHRzL21vZHVsZXMvQWJzdHJhY3RNb2R1bGUuanMiLCJhc3NldHMvc2NyaXB0cy9tb2R1bGVzL0J1dHRvbi5qcyIsImFzc2V0cy9zY3JpcHRzL21vZHVsZXMvVGl0bGUuanMiLCJhc3NldHMvc2NyaXB0cy91dGlscy9lbnZpcm9ubWVudC5qcyIsImFzc2V0cy9zY3JpcHRzL3V0aWxzL2dsb2JhbHMuanMiLCJhc3NldHMvc2NyaXB0cy91dGlscy92aXNpYmlsaXR5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7QUNDQTs7OztBQUNBOztJQUFZOzs7Ozs7OztJQUVOO0FBQ0wsVUFESyxHQUNMLEdBQWM7d0JBRFQsS0FDUzs7QUFDYixPQUFLLE9BQUwsR0FBZSxPQUFmLENBRGE7QUFFYixPQUFLLGNBQUwsR0FBc0IsRUFBdEIsQ0FGYTtFQUFkOzs7Ozs7OztjQURLOztnQ0FVUztBQUNiLDRCQURhO0FBRWIsVUFBTyxJQUFQLENBRmE7Ozs7Ozs7Ozs7Z0NBU0E7O0FBRWIsT0FBSSxZQUFZLFNBQVMsZ0JBQVQsQ0FBMEIsZUFBMUIsQ0FBWjs7O0FBRlMsT0FLVCxJQUFJLENBQUosQ0FMUztBQU1iLE9BQUksU0FBUyxVQUFVLE1BQVYsQ0FOQTs7QUFRYixVQUFPLElBQUksTUFBSixFQUFZLEdBQW5CLEVBQXdCOzs7QUFHdkIsUUFBSSxLQUFLLFVBQVUsQ0FBVixDQUFMOzs7QUFIbUIsUUFNbkIsVUFBVSxLQUFLLFdBQUwsQ0FBaUIsRUFBakIsQ0FBVjs7O0FBTm1CLFdBU3ZCLENBQVEsRUFBUixHQUFhLEVBQWIsQ0FUdUI7QUFVdkIsWUFBUSxHQUFSLEdBQWMsRUFBRSxFQUFGLENBQWQ7OztBQVZ1QixRQWFuQixPQUFPLFFBQVEsTUFBUjs7O0FBYlksUUFnQm5CLGVBQWUsS0FBSyxPQUFMLENBQWEsS0FBYixFQUFvQixFQUFwQixFQUF3QixLQUF4QixDQUE4QixHQUE5QixDQUFmOzs7QUFoQm1CLFFBbUJuQixJQUFJLENBQUosQ0FuQm1CO0FBb0J2QixRQUFJLGFBQWEsYUFBYSxNQUFiLENBcEJNOztBQXNCdkIsV0FBTyxJQUFJLFVBQUosRUFBZ0IsR0FBdkIsRUFBNEI7QUFDM0IsU0FBSSxhQUFhLGFBQWEsQ0FBYixDQUFiLENBRHVCOztBQUczQixTQUFJLE9BQU8sS0FBSyxPQUFMLENBQWEsVUFBYixDQUFQLEtBQW9DLFVBQXBDLEVBQWdEO0FBQ25ELFVBQUksU0FBUyxJQUFJLEtBQUssT0FBTCxDQUFhLFVBQWIsQ0FBSixDQUE2QixPQUE3QixDQUFULENBRCtDO0FBRW5ELFdBQUssY0FBTCxDQUFvQixJQUFwQixDQUF5QixNQUF6QixFQUZtRDtNQUFwRDtLQUhEO0lBdEJEOztBQWdDQSxVQUFPLElBQVAsQ0F4Q2E7Ozs7Ozs7Ozs7OzhCQWdERixJQUFJOztBQUVmLE9BQUksYUFBYSxHQUFHLFVBQUg7OztBQUZGLE9BS1gsVUFBVSxjQUFWOzs7QUFMVyxPQVFYLE9BQU8sRUFBUCxDQVJXOztBQVVmLFFBQUssSUFBSSxDQUFKLElBQVMsVUFBZCxFQUEwQjs7QUFFekIsUUFBSSxPQUFPLFdBQVcsQ0FBWCxFQUFjLElBQWQ7OztBQUZjLFFBS3JCLENBQUMsSUFBRCxFQUFPO0FBQ1YsY0FEVTtLQUFYOztBQUlBLFFBQUksUUFBUSxLQUFLLEtBQUwsQ0FBVyxPQUFYLENBQVIsQ0FUcUI7QUFVekIsUUFBSSxDQUFDLEtBQUQsRUFBUTtBQUNYLGNBRFc7S0FBWjs7OztBQVZ5QixRQWdCekIsQ0FBSyxNQUFNLENBQU4sQ0FBTCxJQUFpQixHQUFHLFlBQUgsQ0FBZ0IsSUFBaEIsQ0FBakIsQ0FoQnlCO0lBQTFCOztBQW1CQSxVQUFPLElBQVAsQ0E3QmU7Ozs7Ozs7Ozt5QkFtQ1Q7QUFDTixRQUFLLFdBQUwsR0FBbUIsV0FBbkIsR0FETTs7OztRQXRHRjs7O0FBMkdOLEVBQUUsWUFBVztBQUNaLFFBQU8sR0FBUCxHQUFhLElBQUksR0FBSixFQUFiLENBRFk7QUFFWixRQUFPLEdBQVAsQ0FBVyxJQUFYLEdBRlk7Q0FBWCxDQUFGOzs7Ozs7Ozs7a0JDOUdlLFlBQVc7QUFDekIsaUJBRHlCO0NBQVg7Ozs7Ozs7Ozs7Ozs7OzJDQ0FQOzs7Ozs7Ozs7MENBQ0E7Ozs7Ozs7Ozs7Ozs7QUNEUjs7Ozs7Ozs7OzthQU9DLGdCQUFZLE9BQVosRUFBcUI7OztBQUNwQixNQUFLLFNBQUwsMEJBRG9CO0FBRXBCLE1BQUssT0FBTCx3QkFGb0I7QUFHcEIsTUFBSyxLQUFMLHNCQUhvQjtBQUlwQixNQUFLLEtBQUwsc0JBSm9CO0FBS3BCLE1BQUssR0FBTCxHQUFXLFFBQVEsR0FBUixDQUxTO0NBQXJCOzs7Ozs7Ozs7Ozs7O0FDUEQ7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQyxpQkFBWSxPQUFaLEVBQXFCOzs7d0ZBQ2QsVUFEYzs7QUFHcEIsUUFBSyxHQUFMLENBQVMsRUFBVCxDQUFZLE9BQVosRUFBcUIsVUFBQyxLQUFELEVBQVc7QUFDL0IsU0FBSyxTQUFMLENBQWUsT0FBZixDQUF1QixtQkFBdkIsRUFBNEMsQ0FBQyxFQUFFLE1BQU0sYUFBTixDQUFGLENBQXVCLEdBQXZCLEVBQUQsQ0FBNUMsRUFEK0I7R0FBWCxDQUFyQixDQUhvQjs7RUFBckI7Ozs7NEJBUVU7QUFDVCxRQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsU0FBYixFQURTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNYWDs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQUdDLGlCQUFZLE9BQVosRUFBcUI7Ozt3RkFDZCxVQURjOztBQUdwQixRQUFLLE1BQUwsR0FBYyxNQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMsV0FBZCxDQUFkLENBSG9COztBQUtwQixRQUFLLFNBQUwsQ0FBZSxFQUFmLENBQWtCLG1CQUFsQixFQUF1QyxVQUFDLEtBQUQsRUFBUSxLQUFSLEVBQWtCO0FBQ3hELFNBQUssV0FBTCxDQUFpQixLQUFqQixFQUR3RDtHQUFsQixDQUF2QyxDQUxvQjs7QUFTcEIsa0RBQStCLE1BQUssU0FBTCxDQUEvQixDQVRvQjtBQVVwQixtREFBZ0MsTUFBSyxVQUFMLENBQWhDLENBVm9COztFQUFyQjs7Ozs4QkFhWTtBQUNYLFdBQVEsR0FBUixDQUFZLGlCQUFaLEVBRFc7Ozs7K0JBSUM7QUFDWixXQUFRLEdBQVIsQ0FBWSxrQkFBWixFQURZOzs7OzhCQUlELE9BQU87QUFDbEIsUUFBSyxNQUFMLENBQVksSUFBWixDQUFpQixLQUFqQixFQURrQjs7Ozs0QkFJVDtBQUNULFFBQUssU0FBTCxDQUFlLEdBQWYsQ0FBbUIsbUJBQW5CLEVBRFM7QUFFVCxRQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsUUFBYixFQUZTOzs7Ozs7Ozs7Ozs7Ozs7QUM5QlgsSUFBTSxZQUFZLEVBQUUsUUFBRixDQUFaO0FBQ04sSUFBTSxVQUFVLEVBQUUsTUFBRixDQUFWO0FBQ04sSUFBTSxRQUFRLEVBQUUsU0FBUyxlQUFULENBQVY7QUFDTixJQUFNLFFBQVEsRUFBRSxTQUFTLElBQVQsQ0FBVjs7UUFFRztRQUFXO1FBQVM7UUFBTzs7Ozs7Ozs7O2tCQ0ZyQixZQUFXO0FBQ3pCLHNCQUR5QjtDQUFYOztBQUZmOzs7Ozs7Ozs7Ozs7OztBQ0FBOztBQUVBLElBQU0sWUFBWTtBQUNqQixTQUFRLEVBQVI7QUFDQSxVQUFTLEVBQVQ7Q0FGSzs7OztBQU1OLHVCQUFVLEVBQVYsQ0FBYSxrQkFBYixFQUFpQyxVQUFTLEtBQVQsRUFBZ0I7QUFDaEQsS0FBRyxTQUFTLE1BQVQsRUFBZ0I7QUFDbEIsbUJBQWlCLFFBQWpCLEVBRGtCO0VBQW5CLE1BRUs7QUFDSixtQkFBaUIsU0FBakIsRUFESTtFQUZMO0NBRGdDLENBQWpDOztBQVFBLFNBQVMsOEJBQVQsQ0FBd0MsUUFBeEMsRUFBa0Q7QUFDakQsV0FBVSxRQUFWLEVBQW9CLElBQXBCLENBQXlCLFFBQXpCLEVBRGlEO0NBQWxEOztBQUlBLFNBQVMsK0JBQVQsQ0FBeUMsUUFBekMsRUFBbUQ7QUFDbEQsV0FBVSxTQUFWLEVBQXFCLElBQXJCLENBQTBCLFFBQTFCLEVBRGtEO0NBQW5EOztBQUlBLFNBQVMsZ0JBQVQsQ0FBMEIsS0FBMUIsRUFBaUM7QUFDaEMsS0FBSSxZQUFZLFVBQVUsS0FBVixDQUFaLENBRDRCO0FBRWhDLEtBQUksSUFBSSxDQUFKLENBRjRCO0FBR2hDLEtBQUksTUFBTSxVQUFVLE1BQVYsQ0FIc0I7O0FBS2hDLFFBQU8sSUFBSSxHQUFKLEVBQVMsR0FBaEIsRUFBcUI7QUFDcEIsWUFBVSxDQUFWLElBRG9CO0VBQXJCO0NBTEQ7O1FBVVE7UUFBZ0MiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLyoganNoaW50IGVzbmV4dDogdHJ1ZSAqL1xuaW1wb3J0IGdsb2JhbHMgZnJvbSAnLi91dGlscy9nbG9iYWxzJztcbmltcG9ydCAqIGFzIG1vZHVsZXMgZnJvbSAnLi9tb2R1bGVzJztcblxuY2xhc3MgQXBwIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5tb2R1bGVzID0gbW9kdWxlcztcblx0XHR0aGlzLmN1cnJlbnRNb2R1bGVzID0gW107XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZSBnbG9iYWwgZnVuY3Rpb25zIGFuZCBzZXR0aW5nc1xuXHQgKiBAcmV0dXJuIHtPYmplY3R9XG5cdCAqL1xuXHRpbml0R2xvYmFscygpIHtcblx0XHRnbG9iYWxzKCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogRmluZCBtb2R1bGVzIGFuZCBpbml0aWFsaXplIHRoZW1cblx0ICogQHJldHVybiAge09iamVjdH0gIHRoaXMgIEFsbG93cyBjaGFpbmluZ1xuXHQgKi9cblx0aW5pdE1vZHVsZXMoKSB7XG5cdFx0Ly8gRWxlbWVudHMgd2l0aCBtb2R1bGVcblx0XHR2YXIgbW9kdWxlRWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbW9kdWxlXScpO1xuXG5cdFx0Ly8gTG9vcCB0aHJvdWdoIGVsZW1lbnRzXG5cdFx0dmFyIGkgPSAwO1xuXHRcdHZhciBlbHNMZW4gPSBtb2R1bGVFbHMubGVuZ3RoO1xuXG5cdFx0Zm9yICg7IGkgPCBlbHNMZW47IGkrKykge1xuXG5cdFx0XHQvLyBDdXJyZW50IGVsZW1lbnRcblx0XHRcdGxldCBlbCA9IG1vZHVsZUVsc1tpXTtcblxuXHRcdFx0Ly8gQWxsIGRhdGEtIGF0dHJpYnV0ZXMgY29uc2lkZXJlZCBhcyBvcHRpb25zXG5cdFx0XHRsZXQgb3B0aW9ucyA9IHRoaXMuZ2V0RWxlbURhdGEoZWwpO1xuXG5cdFx0XHQvLyBBZGQgY3VycmVudCBET00gZWxlbWVudCBhbmQgalF1ZXJ5IGVsZW1lbnRcblx0XHRcdG9wdGlvbnMuZWwgPSBlbDtcblx0XHRcdG9wdGlvbnMuJGVsID0gJChlbCk7XG5cblx0XHRcdC8vIE1vZHVsZSBkb2VzIGV4aXN0IGF0IHRoaXMgcG9pbnRcblx0XHRcdGxldCBhdHRyID0gb3B0aW9ucy5tb2R1bGU7XG5cblx0XHRcdC8vIFNwbGl0dGluZyBtb2R1bGVzIGZvdW5kIGluIHRoZSBkYXRhLWF0dHJpYnV0ZVxuXHRcdFx0bGV0IG1vZHVsZUlkZW50cyA9IGF0dHIucmVwbGFjZSgvXFxzL2csICcnKS5zcGxpdCgnLCcpO1xuXG5cdFx0XHQvLyBMb29wIG1vZHVsZXNcblx0XHRcdGxldCBqID0gMDtcblx0XHRcdGxldCBtb2R1bGVzTGVuID0gbW9kdWxlSWRlbnRzLmxlbmd0aDtcblxuXHRcdFx0Zm9yICg7IGogPCBtb2R1bGVzTGVuOyBqKyspIHtcblx0XHRcdFx0bGV0IG1vZHVsZUF0dHIgPSBtb2R1bGVJZGVudHNbal07XG5cblx0XHRcdFx0aWYgKHR5cGVvZiB0aGlzLm1vZHVsZXNbbW9kdWxlQXR0cl0gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRsZXQgbW9kdWxlID0gbmV3IHRoaXMubW9kdWxlc1ttb2R1bGVBdHRyXShvcHRpb25zKTtcblx0XHRcdFx0XHR0aGlzLmN1cnJlbnRNb2R1bGVzLnB1c2gobW9kdWxlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBlbGVtZW50IGRhdGEgYXR0cmlidXRlc1xuXHQgKiBAcGFyYW0gICB7RE9NRWxlbWVudH0gIGVsXG5cdCAqIEByZXR1cm4gIHtBcnJheX0gICAgICAgZGF0YVxuXHQgKi9cblx0Z2V0RWxlbURhdGEoZWwpIHtcblx0XHQvLyBBbGwgYXR0cmlidXRlc1xuXHRcdHZhciBhdHRyaWJ1dGVzID0gZWwuYXR0cmlidXRlcztcblxuXHRcdC8vIFJlZ2V4IFBhdHRlcm5cblx0XHR2YXIgcGF0dGVybiA9IC9eZGF0YVxcLSguKykkLztcblxuXHRcdC8vIE91dHB1dFxuXHRcdHZhciBkYXRhID0ge307XG5cblx0XHRmb3IgKGxldCBpIGluIGF0dHJpYnV0ZXMpIHtcblx0XHRcdC8vIEF0dHJpYnV0ZXMgbmFtZSAoZXg6IGRhdGEtbW9kdWxlKVxuXHRcdFx0bGV0IG5hbWUgPSBhdHRyaWJ1dGVzW2ldLm5hbWU7XG5cblx0XHRcdC8vIFRoaXMgaGFwcGVucy5cblx0XHRcdGlmICghbmFtZSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IG1hdGNoID0gbmFtZS5tYXRjaChwYXR0ZXJuKTtcblx0XHRcdGlmICghbWF0Y2gpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoaXMgdGhyb3dzIGFuIGVycm9yLCB5b3UgaGF2ZSBzb21lXG5cdFx0XHQvLyBzZXJpb3VzIHByb2JsZW1zIGluIHlvdXIgSFRNTC5cblx0XHRcdGRhdGFbbWF0Y2hbMV1dID0gZWwuZ2V0QXR0cmlidXRlKG5hbWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemUgYXBwIGFmdGVyIGRvY3VtZW50IHJlYWR5XG5cdCAqL1xuXHRpbml0KCkge1xuXHRcdHRoaXMuaW5pdEdsb2JhbHMoKS5pbml0TW9kdWxlcygpO1xuXHR9XG59XG5cbiQoZnVuY3Rpb24oKSB7XG5cdHdpbmRvdy5hcHAgPSBuZXcgQXBwKCk7XG5cdHdpbmRvdy5hcHAuaW5pdCgpO1xufSk7XG4iLCIvKiBqc2hpbnQgZXNuZXh0OiB0cnVlICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblx0c3ZnNGV2ZXJ5Ym9keSgpO1xufVxuIiwiLyoganNoaW50IGVzbmV4dDogdHJ1ZSAqL1xuZXhwb3J0IHtkZWZhdWx0IGFzIEJ1dHRvbn0gZnJvbSAnLi9tb2R1bGVzL0J1dHRvbic7XG5leHBvcnQge2RlZmF1bHQgYXMgVGl0bGV9IGZyb20gJy4vbW9kdWxlcy9UaXRsZSc7XG4iLCIvKiBqc2hpbnQgZXNuZXh0OiB0cnVlICovXG5pbXBvcnQgeyAkZG9jdW1lbnQsICR3aW5kb3csICRodG1sLCAkYm9keSB9IGZyb20gJy4uL3V0aWxzL2Vudmlyb25tZW50JztcblxuLyoqXG4gKiBBYnN0cmFjdCBtb2R1bGVcbiAqIEdpdmVzIGFjY2VzcyB0byBnZW5lcmljIGpRdWVyeSBub2Rlc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyB7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHR0aGlzLiRkb2N1bWVudCA9ICRkb2N1bWVudDtcblx0XHR0aGlzLiR3aW5kb3cgPSAkd2luZG93O1xuXHRcdHRoaXMuJGh0bWwgPSAkaHRtbDtcblx0XHR0aGlzLiRib2R5ID0gJGJvZHk7XG5cdFx0dGhpcy4kZWwgPSBvcHRpb25zLiRlbDtcblx0fVxufVxuIiwiLyoganNoaW50IGVzbmV4dDogdHJ1ZSAqL1xuaW1wb3J0IEFic3RyYWN0TW9kdWxlIGZyb20gJy4vQWJzdHJhY3RNb2R1bGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEFic3RyYWN0TW9kdWxlIHtcblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdHN1cGVyKG9wdGlvbnMpO1xuXG5cdFx0dGhpcy4kZWwub24oJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG5cdFx0XHR0aGlzLiRkb2N1bWVudC50cmlnZ2VyKCd0aXRsZS5jaGFuZ2VMYWJlbCcsIFskKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnZhbCgpXSk7XG5cdFx0fSk7XG5cdH1cblxuXHRkZXN0cm95KCkge1xuXHRcdHRoaXMuJGVsLm9mZignLkJ1dHRvbicpO1xuXHR9XG59XG4iLCIvKiBqc2hpbnQgZXNuZXh0OiB0cnVlICovXG5pbXBvcnQgeyByZWdpc3RlckRvY3VtZW50SGlkZGVuQ2FsbGJhY2ssIHJlZ2lzdGVyRG9jdW1lbnRWaXNpYmxlQ2FsbGJhY2sgfSBmcm9tICcuLi91dGlscy92aXNpYmlsaXR5JztcbmltcG9ydCBBYnN0cmFjdE1vZHVsZSBmcm9tICcuL0Fic3RyYWN0TW9kdWxlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHRzdXBlcihvcHRpb25zKTtcblxuXHRcdHRoaXMuJGxhYmVsID0gdGhpcy4kZWwuZmluZCgnLmpzLWxhYmVsJyk7XG5cblx0XHR0aGlzLiRkb2N1bWVudC5vbigndGl0bGUuY2hhbmdlTGFiZWwnLCAoZXZlbnQsIHZhbHVlKSA9PiB7XG5cdFx0XHR0aGlzLmNoYW5nZUxhYmVsKHZhbHVlKTtcblx0XHR9KTtcblxuXHRcdHJlZ2lzdGVyRG9jdW1lbnRIaWRkZW5DYWxsYmFjayh0aGlzLmxvZ0hpZGRlbik7XG5cdFx0cmVnaXN0ZXJEb2N1bWVudFZpc2libGVDYWxsYmFjayh0aGlzLmxvZ1Zpc2libGUpO1xuXHR9XG5cblx0bG9nSGlkZGVuKCkge1xuXHRcdGNvbnNvbGUubG9nKCdUaXRsZSBpcyBoaWRkZW4nKTtcblx0fVxuXG5cdGxvZ1Zpc2libGUoKSB7XG5cdFx0Y29uc29sZS5sb2coJ1RpdGxlIGlzIHZpc2libGUnKTtcblx0fVxuXG5cdGNoYW5nZUxhYmVsKHZhbHVlKSB7XG5cdFx0dGhpcy4kbGFiZWwudGV4dCh2YWx1ZSk7XG5cdH1cblxuXHRkZXN0cm95KCkge1xuXHRcdHRoaXMuJGRvY3VtZW50Lm9mZigndGl0bGUuY2hhbmdlTGFiZWwnKTtcblx0XHR0aGlzLiRlbC5vZmYoJy5UaXRsZScpO1xuXHR9XG59XG4iLCJjb25zdCAkZG9jdW1lbnQgPSAkKGRvY3VtZW50KTtcbmNvbnN0ICR3aW5kb3cgPSAkKHdpbmRvdyk7XG5jb25zdCAkaHRtbCA9ICQoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbmNvbnN0ICRib2R5ID0gJChkb2N1bWVudC5ib2R5KTtcblxuZXhwb3J0IHsgJGRvY3VtZW50LCAkd2luZG93LCAkaHRtbCwgJGJvZHkgfTtcbiIsIi8qIGpzaGludCBlc25leHQ6IHRydWUgKi9cbmltcG9ydCBzdmcgZnJvbSAnLi4vZ2xvYmFsL3N2Zyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXHRzdmcoKTtcbn1cbiIsIi8qIGpzaGludCBlc25leHQ6IHRydWUgKi9cbmltcG9ydCB7ICRkb2N1bWVudCwgJHdpbmRvdywgJGh0bWwsICRib2R5IH0gZnJvbSAnLi4vdXRpbHMvZW52aXJvbm1lbnQnO1xuXG5jb25zdCBDQUxMQkFDS1MgPSB7XG5cdGhpZGRlbjogW10sXG5cdHZpc2libGU6IFtdXG59O1xuXG4vLyBNYWluIGV2ZW50XG4kZG9jdW1lbnQub24oJ3Zpc2liaWxpdHljaGFuZ2UnLCBmdW5jdGlvbihldmVudCkge1xuXHRpZihkb2N1bWVudC5oaWRkZW4pe1xuXHRcdG9uRG9jdW1lbnRDaGFuZ2UoJ2hpZGRlbicpO1xuXHR9ZWxzZXtcblx0XHRvbkRvY3VtZW50Q2hhbmdlKCd2aXNpYmxlJyk7XG5cdH1cbn0pO1xuXG5mdW5jdGlvbiByZWdpc3RlckRvY3VtZW50SGlkZGVuQ2FsbGJhY2soY2FsbGJhY2spIHtcblx0Q0FMTEJBQ0tTWydoaWRkZW4nXS5wdXNoKGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJEb2N1bWVudFZpc2libGVDYWxsYmFjayhjYWxsYmFjaykge1xuXHRDQUxMQkFDS1NbJ3Zpc2libGUnXS5wdXNoKGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gb25Eb2N1bWVudENoYW5nZShzdGF0ZSkge1xuXHRsZXQgY2FsbGJhY2tzID0gQ0FMTEJBQ0tTW3N0YXRlXTtcblx0bGV0IGkgPSAwO1xuXHRsZXQgbGVuID0gY2FsbGJhY2tzLmxlbmd0aDtcblxuXHRmb3IgKDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0Y2FsbGJhY2tzW2ldKCk7XG5cdH1cbn1cblxuZXhwb3J0IHtyZWdpc3RlckRvY3VtZW50SGlkZGVuQ2FsbGJhY2ssIHJlZ2lzdGVyRG9jdW1lbnRWaXNpYmxlQ2FsbGJhY2t9O1xuIl19 + for (; i < len; i++) { + callbackArray[i].callback(); + } +} + +/** + * Public facing API for adding and removing callbacks + * @param {object} options Options + * @return {boolean|integer} Unique identifier for the callback or boolean indicating success or failure + */ +function visibilityApi(options) { + var action = options.action || ''; + var state = options.state || ''; + var ret = void 0; + + // Type and value checking + if (!(0, _array.arrayContains)(ACTIONS, action)) { + console.warn('Action does not exist'); + return false; + } + if (!(0, _array.arrayContains)(STATES, state)) { + console.warn('State does not exist'); + return false; + } + + // @todo Magic call function pls + if (action === 'addCallback') { + ret = addCallback(state, options); + } else if (action === 'removeCallback') { + ret = removeCallback(state, options); + } + + return ret; +} + +exports.visibilityApi = visibilityApi; + +},{"./array":7,"./environment":8,"./is":10}]},{},[1,2,3,4,5,6,7,8,9,10,11]) +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhc3NldHMvc2NyaXB0cy9BcHAuanMiLCJhc3NldHMvc2NyaXB0cy9nbG9iYWwvc3ZnLmpzIiwiYXNzZXRzL3NjcmlwdHMvbW9kdWxlcy5qcyIsImFzc2V0cy9zY3JpcHRzL21vZHVsZXMvQWJzdHJhY3RNb2R1bGUuanMiLCJhc3NldHMvc2NyaXB0cy9tb2R1bGVzL0J1dHRvbi5qcyIsImFzc2V0cy9zY3JpcHRzL21vZHVsZXMvVGl0bGUuanMiLCJhc3NldHMvc2NyaXB0cy91dGlscy9hcnJheS5qcyIsImFzc2V0cy9zY3JpcHRzL3V0aWxzL2Vudmlyb25tZW50LmpzIiwiYXNzZXRzL3NjcmlwdHMvdXRpbHMvZ2xvYmFscy5qcyIsImFzc2V0cy9zY3JpcHRzL3V0aWxzL2lzLmpzIiwiYXNzZXRzL3NjcmlwdHMvdXRpbHMvdmlzaWJpbGl0eS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0FDQ0E7Ozs7QUFDQTs7SUFBWSxPOzs7Ozs7OztJQUVOLEc7QUFDTCxnQkFBYztBQUFBOztBQUNiLE9BQUssT0FBTCxHQUFlLE9BQWY7QUFDQSxPQUFLLGNBQUwsR0FBc0IsRUFBdEI7QUFDQTs7Ozs7Ozs7OztnQ0FNYTtBQUNiO0FBQ0EsVUFBTyxJQUFQO0FBQ0E7Ozs7Ozs7OztnQ0FNYTs7QUFFYixPQUFJLFlBQVksU0FBUyxnQkFBVCxDQUEwQixlQUExQixDQUFoQjs7O0FBR0EsT0FBSSxJQUFJLENBQVI7QUFDQSxPQUFJLFNBQVMsVUFBVSxNQUF2Qjs7QUFFQSxVQUFPLElBQUksTUFBWCxFQUFtQixHQUFuQixFQUF3Qjs7O0FBR3ZCLFFBQUksS0FBSyxVQUFVLENBQVYsQ0FBVDs7O0FBR0EsUUFBSSxVQUFVLEtBQUssV0FBTCxDQUFpQixFQUFqQixDQUFkOzs7QUFHQSxZQUFRLEVBQVIsR0FBYSxFQUFiO0FBQ0EsWUFBUSxHQUFSLEdBQWMsRUFBRSxFQUFGLENBQWQ7OztB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QUNBO0FBQ0Q7Ozs7Ozs7QUFPRCxTQUFTLGFBQVQsQ0FBd0IsT0FBeEIsRUFBaUM7QUFDaEMsS0FBSSxTQUFTLFFBQVEsTUFBUixJQUFrQixFQUEvQjtBQUNBLEtBQUksUUFBUSxRQUFRLEtBQVIsSUFBaUIsRUFBN0I7QUFDQSxLQUFJLFlBQUo7OztBQUdBLEtBQUksQ0FBQywwQkFBYyxPQUFkLEVBQXVCLE1BQXZCLENBQUwsRUFBcUM7QUFDcEMsVUFBUSxJQUFSLENBQWEsdUJBQWI7QUFDQSxTQUFPLEtBQVA7QUFDQTtBQUNELEtBQUksQ0FBQywwQkFBYyxNQUFkLEVBQXNCLEtBQXRCLENBQUwsRUFBbUM7QUFDbEMsVUFBUSxJQUFSLENBQWEsc0JBQWI7QUFDQSxTQUFPLEtBQVA7QUFDQTs7O0FBR0QsS0FBSSxXQUFXLGFBQWYsRUFBOEI7QUFDN0IsUUFBTSxZQUFZLEtBQVosRUFBbUIsT0FBbkIsQ0FBTjtBQUNBLEVBRkQsTUFFTyxJQUFJLFdBQVcsZ0JBQWYsRUFBaUM7QUFDdkMsUUFBTSxlQUFlLEtBQWYsRUFBc0IsT0FBdEIsQ0FBTjtBQUNBOztBQUVELFFBQU8sR0FBUDtBQUNBOztRQUVRLGEsR0FBQSxhIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8qIGpzaGludCBlc25leHQ6IHRydWUgKi9cbmltcG9ydCBnbG9iYWxzIGZyb20gJy4vdXRpbHMvZ2xvYmFscyc7XG5pbXBvcnQgKiBhcyBtb2R1bGVzIGZyb20gJy4vbW9kdWxlcyc7XG5cbmNsYXNzIEFwcCB7XG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRoaXMubW9kdWxlcyA9IG1vZHVsZXM7XG5cdFx0dGhpcy5jdXJyZW50TW9kdWxlcyA9IFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQgc2V0dGluZ3Ncblx0ICogQHJldHVybiB7T2JqZWN0fVxuXHQgKi9cblx0aW5pdEdsb2JhbHMoKSB7XG5cdFx0Z2xvYmFscygpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZpbmQgbW9kdWxlcyBhbmQgaW5pdGlhbGl6ZSB0aGVtXG5cdCAqIEByZXR1cm4gIHtPYmplY3R9ICB0aGlzICBBbGxvd3MgY2hhaW5pbmdcblx0ICovXG5cdGluaXRNb2R1bGVzKCkge1xuXHRcdC8vIEVsZW1lbnRzIHdpdGggbW9kdWxlXG5cdFx0dmFyIG1vZHVsZUVscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW1vZHVsZV0nKTtcblxuXHRcdC8vIExvb3AgdGhyb3VnaCBlbGVtZW50c1xuXHRcdHZhciBpID0gMDtcblx0XHR2YXIgZWxzTGVuID0gbW9kdWxlRWxzLmxlbmd0aDtcblxuXHRcdGZvciAoOyBpIDwgZWxzTGVuOyBpKyspIHtcblxuXHRcdFx0Ly8gQ3VycmVudCBlbGVtZW50XG5cdFx0XHRsZXQgZWwgPSBtb2R1bGVFbHNbaV07XG5cblx0XHRcdC8vIEFsbCBkYXRhLSBhdHRyaWJ1dGVzIGNvbnNpZGVyZWQgYXMgb3B0aW9uc1xuXHRcdFx0bGV0IG9wdGlvbnMgPSB0aGlzLmdldEVsZW1EYXRhKGVsKTtcblxuXHRcdFx0Ly8gQWRkIGN1cnJlbnQgRE9NIGVsZW1lbnQgYW5kIGpRdWVyeSBlbGVtZW50XG5cdFx0XHRvcHRpb25zLmVsID0gZWw7XG5cdFx0XHRvcHRpb25zLiRlbCA9ICQoZWwpO1xuXG5cdFx0XHQvLyBNb2R1bGUgZG9lcyBleGlzdCBhdCB0aGlzIHBvaW50XG5cdFx0XHRsZXQgYXR0ciA9IG9wdGlvbnMubW9kdWxlO1xuXG5cdFx0XHQvLyBTcGxpdHRpbmcgbW9kdWxlcyBmb3VuZCBpbiB0aGUgZGF0YS1hdHRyaWJ1dGVcblx0XHRcdGxldCBtb2R1bGVJZGVudHMgPSBhdHRyLnJlcGxhY2UoL1xccy9nLCAnJykuc3BsaXQoJywnKTtcblxuXHRcdFx0Ly8gTG9vcCBtb2R1bGVzXG5cdFx0XHRsZXQgaiA9IDA7XG5cdFx0XHRsZXQgbW9kdWxlc0xlbiA9IG1vZHVsZUlkZW50cy5sZW5ndGg7XG5cblx0XHRcdGZvciAoOyBqIDwgbW9kdWxlc0xlbjsgaisrKSB7XG5cdFx0XHRcdGxldCBtb2R1bGVBdHRyID0gbW9kdWxlSWRlbnRzW2pdO1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgdGhpcy5tb2R1bGVzW21vZHVsZUF0dHJdID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0bGV0IG1vZHVsZSA9IG5ldyB0aGlzLm1vZHVsZXNbbW9kdWxlQXR0cl0ob3B0aW9ucyk7XG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50TW9kdWxlcy5wdXNoKG1vZHVsZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgZWxlbWVudCBkYXRhIGF0dHJpYnV0ZXNcblx0ICogQHBhcmFtICAge0RPTUVsZW1lbnR9ICBlbFxuXHQgKiBAcmV0dXJuICB7QXJyYXl9ICAgICAgIGRhdGFcblx0ICovXG5cdGdldEVsZW1EYXRhKGVsKSB7XG5cdFx0Ly8gQWxsIGF0dHJpYnV0ZXNcblx0XHR2YXIgYXR0cmlidXRlcyA9IGVsLmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBSZWdleCBQYXR0ZXJuXG5cdFx0dmFyIHBhdHRlcm4gPSAvXmRhdGFcXC0oLispJC87XG5cblx0XHQvLyBPdXRwdXRcblx0XHR2YXIgZGF0YSA9IHt9O1xuXG5cdFx0Zm9yIChsZXQgaSBpbiBhdHRyaWJ1dGVzKSB7XG5cdFx0XHQvLyBBdHRyaWJ1dGVzIG5hbWUgKGV4OiBkYXRhLW1vZHVsZSlcblx0XHRcdGxldCBuYW1lID0gYXR0cmlidXRlc1tpXS5uYW1lO1xuXG5cdFx0XHQvLyBUaGlzIGhhcHBlbnMuXG5cdFx0XHRpZiAoIW5hbWUpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBtYXRjaCA9IG5hbWUubWF0Y2gocGF0dGVybik7XG5cdFx0XHRpZiAoIW1hdGNoKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIHRocm93cyBhbiBlcnJvciwgeW91IGhhdmUgc29tZVxuXHRcdFx0Ly8gc2VyaW91cyBwcm9ibGVtcyBpbiB5b3VyIEhUTUwuXG5cdFx0XHRkYXRhW21hdGNoWzFdXSA9IGVsLmdldEF0dHJpYnV0ZShuYW1lKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplIGFwcCBhZnRlciBkb2N1bWVudCByZWFkeVxuXHQgKi9cblx0aW5pdCgpIHtcblx0XHR0aGlzLmluaXRHbG9iYWxzKCkuaW5pdE1vZHVsZXMoKTtcblx0fVxufVxuXG4kKGZ1bmN0aW9uKCkge1xuXHR3aW5kb3cuYXBwID0gbmV3IEFwcCgpO1xuXHR3aW5kb3cuYXBwLmluaXQoKTtcbn0pO1xuIiwiLyoganNoaW50IGVzbmV4dDogdHJ1ZSAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cdHN2ZzRldmVyeWJvZHkoKTtcbn1cbiIsIi8qIGpzaGludCBlc25leHQ6IHRydWUgKi9cbmV4cG9ydCB7ZGVmYXVsdCBhcyBCdXR0b259IGZyb20gJy4vbW9kdWxlcy9CdXR0b24nO1xuZXhwb3J0IHtkZWZhdWx0IGFzIFRpdGxlfSBmcm9tICcuL21vZHVsZXMvVGl0bGUnO1xuIiwiLyoganNoaW50IGVzbmV4dDogdHJ1ZSAqL1xuaW1wb3J0IHsgJGRvY3VtZW50LCAkd2luZG93LCAkaHRtbCwgJGJvZHkgfSBmcm9tICcuLi91dGlscy9lbnZpcm9ubWVudCc7XG5cbi8qKlxuICogQWJzdHJhY3QgbW9kdWxlXG4gKiBHaXZlcyBhY2Nlc3MgdG8gZ2VuZXJpYyBqUXVlcnkgbm9kZXNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0dGhpcy4kZG9jdW1lbnQgPSAkZG9jdW1lbnQ7XG5cdFx0dGhpcy4kd2luZG93ID0gJHdpbmRvdztcblx0XHR0aGlzLiRodG1sID0gJGh0bWw7XG5cdFx0dGhpcy4kYm9keSA9ICRib2R5O1xuXHRcdHRoaXMuJGVsID0gb3B0aW9ucy4kZWw7XG5cdH1cbn1cbiIsIi8qIGpzaGludCBlc25leHQ6IHRydWUgKi9cbmltcG9ydCBBYnN0cmFjdE1vZHVsZSBmcm9tICcuL0Fic3RyYWN0TW9kdWxlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHRzdXBlcihvcHRpb25zKTtcblxuXHRcdHRoaXMuJGVsLm9uKCdjbGljay5CdXR0b24nLCAoZXZlbnQpID0+IHtcblx0XHRcdHRoaXMuJGRvY3VtZW50LnRyaWdnZXIoJ1RpdGxlLmNoYW5nZUxhYmVsJywgWyQoZXZlbnQuY3VycmVudFRhcmdldCkudmFsKCldKTtcblx0XHR9KTtcblx0fVxuXG5cdGRlc3Ryb3koKSB7XG5cdFx0dGhpcy4kZWwub2ZmKCcuQnV0dG9uJyk7XG5cdH1cbn1cbiIsIi8qIGpzaGludCBlc25leHQ6IHRydWUgKi9cbmltcG9ydCB7IHZpc2liaWxpdHlBcGkgfSBmcm9tICcuLi91dGlscy92aXNpYmlsaXR5JztcbmltcG9ydCBBYnN0cmFjdE1vZHVsZSBmcm9tICcuL0Fic3RyYWN0TW9kdWxlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHRzdXBlcihvcHRpb25zKTtcblxuXHRcdHRoaXMuJGxhYmVsID0gdGhpcy4kZWwuZmluZCgnLmpzLWxhYmVsJyk7XG5cblx0XHR0aGlzLiRkb2N1bWVudC5vbignVGl0bGUuY2hhbmdlTGFiZWwnLCAoZXZlbnQsIHZhbHVlKSA9PiB7XG5cdFx0XHR0aGlzLmNoYW5nZUxhYmVsKHZhbHVlKTtcblx0XHRcdHRoaXMuZGVzdHJveSgpO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5oaWRkZW5DYWxsYmFja0lkZW50ID0gdmlzaWJpbGl0eUFwaSh7XG5cdFx0XHRhY3Rpb246ICdhZGRDYWxsYmFjaycsXG5cdFx0XHRzdGF0ZTogJ2hpZGRlbicsXG5cdFx0XHRjYWxsYmFjazogdGhpcy5sb2dIaWRkZW5cblx0XHR9KTtcblxuXHRcdHRoaXMudmlzaWJsZUNhbGxiYWNrSWRlbnQgPSB2aXNpYmlsaXR5QXBpKHtcblx0XHRcdGFjdGlvbjogJ2FkZENhbGxiYWNrJyxcblx0XHRcdHN0YXRlOiAndmlzaWJsZScsXG5cdFx0XHRjYWxsYmFjazogdGhpcy5sb2dWaXNpYmxlXG5cdFx0fSk7XG5cdH1cblxuXHRsb2dIaWRkZW4oKSB7XG5cdFx0Y29uc29sZS5sb2coJ1RpdGxlIGlzIGhpZGRlbicpO1xuXHR9XG5cblx0bG9nVmlzaWJsZSgpIHtcblx0XHRjb25zb2xlLmxvZygnVGl0bGUgaXMgdmlzaWJsZScpO1xuXHR9XG5cblx0Y2hhbmdlTGFiZWwodmFsdWUpIHtcblx0XHR0aGlzLiRsYWJlbC50ZXh0KHZhbHVlKTtcblx0fVxuXG5cdGRlc3Ryb3koKSB7XG5cdFx0dGhpcy4kZG9jdW1lbnQub2ZmKCdUaXRsZS5jaGFuZ2VMYWJlbCcpO1xuXG5cdFx0dmlzaWJpbGl0eUFwaSh7XG5cdFx0XHRhY3Rpb246ICdyZW1vdmVDYWxsYmFjaycsXG5cdFx0XHRzdGF0ZTogJ2hpZGRlbicsXG5cdFx0XHRpZGVudDogdGhpcy5oaWRkZW5DYWxsYmFja0lkZW50XG5cdFx0fSk7XG5cblx0XHR2aXNpYmlsaXR5QXBpKHtcblx0XHRcdGFjdGlvbjogJ3JlbW92ZUNhbGxiYWNrJyxcblx0XHRcdHN0YXRlOiAndmlzaWJsZScsXG5cdFx0XHRpZGVudDogdGhpcy52aXNpYmxlQ2FsbGJhY2tJZGVudFxuXHRcdH0pO1xuXG5cdFx0dGhpcy4kZWwub2ZmKCcuVGl0bGUnKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gJy4vaXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkVG9BcnJheSAoIGFycmF5LCB2YWx1ZSApIHtcblx0dmFyIGluZGV4ID0gYXJyYXkuaW5kZXhPZiggdmFsdWUgKTtcblxuXHRpZiAoIGluZGV4ID09PSAtMSApIHtcblx0XHRhcnJheS5wdXNoKCB2YWx1ZSApO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUNvbnRhaW5zICggYXJyYXksIHZhbHVlICkge1xuXHRmb3IgKCBsZXQgaSA9IDAsIGMgPSBhcnJheS5sZW5ndGg7IGkgPCBjOyBpKysgKSB7XG5cdFx0aWYgKCBhcnJheVtpXSA9PSB2YWx1ZSApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5Q29udGVudHNNYXRjaCAoIGEsIGIgKSB7XG5cdHZhciBpO1xuXG5cdGlmICggIWlzQXJyYXkoIGEgKSB8fCAhaXNBcnJheSggYiApICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggYS5sZW5ndGggIT09IGIubGVuZ3RoICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGkgPSBhLmxlbmd0aDtcblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0aWYgKCBhW2ldICE9PSBiW2ldICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlQXJyYXkgKCB4ICkge1xuXHRpZiAoIHR5cGVvZiB4ID09PSAnc3RyaW5nJyApIHtcblx0XHRyZXR1cm4gWyB4IF07XG5cdH1cblxuXHRpZiAoIHggPT09IHVuZGVmaW5lZCApIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblxuXHRyZXR1cm4geDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxhc3RJdGVtICggYXJyYXkgKSB7XG5cdHJldHVybiBhcnJheVsgYXJyYXkubGVuZ3RoIC0gMSBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRnJvbUFycmF5ICggYXJyYXksIG1lbWJlciApIHtcblx0aWYgKCAhYXJyYXkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgaW5kZXggPSBhcnJheS5pbmRleE9mKCBtZW1iZXIgKTtcblxuXHRpZiAoIGluZGV4ICE9PSAtMSApIHtcblx0XHRhcnJheS5zcGxpY2UoIGluZGV4LCAxICk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQXJyYXkgKCBhcnJheUxpa2UgKSB7XG5cdHZhciBhcnJheSA9IFtdLCBpID0gYXJyYXlMaWtlLmxlbmd0aDtcblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0YXJyYXlbaV0gPSBhcnJheUxpa2VbaV07XG5cdH1cblxuXHRyZXR1cm4gYXJyYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQnlLZXlWYWx1ZSggYXJyYXksIGtleSwgdmFsdWUgKSB7XG5cdHJldHVybiBhcnJheS5maWx0ZXIoZnVuY3Rpb24oIG9iaiApIHtcblx0XHRyZXR1cm4gb2JqW2tleV0gPT09IHZhbHVlO1xuXHR9KTtcbn1cbiIsImNvbnN0ICRkb2N1bWVudCA9ICQoZG9jdW1lbnQpO1xuY29uc3QgJHdpbmRvdyA9ICQod2luZG93KTtcbmNvbnN0ICRodG1sID0gJChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuY29uc3QgJGJvZHkgPSAkKGRvY3VtZW50LmJvZHkpO1xuXG5leHBvcnQgeyAkZG9jdW1lbnQsICR3aW5kb3csICRodG1sLCAkYm9keSB9O1xuIiwiLyoganNoaW50IGVzbmV4dDogdHJ1ZSAqL1xuaW1wb3J0IHN2ZyBmcm9tICcuLi9nbG9iYWwvc3ZnJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cdHN2ZygpO1xufVxuIiwidmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxcblx0YXJyYXlMaWtlUGF0dGVybiA9IC9eXFxbb2JqZWN0ICg/OkFycmF5fEZpbGVMaXN0KVxcXSQvO1xuXG4vLyB0aGFua3MsIGh0dHA6Ly9wZXJmZWN0aW9ua2lsbHMuY29tL2luc3RhbmNlb2YtY29uc2lkZXJlZC1oYXJtZnVsLW9yLWhvdy10by13cml0ZS1hLXJvYnVzdC1pc2FycmF5L1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkgKCB0aGluZyApIHtcblx0cmV0dXJuIHRvU3RyaW5nLmNhbGwoIHRoaW5nICkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5TGlrZSAoIG9iaiApIHtcblx0cmV0dXJuIGFycmF5TGlrZVBhdHRlcm4udGVzdCggdG9TdHJpbmcuY2FsbCggb2JqICkgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXF1YWwgKCBhLCBiICkge1xuXHRpZiAoIGEgPT09IG51bGwgJiYgYiA9PT0gbnVsbCApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmICggdHlwZW9mIGEgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBiID09PSAnb2JqZWN0JyApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4gYSA9PT0gYjtcbn1cblxuLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xODA4Mi92YWxpZGF0ZS1udW1iZXJzLWluLWphdmFzY3JpcHQtaXNudW1lcmljXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljICggdGhpbmcgKSB7XG5cdHJldHVybiAhaXNOYU4oIHBhcnNlRmxvYXQoIHRoaW5nICkgKSAmJiBpc0Zpbml0ZSggdGhpbmcgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0ICggdGhpbmcgKSB7XG5cdHJldHVybiAoIHRoaW5nICYmIHRvU3RyaW5nLmNhbGwoIHRoaW5nICkgPT09ICdbb2JqZWN0IE9iamVjdF0nICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKCB0aGluZyApIHtcblx0dmFyIGdldFR5cGUgPSB7fTtcblx0cmV0dXJuIHRoaW5nICYmIGdldFR5cGUudG9TdHJpbmcuY2FsbCh0aGluZykgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG4iLCIvKiBqc2hpbnQgZXNuZXh0OiB0cnVlICovXG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi9pcyc7XG5pbXBvcnQgeyBhcnJheUNvbnRhaW5zLCBmaW5kQnlLZXlWYWx1ZSwgcmVtb3ZlRnJvbUFycmF5IH0gZnJvbSAnLi9hcnJheSc7XG5pbXBvcnQgeyAkZG9jdW1lbnQsICR3aW5kb3csICRodG1sLCAkYm9keSB9IGZyb20gJy4vZW52aXJvbm1lbnQnO1xuXG5jb25zdCBDQUxMQkFDS1MgPSB7XG5cdGhpZGRlbjogW10sXG5cdHZpc2libGU6IFtdXG59O1xuXG5jb25zdCBBQ1RJT05TID0gW1xuXHQnYWRkQ2FsbGJhY2snLFxuXHQncmVtb3ZlQ2FsbGJhY2snXG5dO1xuXG5jb25zdCBTVEFURVMgPSBbXG5cdCd2aXNpYmxlJyxcblx0J2hpZGRlbidcbl07XG5cbmNvbnN0IFBSRUZJWCA9ICd2LSc7XG5cbmxldCBVVUlEID0gMDtcblxuLy8gTWFpbiBldmVudFxuJGRvY3VtZW50Lm9uKCd2aXNpYmlsaXR5Y2hhbmdlJywgZnVuY3Rpb24oZXZlbnQpIHtcblx0aWYgKGRvY3VtZW50LmhpZGRlbikge1xuXHRcdG9uRG9jdW1lbnRDaGFuZ2UoJ2hpZGRlbicpO1xuXHR9IGVsc2Uge1xuXHRcdG9uRG9jdW1lbnRDaGFuZ2UoJ3Zpc2libGUnKTtcblx0fVxufSk7XG5cbi8qKlxuICogQWRkIGEgY2FsbGJhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSAgIHN0YXRlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybiB7c3RyaW5nfSAgaWRlbnRcbiAqL1xuZnVuY3Rpb24gYWRkQ2FsbGJhY2sgKHN0YXRlLCBvcHRpb25zKSB7XG5cdGxldCBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2sgfHwgJyc7XG5cblx0aWYgKCFpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuXHRcdGNvbnNvbGUud2FybignQ2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24nKTtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRsZXQgaWRlbnQgPSBQUkVGSVggKyBVVUlEKys7XG5cblx0Q0FMTEJBQ0tTW3N0YXRlXS5wdXNoKHtcblx0XHRpZGVudDogaWRlbnQsXG5cdFx0Y2FsbGJhY2s6IGNhbGxiYWNrXG5cdH0pO1xuXG5cdHJldHVybiBpZGVudDtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYSBjYWxsYmFja1xuICogQHBhcmFtICB7c3RyaW5nfSAgIHN0YXRlICBWaXNpYmxlIG9yIGhpZGRlblxuICogQHBhcmFtICB7c3RyaW5nfSAgIGlkZW50ICBVbmlxdWUgaWRlbnRpZmllclxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgICBJZiBvcGVyYXRpb24gd2FzIGEgc3VjY2Vzc1xuICovXG5mdW5jdGlvbiByZW1vdmVDYWxsYmFjayAoc3RhdGUsIG9wdGlvbnMpIHtcblx0bGV0IGlkZW50ID0gb3B0aW9ucy5pZGVudCB8fCAnJztcblxuXHRpZiAodHlwZW9mKGlkZW50KSA9PT0gJ3VuZGVmaW5lZCcgfHwgaWRlbnQgPT09ICcnKSB7XG5cdFx0Y29uc29sZS53YXJuKCdOZWVkIGlkZW50IHRvIHJlbW92ZSBjYWxsYmFjaycpO1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGxldCBpbmRleCA9IGZpbmRCeUtleVZhbHVlKENBTExCQUNLU1tzdGF0ZV0sICdpZGVudCcsIGlkZW50KVswXTtcblxuXHQvLyBjb25zb2xlLmxvZyhpZGVudClcblx0Ly8gY29uc29sZS5sb2coQ0FMTEJBQ0tTW3N0YXRlXSlcblxuXHRpZiAodHlwZW9mKGluZGV4KSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRyZW1vdmVGcm9tQXJyYXkoQ0FMTEJBQ0tTW3N0YXRlXSwgaW5kZXgpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnNvbGUud2FybignQ2FsbGJhY2sgY291bGQgbm90IGJlIGZvdW5kJyk7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbi8qKlxuICogV2hlbiBkb2N1bWVudCBzdGF0ZSBjaGFuZ2VzLCB0cmlnZ2VyIGNhbGxiYWNrc1xuICogQHBhcmFtICB7c3RyaW5nfSAgc3RhdGUgIFZpc2libGUgb3IgaGlkZGVuXG4gKi9cbmZ1bmN0aW9uIG9uRG9jdW1lbnRDaGFuZ2UgKHN0YXRlKSB7XG5cdGxldCBjYWxsYmFja0FycmF5ID0gQ0FMTEJBQ0tTW3N0YXRlXTtcblx0bGV0IGkgPSAwO1xuXHRsZXQgbGVuID0gY2FsbGJhY2tBcnJheS5sZW5ndGg7XG5cblx0Zm9yICg7IGkgPCBsZW47IGkrKykge1xuXHRcdGNhbGxiYWNrQXJyYXlbaV0uY2FsbGJhY2soKTtcblx0fVxufVxuXG4vKipcbiAqIFB1YmxpYyBmYWNpbmcgQVBJIGZvciBhZGRpbmcgYW5kIHJlbW92aW5nIGNhbGxiYWNrc1xuICogQHBhcmFtICAge29iamVjdH0gICAgICAgICAgIG9wdGlvbnMgIE9wdGlvbnNcbiAqIEByZXR1cm4gIHtib29sZWFufGludGVnZXJ9ICAgICAgICAgICBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNhbGxiYWNrIG9yIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzIG9yIGZhaWx1cmVcbiAqL1xuZnVuY3Rpb24gdmlzaWJpbGl0eUFwaSAob3B0aW9ucykge1xuXHRsZXQgYWN0aW9uID0gb3B0aW9ucy5hY3Rpb24gfHwgJyc7XG5cdGxldCBzdGF0ZSA9IG9wdGlvbnMuc3RhdGUgfHwgJyc7XG5cdGxldCByZXQ7XG5cblx0Ly8gVHlwZSBhbmQgdmFsdWUgY2hlY2tpbmdcblx0aWYgKCFhcnJheUNvbnRhaW5zKEFDVElPTlMsIGFjdGlvbikpIHtcblx0XHRjb25zb2xlLndhcm4oJ0FjdGlvbiBkb2VzIG5vdCBleGlzdCcpO1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoIWFycmF5Q29udGFpbnMoU1RBVEVTLCBzdGF0ZSkpIHtcblx0XHRjb25zb2xlLndhcm4oJ1N0YXRlIGRvZXMgbm90IGV4aXN0Jyk7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gQHRvZG8gTWFnaWMgY2FsbCBmdW5jdGlvbiBwbHNcblx0aWYgKGFjdGlvbiA9PT0gJ2FkZENhbGxiYWNrJykge1xuXHRcdHJldCA9IGFkZENhbGxiYWNrKHN0YXRlLCBvcHRpb25zKTtcblx0fSBlbHNlIGlmIChhY3Rpb24gPT09ICdyZW1vdmVDYWxsYmFjaycpIHtcblx0XHRyZXQgPSByZW1vdmVDYWxsYmFjayhzdGF0ZSwgb3B0aW9ucyk7XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufVxuXG5leHBvcnQgeyB2aXNpYmlsaXR5QXBpIH07XG4iXX0= diff --git a/www/index.html b/www/index.html index 17c5fa0..409dc7c 100644 --- a/www/index.html +++ b/www/index.html @@ -20,7 +20,7 @@

Locomotive boilerplate

- +