403Webshell
Server IP : 85.158.181.41  /  Your IP : 216.73.217.12
Web Server : Apache
System : Linux cloud9-vm129 6.1.178+1-ph #ph SMP PREEMPT_DYNAMIC Wed Jul 29 09:00:54 UTC 2026 x86_64
User : moncbefd ( 1024)
PHP Version : 7.3.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/moncbefd/www.moneta.at/themes/Honeygrid/javascripts/system/widgets/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/moncbefd/www.moneta.at/themes/Honeygrid/javascripts/system/widgets/input_number.js
'use strict';

/* --------------------------------------------------------------
 input_number.js 2019-07-03
 Gambio GmbH
 http://www.gambio.de
 Copyright (c) 2019 Gambio GmbH
 Released under the GNU General Public License (Version 2)
 [http://www.gnu.org/licenses/gpl-2.0.html]
 --------------------------------------------------------------
 */

/**
 * Widget to add + and - buttons to an input field
 */
gambio.widgets.module('input_number', [], function (data) {

    'use strict';

    // ########## VARIABLE INITIALIZATION ##########

    var $this = $(this),
        separator = null,
        regex = null,
        quantityCheckDelay = 300,
        quantityCheckTimeout = null,
        defaults = {
        // Set the type of the number field. Can be "int" or "float"
        type: 'float',
        // Digits after the locale separator (. or ,)
        digits: 4,
        // Show digits if the are zero
        forceDigits: false,
        // Stepping of the numbers
        stepping: 1,
        // Minimum value of the input field
        min: 0,
        // Maximum value of the input field
        max: null,
        // Set the locale separator (e.g.: . or ,) or set it to "auto" for auto-detection
        separator: 'auto',
        // Initial delay after the mousedown event method gets called again
        delay: 500,
        // Minimum delay that is used for repeating the mousedown event method
        minDelay: 50
    },
        options = $.extend(true, {}, defaults, data),
        module = {};

    // ########## HELPER FUNCTIONS ##########

    /**
     * Helper function that tries to detect the local
     * digits separator
     * @return     {string}        Returns the separator as a string
     * @private
     */
    var _getSeparator = function _getSeparator() {

        if (!options.separator || options.separator === 'auto') {
            var number = 1.1;
            options.separator = number.toLocaleString().substring(1, 2);
            return options.separator;
        }

        return options.separator;
    };

    /**
     * Function to calculate the new value of the input field
     * @param       {object}    e       jQuery event object that gets passed from the event listener below
     * @private
     */
    var _update = function _update(e) {
        var $target = e.data.target,
            type = e.data.type,
            dataset = e.data.dataset,
            value = $target.val(),
            normalized = options.separator === '.' ? value : value.replace(regex, '.'),
            number = dataset.type === 'int' ? parseInt(normalized, 10) : parseFloat(normalized),
            exponent = Math.pow(10, dataset.digits);

        // Check if the value inside the input field is a number
        if (isNaN(number)) {
            jse.core.debug.info('[NUMBERINPUT] Input is not a number');
            return;
        }

        // Add / substract the stepping value to the value inside the input field
        // If the value gets outside the boundaries set the value to the edge case
        if (type === 'plus') {
            number += dataset.stepping;
        } else {
            number -= dataset.stepping;
        }

        //Check the boundaries given
        number = typeof dataset.max === 'number' ? Math.min(number, dataset.max) : number;
        number = typeof dataset.min === 'number' ? Math.max(number, dataset.min) : number;

        // Round the value to the given digits count
        number = parseInt(Math.round(number * exponent), 10) / exponent;

        // Generate output string
        number = number.toString();

        // Add tailing zeros to get the defined number of digits
        if (dataset.forceDigits) {
            var separatorIndex = number.indexOf('.'),
                digits = null;

            if (separatorIndex === -1) {
                number = number + '.';
                separatorIndex = number.indexOf('.');
            }

            digits = number.length - separatorIndex - 1;

            while (digits < dataset.digits) {
                number += '0';
                digits += 1;
            }
        }

        if ($target.attr('type') !== 'number') {
            // Set the value to the input field in the correct locale
            number = number.replace('.', separator);
        }

        $target.val(number).trigger('keyup', []);

        _quantityCheck($target);
    };

    /**
     * Function to trigger the quantity check
     * @param {object} $target jQuery selector for the input field
     * @private
     */
    var _quantityCheck = function _quantityCheck($target) {
        quantityCheckTimeout = quantityCheckTimeout ? clearTimeout(quantityCheckTimeout) : null;
        quantityCheckTimeout = setTimeout(function () {
            // blur event of input field triggers the CheckStatus request sent in cart_handler widget
            $target.trigger('blur', []);
        }, quantityCheckDelay);
    };

    // ########## EVENT HANDLER ##########

    /**
     * Event handler for the mousedown event. On mousedown
     * on the buttons, the update function gets called after
     * a given delay (that gets shorter after time) as long as
     * no mouseup event is detected
     * @param       {object}    e       jQuery event object
     * @private
     *
     * @todo: search for proper solution to detect a touchend event on integrated android browsers
     */
    var _mouseDown = function _mouseDown(e) {

        e.preventDefault();

        var $target = e.data.target,
            dataset = $target.data(),
            timer = dataset.timer || null,
            delay = Math.max(dataset.delay || e.data.dataset.delay, e.data.dataset.minDelay);

        if (timer) {
            clearTimeout(timer);
        }

        timer = setTimeout(function () {
            _mouseDown(e);
        }, delay);

        $target.data({ delay: delay / 1.5, timer: timer });
        _update(e);
    };

    /**
     * Event handler for the mouseup (and mouseleave) event.
     * If triggered, the timer that gets started in the mouseDown
     * handler gets stopped and all values wil be reseted to the
     * initial state
     *
     * @param       {object}        e       jQuery event object
     * @private
     *
     * @todo: search for proper solution to detect a touchend event on integrated android browsers
     */
    var _mouseUp = function _mouseUp(e) {

        e.preventDefault();

        var $target = e.data ? e.data.target : null,
            dataset = $target !== null ? $target.data() : {},
            timer = dataset.timer;

        if (timer) {
            clearTimeout(timer);
            $target.data('delay', e.data.dataset.delay);
        }
    };

    // ########## INITIALIZATION ##########

    /**
     * Init function of the widget
     * @constructor
     */
    module.init = function (done) {

        separator = _getSeparator();
        regex = new RegExp(separator, 'g');

        $this.find('.input-number').each(function () {
            var $self = $(this),
                $input = $self.find('input'),
                dataset = $.extend({}, options, $self.data());

            $self.on('mousedown touchstart', '.btn-plus', {
                dataset: dataset,
                type: 'plus',
                target: $input
            }, _mouseDown).on('mouseup mouseleave touchend', '.btn-plus', {
                dataset: dataset,
                type: 'plus',
                target: $input
            }, _mouseUp).on('mousedown touchstart', '.btn-minus', {
                dataset: dataset,
                type: 'minus',
                target: $input
            }, _mouseDown).on('mouseup mouseleave touchend', '.btn-minus', {
                dataset: dataset,
                type: 'minus',
                target: $input
            }, _mouseUp);
        });

        done();
    };

    // Return data to widget engine
    return module;
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndpZGdldHMvaW5wdXRfbnVtYmVyLmpzIl0sIm5hbWVzIjpbImdhbWJpbyIsIndpZGdldHMiLCJtb2R1bGUiLCJkYXRhIiwiJHRoaXMiLCIkIiwic2VwYXJhdG9yIiwicmVnZXgiLCJxdWFudGl0eUNoZWNrRGVsYXkiLCJxdWFudGl0eUNoZWNrVGltZW91dCIsImRlZmF1bHRzIiwidHlwZSIsImRpZ2l0cyIsImZvcmNlRGlnaXRzIiwic3RlcHBpbmciLCJtaW4iLCJtYXgiLCJkZWxheSIsIm1pbkRlbGF5Iiwib3B0aW9ucyIsImV4dGVuZCIsIl9nZXRTZXBhcmF0b3IiLCJudW1iZXIiLCJ0b0xvY2FsZVN0cmluZyIsInN1YnN0cmluZyIsIl91cGRhdGUiLCJlIiwiJHRhcmdldCIsInRhcmdldCIsImRhdGFzZXQiLCJ2YWx1ZSIsInZhbCIsIm5vcm1hbGl6ZWQiLCJyZXBsYWNlIiwicGFyc2VJbnQiLCJwYXJzZUZsb2F0IiwiZXhwb25lbnQiLCJNYXRoIiwicG93IiwiaXNOYU4iLCJqc2UiLCJjb3JlIiwiZGVidWciLCJpbmZvIiwicm91bmQiLCJ0b1N0cmluZyIsInNlcGFyYXRvckluZGV4IiwiaW5kZXhPZiIsImxlbmd0aCIsImF0dHIiLCJ0cmlnZ2VyIiwiX3F1YW50aXR5Q2hlY2siLCJjbGVhclRpbWVvdXQiLCJzZXRUaW1lb3V0IiwiX21vdXNlRG93biIsInByZXZlbnREZWZhdWx0IiwidGltZXIiLCJfbW91c2VVcCIsImluaXQiLCJkb25lIiwiUmVnRXhwIiwiZmluZCIsImVhY2giLCIkc2VsZiIsIiRpbnB1dCIsIm9uIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7Ozs7Ozs7O0FBVUE7OztBQUdBQSxPQUFPQyxPQUFQLENBQWVDLE1BQWYsQ0FBc0IsY0FBdEIsRUFBc0MsRUFBdEMsRUFBMEMsVUFBVUMsSUFBVixFQUFnQjs7QUFFdEQ7O0FBRUo7O0FBRUksUUFBSUMsUUFBUUMsRUFBRSxJQUFGLENBQVo7QUFBQSxRQUNJQyxZQUFZLElBRGhCO0FBQUEs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RUFGLGNBQ0t5RCxJQURMLENBQ1UsZUFEVixFQUVLQyxJQUZMLENBRVUsWUFBWTtBQUNkLGdCQUFJQyxRQUFRMUQsRUFBRSxJQUFGLENBQVo7QUFBQSxnQkFDSTJELFNBQVNELE1BQU1GLElBQU4sQ0FBVyxPQUFYLENBRGI7QUFBQSxnQkFFSWhDLFVBQVV4QixFQUFFZSxNQUFGLENBQVMsRUFBVCxFQUFhRCxPQUFiLEVBQXNCNEMsTUFBTTVELElBQU4sRUFBdEIsQ0FGZDs7QUFJQTRELGtCQUNLRSxFQURMLENBQ1Esc0JBRFIsRUFDZ0MsV0FEaEMsRUFDNkM7QUFDckNwQyx5QkFBU0EsT0FENEI7QUFFckNsQixzQkFBTSxNQUYrQjtBQUdyQ2lCLHdCQUFRb0M7QUFINkIsYUFEN0MsRUFLT1YsVUFMUCxFQU1LVyxFQU5MLENBTVEsNkJBTlIsRUFNdUMsV0FOdkMsRUFNb0Q7QUFDNUNwQyx5QkFBU0EsT0FEbUM7QUFFNUNsQixzQkFBTSxNQUZzQztBQUc1Q2lCLHdCQUFRb0M7QUFIb0MsYUFOcEQsRUFVT1AsUUFWUCxFQVdLUSxFQVhMLENBV1Esc0JBWFIsRUFXZ0MsWUFYaEMsRUFXOEM7QUFDdENwQyx5QkFBU0EsT0FENkI7QUFFdENsQixzQkFBTSxPQUZnQztBQUd0Q2lCLHdCQUFRb0M7QUFIOEIsYUFYOUMsRUFlT1YsVUFmUCxFQWdCS1csRUFoQkwsQ0FnQlEsNkJBaEJSLEVBZ0J1QyxZQWhCdkMsRUFnQnFEO0FBQzdDcEMseUJBQVNBLE9BRG9DO0FBRTdDbEIsc0JBQU0sT0FGdUM7QUFHN0NpQix3QkFBUW9DO0FBSHFDLGFBaEJyRCxFQW9CT1AsUUFwQlA7QUFxQkgsU0E1Qkw7O0FBOEJBRTtBQUNILEtBcENEOztBQXNDQTtBQUNBLFdBQU96RCxNQUFQO0FBQ0gsQ0FoUEQiLCJmaWxlIjoid2lkZ2V0cy9pbnB1dF9udW1iZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIGlucHV0X251bWJlci5qcyAyMDE5LTA3LTAzXG4gR2FtYmlvIEdtYkhcbiBodHRwOi8vd3d3LmdhbWJpby5kZVxuIENvcHlyaWdodCAoYykgMjAxOSBHYW1iaW8gR21iSFxuIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKVxuIFtodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sXVxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuLyoqXG4gKiBXaWRnZXQgdG8gYWRkICsgYW5kIC0gYnV0dG9ucyB0byBhbiBpbnB1dCBmaWVsZFxuICovXG5nYW1iaW8ud2lkZ2V0cy5tb2R1bGUoJ2lucHV0X251bWJlcicsIFtdLCBmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4vLyAjIyMjIyMjIyMjIFZBUklBQkxFIElOSVRJQUxJWkFUSU9OICMjIyMjIyMjIyNcblxuICAgIHZhciAkdGhpcyA9ICQodGhpcyksXG4gICAgICAgIHNlcGFyYXRvciA9IG51bGwsXG4gICAgICAgIHJlZ2V4ID0gbnVsbCxcbiAgICAgICAgcXVhbnRpdHlDaGVja0RlbGF5ID0gMzAwLFxuICAgICAgICBxdWFudGl0eUNoZWNrVGltZW91dCA9IG51bGwsXG4gICAgICAgIGRlZmF1bHRzID0ge1xuICAgICAgICAgICAgLy8gU2V0IHRoZSB0eXBlIG9mIHRoZSBudW1iZXIgZmllbGQuIENhbiBiZSBcImludFwiIG9yIFwiZmxvYXRcIlxuICAgICAgICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgICAgICAgIC8vIERpZ2l0cyBhZnRlciB0aGUgbG9jYWxlIHNlcGFyYXRvciAoLiBvciAsKVxuICAgICAgICAgICAgZGlnaXRzOiA0LFxuICAgICAgICAgICAgLy8gU2hvdyBkaWdpdHMgaWYgdGhlIGFyZSB6ZXJvXG4gICAgICAgICAgICBmb3JjZURpZ2l0czogZmFsc2UsXG4gICAgICAgICAgICAvLyBTdGVwcGluZyBvZiB0aGUgbnVtYmVyc1xuICAgICAgICAgICAgc3RlcHBpbmc6IDEsXG4gICAgICAgICAgICAvLyBNaW5pbXVtIHZhbHVlIG9mIHRoZSBpbnB1dCBmaWVsZFxuICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICAgICAgLy8gTWF4aW11bSB2YWx1ZSBvZiB0aGUgaW5wdXQgZmllbGRcbiAgICAgICAgICAgIG1heDogbnVsbCxcbiAgICAgICAgICAgIC8vIFNldCB0aGUgbG9jYWxlIHNlcGFyYXRvciAoZS5nLjogLiBvciAsKSBvciBzZXQgaXQgdG8gXCJhdXRvXCIgZm9yIGF1dG8tZGV0ZWN0aW9uXG4gICAgICAgICAgICBzZXBhcmF0b3I6ICdhdXRvJyxcbiAgICAgICAgICAgIC8vIEluaXRpYWwgZGVsYXkgYWZ0ZXIgdGhlIG1vdXNlZG93biBldmVudCBtZXRob2QgZ2V0cyBjYWxsZWQgYWdhaW5cbiAgICAgICAgICAgIGRlbGF5OiA1MDAsXG4gICAgICAgICAgICAvLyBNaW5pbXVtIGRlbGF5IHRoYXQgaXMgdXNlZCBmb3IgcmVwZWF0aW5nIHRoZSBtb3VzZWRvd24gZXZlbnQgbWV0aG9kXG4gICAgICAgICAgICBtaW5EZWxheTogNTBcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBkZWZhdWx0cywgZGF0YSksXG4gICAgICAgIG1vZHVsZSA9IHt9O1xuXG5cbi8vICMjIyMjIyMjIyMgSEVMUEVSIEZVTkNUSU9OUyAjIyMjIyMjIyMjXG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCB0cmllcyB0byBkZXRlY3QgdGhlIGxvY2FsXG4gICAgICogZGlnaXRzIHNlcGFyYXRvclxuICAgICAqIEByZXR1cm4gICAgIHtzdHJpbmd9ICAgICAgICBSZXR1cm5zIHRoZSBzZXBhcmF0b3IgYXMgYSBzdHJpbmdcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHZhciBfZ2V0U2VwYXJhdG9yID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5zZXBhcmF0b3IgfHwgb3B0aW9ucy5zZXBhcmF0b3IgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgdmFyIG51bWJlciA9IDEuMTtcbiAgICAgICAgICAgIG9wdGlvbnMuc2VwYXJhdG9yID0gbnVtYmVyLnRvTG9jYWxlU3RyaW5nKCkuc3Vic3RyaW5nKDEsIDIpO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuc2VwYXJhdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuc2VwYXJhdG9yO1xuXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBpbnB1dCBmaWVsZFxuICAgICAqIEBwYXJhbSAgICAgICB7b2JqZWN0fSAgICBlICAgICAgIGpRdWVyeSBldmVudCBvYmplY3QgdGhhdCBnZXRzIHBhc3NlZCBmcm9tIHRoZSBldmVudCBsaXN0ZW5lciBiZWxvd1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdmFyIF91cGRhdGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgJHRhcmdldCA9IGUuZGF0YS50YXJnZXQsXG4gICAgICAgICAgICB0eXBlID0gZS5kYXRhLnR5cGUsXG4gICAgICAgICAgICBkYXRhc2V0ID0gZS5kYXRhLmRhdGFzZXQsXG4gICAgICAgICAgICB2YWx1ZSA9ICR0YXJnZXQudmFsKCksXG4gICAgICAgICAgICBub3JtYWxpemVkID0gKG9wdGlvbnMuc2VwYXJhdG9yID09PSAnLicpID8gdmFsdWUgOiB2YWx1ZS5yZXBsYWNlKHJlZ2V4LCAnLicpLFxuICAgICAgICAgICAgbnVtYmVyID0gKGRhdGFzZXQudHlwZSA9PT0gJ2ludCcpID8gcGFyc2VJbnQobm9ybWFsaXplZCwgMTApIDogcGFyc2VGbG9hdChub3JtYWxpemVkKSxcbiAgICAgICAgICAgIGV4cG9uZW50ID0gTWF0aC5wb3coMTAsIGRhdGFzZXQuZGlnaXRzKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaW5zaWRlIHRoZSBpbnB1dCBmaWVsZCBpcyBhIG51bWJlclxuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSkge1xuICAgICAgICAgICAganNlLmNvcmUuZGVidWcuaW5mbygnW05VTUJFUklOUFVUXSBJbnB1dCBpcyBub3QgYSBudW1iZXInKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCAvIHN1YnN0cmFjdCB0aGUgc3RlcHBpbmcgdmFsdWUgdG8gdGhlIHZhbHVlIGluc2lkZSB0aGUgaW5wdXQgZmllbGRcbiAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGdldHMgb3V0c2lkZSB0aGUgYm91bmRhcmllcyBzZXQgdGhlIHZhbHVlIHRvIHRoZSBlZGdlIGNhc2VcbiAgICAgICAgaWYgKHR5cGUgPT09ICdwbHVzJykge1xuICAgICAgICAgICAgbnVtYmVyICs9IGRhdGFzZXQuc3RlcHBpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBudW1iZXIgLT0gZGF0YXNldC5zdGVwcGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vQ2hlY2sgdGhlIGJvdW5kYXJpZXMgZ2l2ZW5cbiAgICAgICAgbnVtYmVyID0gKHR5cGVvZiBkYXRhc2V0Lm1heCA9PT0gJ251bWJlcicpID8gTWF0aC5taW4obnVtYmVyLCBkYXRhc2V0Lm1heCkgOiBudW1iZXI7XG4gICAgICAgIG51bWJlciA9ICh0eXBlb2YgZGF0YXNldC5taW4gPT09ICdudW1iZXInKSA/IE1hdGgubWF4KG51bWJlciwgZGF0YXNldC5taW4pIDogbnVtYmVyO1xuXG4gICAgICAgIC8vIFJvdW5kIHRoZSB2YWx1ZSB0byB0aGUgZ2l2ZW4gZGlnaXRzIGNvdW50XG4gICAgICAgIG51bWJlciA9IHBhcnNlSW50KE1hdGgucm91bmQobnVtYmVyICogZXhwb25lbnQpLCAxMCkgLyBleHBvbmVudDtcblxuICAgICAgICAvLyBHZW5lcmF0ZSBvdXRwdXQgc3RyaW5nXG4gICAgICAgIG51bWJlciA9IG51bWJlci50b1N0cmluZygpO1xuXG4gICAgICAgIC8vIEFkZCB0YWlsaW5nIHplcm9zIHRvIGdldCB0aGUgZGVmaW5lZCBudW1iZXIgb2YgZGlnaXRzXG4gICAgICAgIGlmIChkYXRhc2V0LmZvcmNlRGlnaXRzKSB7XG4gICAgICAgICAgICB2YXIgc2VwYXJhdG9ySW5kZXggPSBudW1iZXIuaW5kZXhPZignLicpLFxuICAgICAgICAgICAgICAgIGRpZ2l0cyA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChzZXBhcmF0b3JJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBudW1iZXIgKyAnLic7XG4gICAgICAgICAgICAgICAgc2VwYXJhdG9ySW5kZXggPSBudW1iZXIuaW5kZXhPZignLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkaWdpdHMgPSBudW1iZXIubGVuZ3RoIC0gc2VwYXJhdG9ySW5kZXggLSAxO1xuXG4gICAgICAgICAgICB3aGlsZSAoZGlnaXRzIDwgZGF0YXNldC5kaWdpdHMpIHtcbiAgICAgICAgICAgICAgICBudW1iZXIgKz0gJzAnO1xuICAgICAgICAgICAgICAgIGRpZ2l0cyArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoJHRhcmdldC5hdHRyKCd0eXBlJykgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAvLyBTZXQgdGhlIHZhbHVlIHRvIHRoZSBpbnB1dCBmaWVsZCBpbiB0aGUgY29ycmVjdCBsb2NhbGVcbiAgICAgICAgICAgIG51bWJlciA9IG51bWJlci5yZXBsYWNlKCcuJywgc2VwYXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgJHRhcmdldFxuICAgICAgICAgICAgLnZhbChudW1iZXIpXG4gICAgICAgICAgICAudHJpZ2dlcigna2V5dXAnLCBbXSk7XG5cbiAgICAgICAgX3F1YW50aXR5Q2hlY2soJHRhcmdldCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHRvIHRyaWdnZXIgdGhlIHF1YW50aXR5IGNoZWNrXG4gICAgICogQHBhcmFtIHtvYmplY3R9ICR0YXJnZXQgalF1ZXJ5IHNlbGVjdG9yIGZvciB0aGUgaW5wdXQgZmllbGRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHZhciBfcXVhbnRpdHlDaGVjayA9IGZ1bmN0aW9uICgkdGFyZ2V0KSB7XG4gICAgICAgIHF1YW50aXR5Q2hlY2tUaW1lb3V0ID0gcXVhbnRpdHlDaGVja1RpbWVvdXQgPyBjbGVhclRpbWVvdXQocXVhbnRpdHlDaGVja1RpbWVvdXQpIDogbnVsbDtcbiAgICAgICAgcXVhbnRpdHlDaGVja1RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGJsdXIgZXZlbnQgb2YgaW5wdXQgZmllbGQgdHJpZ2dlcnMgdGhlIENoZWNrU3RhdHVzIHJlcXVlc3Qgc2VudCBpbiBjYXJ0X2hhbmRsZXIgd2lkZ2V0XG4gICAgICAgICAgICAkdGFyZ2V0LnRyaWdnZXIoJ2JsdXInLCBbXSk7XG4gICAgICAgIH0sIHF1YW50aXR5Q2hlY2tEZWxheSk7XG4gICAgfTtcblxuLy8gIyMjIyMjIyMjIyBFVkVOVCBIQU5ETEVSICMjIyMjIyMjIyNcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIHRoZSBtb3VzZWRvd24gZXZlbnQuIE9uIG1vdXNlZG93blxuICAgICAqIG9uIHRoZSBidXR0b25zLCB0aGUgdXBkYXRlIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGFmdGVyXG4gICAgICogYSBnaXZlbiBkZWxheSAodGhhdCBnZXRzIHNob3J0ZXIgYWZ0ZXIgdGltZSkgYXMgbG9uZyBhc1xuICAgICAqIG5vIG1vdXNldXAgZXZlbnQgaXMgZGV0ZWN0ZWRcbiAgICAgKiBAcGFyYW0gICAgICAge29iamVjdH0gICAgZSAgICAgICBqUXVlcnkgZXZlbnQgb2JqZWN0XG4gICAgICogQHByaXZhdGVcbiAgICAgKlxuICAgICAqIEB0b2RvOiBzZWFyY2ggZm9yIHByb3BlciBzb2x1dGlvbiB0byBkZXRlY3QgYSB0b3VjaGVuZCBldmVudCBvbiBpbnRlZ3JhdGVkIGFuZHJvaWQgYnJvd3NlcnNcbiAgICAgKi9cbiAgICB2YXIgX21vdXNlRG93biA9IGZ1bmN0aW9uIChlKSB7XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHZhciAkdGFyZ2V0ID0gZS5kYXRhLnRhcmdldCxcbiAgICAgICAgICAgIGRhdGFzZXQgPSAkdGFyZ2V0LmRhdGEoKSxcbiAgICAgICAgICAgIHRpbWVyID0gZGF0YXNldC50aW1lciB8fCBudWxsLFxuICAgICAgICAgICAgZGVsYXkgPSBNYXRoLm1heChkYXRhc2V0LmRlbGF5IHx8IGUuZGF0YS5kYXRhc2V0LmRlbGF5LCBlLmRhdGEuZGF0YXNldC5taW5EZWxheSk7XG5cbiAgICAgICAgaWYgKHRpbWVyKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF9tb3VzZURvd24oZSk7XG4gICAgICAgIH0sIGRlbGF5KTtcblxuICAgICAgICAkdGFyZ2V0LmRhdGEoe2RlbGF5OiBkZWxheSAvIDEuNSwgdGltZXI6IHRpbWVyfSk7XG4gICAgICAgIF91cGRhdGUoZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXIgZm9yIHRoZSBtb3VzZXVwIChhbmQgbW91c2VsZWF2ZSkgZXZlbnQuXG4gICAgICogSWYgdHJpZ2dlcmVkLCB0aGUgdGltZXIgdGhhdCBnZXRzIHN0YXJ0ZWQgaW4gdGhlIG1vdXNlRG93blxuICAgICAqIGhhbmRsZXIgZ2V0cyBzdG9wcGVkIGFuZCBhbGwgdmFsdWVzIHdpbCBiZSByZXNldGVkIHRvIHRoZVxuICAgICAqIGluaXRpYWwgc3RhdGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAgICAgICB7b2JqZWN0fSAgICAgICAgZSAgICAgICBqUXVlcnkgZXZlbnQgb2JqZWN0XG4gICAgICogQHByaXZhdGVcbiAgICAgKlxuICAgICAqIEB0b2RvOiBzZWFyY2ggZm9yIHByb3BlciBzb2x1dGlvbiB0byBkZXRlY3QgYSB0b3VjaGVuZCBldmVudCBvbiBpbnRlZ3JhdGVkIGFuZHJvaWQgYnJvd3NlcnNcbiAgICAgKi9cbiAgICB2YXIgX21vdXNlVXAgPSBmdW5jdGlvbiAoZSkge1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB2YXIgJHRhcmdldCA9IGUuZGF0YSA/IGUuZGF0YS50YXJnZXQgOiBudWxsLFxuICAgICAgICAgICAgZGF0YXNldCA9ICgkdGFyZ2V0ICE9PSBudWxsKSA/ICR0YXJnZXQuZGF0YSgpIDoge30sXG4gICAgICAgICAgICB0aW1lciA9IGRhdGFzZXQudGltZXI7XG5cbiAgICAgICAgaWYgKHRpbWVyKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgJHRhcmdldC5kYXRhKCdkZWxheScsIGUuZGF0YS5kYXRhc2V0LmRlbGF5KTtcbiAgICAgICAgfVxuICAgIH07XG5cbi8vICMjIyMjIyMjIyMgSU5JVElBTElaQVRJT04gIyMjIyMjIyMjI1xuXG4gICAgLyoqXG4gICAgICogSW5pdCBmdW5jdGlvbiBvZiB0aGUgd2lkZ2V0XG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgbW9kdWxlLmluaXQgPSBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgIHNlcGFyYXRvciA9IF9nZXRTZXBhcmF0b3IoKTtcbiAgICAgICAgcmVnZXggPSBuZXcgUmVnRXhwKHNlcGFyYXRvciwgJ2cnKTtcblxuICAgICAgICAkdGhpc1xuICAgICAgICAgICAgLmZpbmQoJy5pbnB1dC1udW1iZXInKVxuICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciAkc2VsZiA9ICQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgICRpbnB1dCA9ICRzZWxmLmZpbmQoJ2lucHV0JyksXG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXQgPSAkLmV4dGVuZCh7fSwgb3B0aW9ucywgJHNlbGYuZGF0YSgpKTtcblxuICAgICAgICAgICAgICAgICRzZWxmXG4gICAgICAgICAgICAgICAgICAgIC5vbignbW91c2Vkb3duIHRvdWNoc3RhcnQnLCAnLmJ0bi1wbHVzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldDogZGF0YXNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwbHVzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogJGlucHV0XG4gICAgICAgICAgICAgICAgICAgIH0sIF9tb3VzZURvd24pXG4gICAgICAgICAgICAgICAgICAgIC5vbignbW91c2V1cCBtb3VzZWxlYXZlIHRvdWNoZW5kJywgJy5idG4tcGx1cycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXQ6IGRhdGFzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncGx1cycsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICRpbnB1dFxuICAgICAgICAgICAgICAgICAgICB9LCBfbW91c2VVcClcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdtb3VzZWRvd24gdG91Y2hzdGFydCcsICcuYnRuLW1pbnVzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldDogZGF0YXNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdtaW51cycsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICRpbnB1dFxuICAgICAgICAgICAgICAgICAgICB9LCBfbW91c2VEb3duKVxuICAgICAgICAgICAgICAgICAgICAub24oJ21vdXNldXAgbW91c2VsZWF2ZSB0b3VjaGVuZCcsICcuYnRuLW1pbnVzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldDogZGF0YXNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdtaW51cycsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICRpbnB1dFxuICAgICAgICAgICAgICAgICAgICB9LCBfbW91c2VVcCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBkb25lKCk7XG4gICAgfTtcblxuICAgIC8vIFJldHVybiBkYXRhIHRvIHdpZGdldCBlbmdpbmVcbiAgICByZXR1cm4gbW9kdWxlO1xufSk7Il19

Youez - 2016 - github.com/yon3zu
LinuXploit