all files / DEV/lib/helpers/ findElementStrategy.js

38.89% Statements 28/72
10.17% Branches 6/59
0% Functions 0/1
6.67% Lines 3/45
22 statements, 6 branches Ignored     
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137                                                                                                                                                                                                                                                                             
'use strict';
 
Object.defineProperty(exports, '__esModule', {
    value: true
});
 
var _utilsErrorHandler = require('../utils/ErrorHandler');
 
var DEFAULT_SELECTOR = 'css selector';
 
var findStrategy = function findStrategy() {
    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
        args[_key] = arguments[_key];
    }
 
    var value = args[0];
    var relative = args.length > 1 ? args[1] : false;
    var xpathPrefix = relative ? './' : '//';
 
    /**
     * set default selector
     */
    var using = DEFAULT_SELECTOR;
 
    if (typeof value !== 'string') {
        throw new _utilsErrorHandler.ProtocolError('selector needs to be typeof `string`');
    }

    if (args.length === 3) {
        return {
            using: args[0],
            value: args[1]
        };
    }
 
    // check value type
    // use id strategy if value starts with # and doesnt contain any other CSS selector-relevant character
    if (value.indexOf('#') === 0 && value.search(/(\s|>|\.|[|])/) === -1) {
        using = 'id';
        value = value.slice(1);

        // use xPath strategy if value starts with //
    } else if (value.indexOf('/') === 0 || value.indexOf('(') === 0 || value.indexOf('../') === 0 || value.indexOf('./') === 0 || value.indexOf('*/') === 0) {
            using = 'xpath';

            // use link text startegy if value startes with =
        } else if (value.indexOf('=') === 0) {
                using = 'link text';
                value = value.slice(1);

                // use partial link text startegy if value startes with *=
            } else if (value.indexOf('*=') === 0) {
                    using = 'partial link text';
                    value = value.slice(2);

                    // recursive element search using the UiAutomator library (Android only)
                } else if (value.indexOf('android=') === 0) {
                        using = '-android uiautomator';
                        value = value.slice(8);

                        // recursive element search using the UIAutomation library (iOS-only)
                    } else if (value.indexOf('ios=') === 0) {
                            using = '-ios uiautomation';
                            value = value.slice(4);

                            // recursive element search using accessibility id
                        } else if (value.indexOf('~') === 0) {
                                using = 'accessibility id';
                                value = value.slice(1);
 
                                // use tag name strategy if value contains a tag
                                // e.g. "<div>" or "<div />"
                            } else if (value.search(/<[a-zA-Z\-]+( \/)*>/g) >= 0) {
                                    using = 'tag name';
                                    value = value.replace(/<|>|\/|\s/g, '');

                                    // use name strategy if value queries elements with name attributes
                                    // e.g. "[name='myName']" or '[name="myName"]'
                                } else if (value.search(/^\[name=("|')([a-zA-z0-9\-_ ]+)("|')\]$/) >= 0) {
                                        using = 'name';
                                        value = value.match(/^\[name=("|')([a-zA-z0-9\-_ ]+)("|')\]$/)[2];
 
                                        // any element with given text e.g. h1=Welcome
                                    } else if (value.search(/^[a-z0-9]*=(.)+$/) >= 0) {
                                            var query = value.split(/=/);
                                            var tag = query.shift();
 
                                            using = 'xpath';
                                            value = '' + xpathPrefix + (tag.length ? tag : '*') + '[normalize-space() = "' + query.join('=') + '"]';
 
                                            // any element containing given text
                                        } else if (value.search(/^[a-z0-9]*\*=(.)+$/) >= 0) {
                                                var query = value.split(/\*=/);
                                                var tag = query.shift();
 
                                                using = 'xpath';
                                                value = '' + xpathPrefix + (tag.length ? tag : '*') + '[contains(., "' + query.join('*=') + '")]';
 
                                                // any element with certian class or id + given content
                                            } else if (value.search(/^[a-z0-9]*(\.|#)-?[_a-zA-Z]+[_a-zA-Z0-9-]*=(.)+$/) >= 0) {
                                                    var query = value.split(/=/);
                                                    var tag = query.shift();
 
                                                    var classOrId = tag.substr(tag.search(/(\.|#)/), 1) === '#' ? 'id' : 'class';
                                                    var classOrIdName = tag.slice(tag.search(/(\.|#)/) + 1);
 
                                                    tag = tag.substr(0, tag.search(/(\.|#)/));
                                                    using = 'xpath';
                                                    value = '' + xpathPrefix + (tag.length ? tag : '*') + '[contains(@' + classOrId + ', "' + classOrIdName + '") and normalize-space() = "' + query.join('=') + '"]';
 
                                                    // any element with certian class or id + has certain content
                                                } else if (value.search(/^[a-z0-9]*(\.|#)-?[_a-zA-Z]+[_a-zA-Z0-9-]*\*=(.)+$/) >= 0) {
                                                        var query = value.split(/\*=/);
                                                        var tag = query.shift();
 
                                                        var classOrId = tag.substr(tag.search(/(\.|#)/), 1) === '#' ? 'id' : 'class';
                                                        var classOrIdName = tag.slice(tag.search(/(\.|#)/) + 1);

                                                        tag = tag.substr(0, tag.search(/(\.|#)/));
                                                        using = 'xpath';
                                                        value = xpathPrefix + (tag.length ? tag : '*') + '[contains(@' + classOrId + ', "' + classOrIdName + '") and contains(., "' + query.join('*=') + '")]';
                                                        value = '' + xpathPrefix + (tag.length ? tag : '*') + '[contains(@' + classOrId + ', "' + classOrIdName + '") and contains(., "' + query.join('*=') + '")]';
 
                                                        // allow to move up to the parent or select current element
                                                    } else if (value === '..' || value === '.') {
                                                            using = 'xpath';
                                                        }
 
    return {
        using: using,
        value: value
    };
};
 
exports['default'] = findStrategy;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9jaHJpc3RpYW5icm9tYW5uL1NpdGVzL1dlYnByb2pla3RlL3dlYmRyaXZlcmpzL0RFVi9saWIvaGVscGVycy9maW5kRWxlbWVudFN0cmF0ZWd5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztpQ0FBOEIsdUJBQXVCOztBQUVyRCxJQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQTs7QUFFdkMsSUFBSSxZQUFZLEdBQUcsU0FBZixZQUFZLEdBQXNCO3NDQUFOLElBQUk7QUFBSixZQUFJOzs7QUFDaEMsUUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ25CLFFBQUksUUFBUSxHQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEFBQUMsQ0FBQTtBQUNsRCxRQUFJLFdBQVcsR0FBRyxRQUFRLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQTs7Ozs7QUFLeEMsUUFBSSxLQUFLLEdBQUcsZ0JBQWdCLENBQUE7O0FBRTVCLFFBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO0FBQzNCLGNBQU0scUNBQWtCLHNDQUFzQyxDQUFDLENBQUE7S0FDbEU7O0FBRUQsUUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUNuQixlQUFPO0FBQ0gsaUJBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2QsaUJBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ2pCLENBQUE7S0FDSjs7OztBQUlELFFBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUNsRSxhQUFLLEdBQUcsSUFBSSxDQUFBO0FBQ1osYUFBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7OztLQUd6QixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQ3BELEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUN2RCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNsQyxpQkFBSyxHQUFHLE9BQU8sQ0FBQTs7O1NBR2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNqQyxxQkFBSyxHQUFHLFdBQVcsQ0FBQTtBQUNuQixxQkFBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7OzthQUd6QixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDbEMseUJBQUssR0FBRyxtQkFBbUIsQ0FBQTtBQUMzQix5QkFBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7OztpQkFHekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3hDLDZCQUFLLEdBQUcsc0JBQXNCLENBQUE7QUFDOUIsNkJBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBOzs7cUJBR3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNwQyxpQ0FBSyxHQUFHLG1CQUFtQixDQUFBO0FBQzNCLGlDQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTs7O3lCQUd6QixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDakMscUNBQUssR0FBRyxrQkFBa0IsQ0FBQTtBQUMxQixxQ0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7Ozs7NkJBSXpCLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ2xELHlDQUFLLEdBQUcsVUFBVSxDQUFBO0FBQ2xCLHlDQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUE7Ozs7aUNBSTFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLHlDQUF5QyxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3JFLDZDQUFLLEdBQUcsTUFBTSxDQUFBO0FBQ2QsNkNBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7OztxQ0FHcEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDOUMsZ0RBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDNUIsZ0RBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQTs7QUFFdkIsaURBQUssR0FBRyxPQUFPLENBQUE7QUFDZixpREFBSyxRQUFNLFdBQVcsSUFBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUEsOEJBQXlCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQUksQ0FBQTs7O3lDQUc5RixNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNoRCxvREFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUM5QixvREFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFBOztBQUV2QixxREFBSyxHQUFHLE9BQU8sQ0FBQTtBQUNmLHFEQUFLLFFBQU0sV0FBVyxJQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQSxzQkFBaUIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBSyxDQUFBOzs7NkNBR3hGLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLGtEQUFrRCxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQzlFLHdEQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQzVCLHdEQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUE7O0FBRXZCLHdEQUFJLFNBQVMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLElBQUksR0FBRyxPQUFPLENBQUE7QUFDNUUsd0RBQUksYUFBYSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTs7QUFFdkQsdURBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDekMseURBQUssR0FBRyxPQUFPLENBQUE7QUFDZix5REFBSyxRQUFNLFdBQVcsSUFBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUEsbUJBQWMsU0FBUyxXQUFNLGFBQWEsb0NBQStCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQUksQ0FBQTs7O2lEQUc5SSxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxvREFBb0QsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNoRiw0REFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUM5Qiw0REFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFBOztBQUV2Qiw0REFBSSxTQUFTLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLEdBQUcsT0FBTyxDQUFBO0FBQzVFLDREQUFJLGFBQWEsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7O0FBRXZELDJEQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO0FBQ3pDLDZEQUFLLEdBQUcsT0FBTyxDQUFBO0FBQ2YsNkRBQUssR0FBRyxXQUFXLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBLEFBQUMsR0FBRyxhQUFhLEdBQUcsU0FBUyxHQUFHLEtBQUssR0FBRyxhQUFhLEdBQUcsc0JBQXNCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUE7QUFDdEosNkRBQUssUUFBTSxXQUFXLElBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBLG1CQUFjLFNBQVMsV0FBTSxhQUFhLDRCQUF1QixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFLLENBQUE7OztxREFHeEksTUFBTSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEdBQUcsRUFBRTtBQUN4QyxpRUFBSyxHQUFHLE9BQU8sQ0FBQTt5REFDbEI7O0FBRUQsV0FBTztBQUNILGFBQUssRUFBRSxLQUFLO0FBQ1osYUFBSyxFQUFFLEtBQUs7S0FDZixDQUFBO0NBQ0osQ0FBQTs7cUJBRWMsWUFBWSIsImZpbGUiOiIvVXNlcnMvY2hyaXN0aWFuYnJvbWFubi9TaXRlcy9XZWJwcm9qZWt0ZS93ZWJkcml2ZXJqcy9ERVYvbGliL2hlbHBlcnMvZmluZEVsZW1lbnRTdHJhdGVneS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3RvY29sRXJyb3IgfSBmcm9tICcuLi91dGlscy9FcnJvckhhbmRsZXInXG5cbmNvbnN0IERFRkFVTFRfU0VMRUNUT1IgPSAnY3NzIHNlbGVjdG9yJ1xuXG5sZXQgZmluZFN0cmF0ZWd5ID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBsZXQgdmFsdWUgPSBhcmdzWzBdXG4gICAgbGV0IHJlbGF0aXZlID0gKGFyZ3MubGVuZ3RoID4gMSA/IGFyZ3NbMV0gOiBmYWxzZSlcbiAgICBsZXQgeHBhdGhQcmVmaXggPSByZWxhdGl2ZSA/ICcuLycgOiAnLy8nXG5cbiAgICAvKipcbiAgICAgKiBzZXQgZGVmYXVsdCBzZWxlY3RvclxuICAgICAqL1xuICAgIGxldCB1c2luZyA9IERFRkFVTFRfU0VMRUNUT1JcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBQcm90b2NvbEVycm9yKCdzZWxlY3RvciBuZWVkcyB0byBiZSB0eXBlb2YgYHN0cmluZ2AnKVxuICAgIH1cblxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXNpbmc6IGFyZ3NbMF0sXG4gICAgICAgICAgICB2YWx1ZTogYXJnc1sxXVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgdmFsdWUgdHlwZVxuICAgIC8vIHVzZSBpZCBzdHJhdGVneSBpZiB2YWx1ZSBzdGFydHMgd2l0aCAjIGFuZCBkb2VzbnQgY29udGFpbiBhbnkgb3RoZXIgQ1NTIHNlbGVjdG9yLXJlbGV2YW50IGNoYXJhY3RlclxuICAgIGlmICh2YWx1ZS5pbmRleE9mKCcjJykgPT09IDAgJiYgdmFsdWUuc2VhcmNoKC8oXFxzfD58XFwufFt8XSkvKSA9PT0gLTEpIHtcbiAgICAgICAgdXNpbmcgPSAnaWQnXG4gICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSlcblxuICAgIC8vIHVzZSB4UGF0aCBzdHJhdGVneSBpZiB2YWx1ZSBzdGFydHMgd2l0aCAvL1xuICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignLycpID09PSAwIHx8IHZhbHVlLmluZGV4T2YoJygnKSA9PT0gMCB8fFxuICAgICAgICAgICAgICAgdmFsdWUuaW5kZXhPZignLi4vJykgPT09IDAgfHwgdmFsdWUuaW5kZXhPZignLi8nKSA9PT0gMCB8fFxuICAgICAgICAgICAgICAgdmFsdWUuaW5kZXhPZignKi8nKSA9PT0gMCkge1xuICAgICAgICB1c2luZyA9ICd4cGF0aCdcblxuICAgIC8vIHVzZSBsaW5rIHRleHQgc3RhcnRlZ3kgaWYgdmFsdWUgc3RhcnRlcyB3aXRoID1cbiAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJz0nKSA9PT0gMCkge1xuICAgICAgICB1c2luZyA9ICdsaW5rIHRleHQnXG4gICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSlcblxuICAgIC8vIHVzZSBwYXJ0aWFsIGxpbmsgdGV4dCBzdGFydGVneSBpZiB2YWx1ZSBzdGFydGVzIHdpdGggKj1cbiAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJyo9JykgPT09IDApIHtcbiAgICAgICAgdXNpbmcgPSAncGFydGlhbCBsaW5rIHRleHQnXG4gICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMilcblxuICAgIC8vIHJlY3Vyc2l2ZSBlbGVtZW50IHNlYXJjaCB1c2luZyB0aGUgVWlBdXRvbWF0b3IgbGlicmFyeSAoQW5kcm9pZCBvbmx5KVxuICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignYW5kcm9pZD0nKSA9PT0gMCkge1xuICAgICAgICB1c2luZyA9ICctYW5kcm9pZCB1aWF1dG9tYXRvcidcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSg4KVxuXG4gICAgLy8gcmVjdXJzaXZlIGVsZW1lbnQgc2VhcmNoIHVzaW5nIHRoZSBVSUF1dG9tYXRpb24gbGlicmFyeSAoaU9TLW9ubHkpXG4gICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdpb3M9JykgPT09IDApIHtcbiAgICAgICAgdXNpbmcgPSAnLWlvcyB1aWF1dG9tYXRpb24nXG4gICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoNClcblxuICAgIC8vIHJlY3Vyc2l2ZSBlbGVtZW50IHNlYXJjaCB1c2luZyBhY2Nlc3NpYmlsaXR5IGlkXG4gICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCd+JykgPT09IDApIHtcbiAgICAgICAgdXNpbmcgPSAnYWNjZXNzaWJpbGl0eSBpZCdcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKVxuXG4gICAgLy8gdXNlIHRhZyBuYW1lIHN0cmF0ZWd5IGlmIHZhbHVlIGNvbnRhaW5zIGEgdGFnXG4gICAgLy8gZS5nLiBcIjxkaXY+XCIgb3IgXCI8ZGl2IC8+XCJcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnNlYXJjaCgvPFthLXpBLVpcXC1dKyggXFwvKSo+L2cpID49IDApIHtcbiAgICAgICAgdXNpbmcgPSAndGFnIG5hbWUnXG4gICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvPHw+fFxcL3xcXHMvZywgJycpXG5cbiAgICAvLyB1c2UgbmFtZSBzdHJhdGVneSBpZiB2YWx1ZSBxdWVyaWVzIGVsZW1lbnRzIHdpdGggbmFtZSBhdHRyaWJ1dGVzXG4gICAgLy8gZS5nLiBcIltuYW1lPSdteU5hbWUnXVwiIG9yICdbbmFtZT1cIm15TmFtZVwiXSdcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnNlYXJjaCgvXlxcW25hbWU9KFwifCcpKFthLXpBLXowLTlcXC1fIF0rKShcInwnKVxcXSQvKSA+PSAwKSB7XG4gICAgICAgIHVzaW5nID0gJ25hbWUnXG4gICAgICAgIHZhbHVlID0gdmFsdWUubWF0Y2goL15cXFtuYW1lPShcInwnKShbYS16QS16MC05XFwtXyBdKykoXCJ8JylcXF0kLylbMl1cblxuICAgIC8vIGFueSBlbGVtZW50IHdpdGggZ2l2ZW4gdGV4dCBlLmcuIGgxPVdlbGNvbWVcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnNlYXJjaCgvXlthLXowLTldKj0oLikrJC8pID49IDApIHtcbiAgICAgICAgbGV0IHF1ZXJ5ID0gdmFsdWUuc3BsaXQoLz0vKVxuICAgICAgICBsZXQgdGFnID0gcXVlcnkuc2hpZnQoKVxuXG4gICAgICAgIHVzaW5nID0gJ3hwYXRoJ1xuICAgICAgICB2YWx1ZSA9IGAke3hwYXRoUHJlZml4fSR7dGFnLmxlbmd0aCA/IHRhZyA6ICcqJ31bbm9ybWFsaXplLXNwYWNlKCkgPSBcIiR7cXVlcnkuam9pbignPScpfVwiXWBcblxuICAgIC8vIGFueSBlbGVtZW50IGNvbnRhaW5pbmcgZ2l2ZW4gdGV4dFxuICAgIH0gZWxzZSBpZiAodmFsdWUuc2VhcmNoKC9eW2EtejAtOV0qXFwqPSguKSskLykgPj0gMCkge1xuICAgICAgICBsZXQgcXVlcnkgPSB2YWx1ZS5zcGxpdCgvXFwqPS8pXG4gICAgICAgIGxldCB0YWcgPSBxdWVyeS5zaGlmdCgpXG5cbiAgICAgICAgdXNpbmcgPSAneHBhdGgnXG4gICAgICAgIHZhbHVlID0gYCR7eHBhdGhQcmVmaXh9JHt0YWcubGVuZ3RoID8gdGFnIDogJyonfVtjb250YWlucyguLCBcIiR7cXVlcnkuam9pbignKj0nKX1cIildYFxuXG4gICAgLy8gYW55IGVsZW1lbnQgd2l0aCBjZXJ0aWFuIGNsYXNzIG9yIGlkICsgZ2l2ZW4gY29udGVudFxuICAgIH0gZWxzZSBpZiAodmFsdWUuc2VhcmNoKC9eW2EtejAtOV0qKFxcLnwjKS0/W19hLXpBLVpdK1tfYS16QS1aMC05LV0qPSguKSskLykgPj0gMCkge1xuICAgICAgICBsZXQgcXVlcnkgPSB2YWx1ZS5zcGxpdCgvPS8pXG4gICAgICAgIGxldCB0YWcgPSBxdWVyeS5zaGlmdCgpXG5cbiAgICAgICAgbGV0IGNsYXNzT3JJZCA9IHRhZy5zdWJzdHIodGFnLnNlYXJjaCgvKFxcLnwjKS8pLCAxKSA9PT0gJyMnID8gJ2lkJyA6ICdjbGFzcydcbiAgICAgICAgbGV0IGNsYXNzT3JJZE5hbWUgPSB0YWcuc2xpY2UodGFnLnNlYXJjaCgvKFxcLnwjKS8pICsgMSlcblxuICAgICAgICB0YWcgPSB0YWcuc3Vic3RyKDAsIHRhZy5zZWFyY2goLyhcXC58IykvKSlcbiAgICAgICAgdXNpbmcgPSAneHBhdGgnXG4gICAgICAgIHZhbHVlID0gYCR7eHBhdGhQcmVmaXh9JHt0YWcubGVuZ3RoID8gdGFnIDogJyonfVtjb250YWlucyhAJHtjbGFzc09ySWR9LCBcIiR7Y2xhc3NPcklkTmFtZX1cIikgYW5kIG5vcm1hbGl6ZS1zcGFjZSgpID0gXCIke3F1ZXJ5LmpvaW4oJz0nKX1cIl1gXG5cbiAgICAvLyBhbnkgZWxlbWVudCB3aXRoIGNlcnRpYW4gY2xhc3Mgb3IgaWQgKyBoYXMgY2VydGFpbiBjb250ZW50XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5zZWFyY2goL15bYS16MC05XSooXFwufCMpLT9bX2EtekEtWl0rW19hLXpBLVowLTktXSpcXCo9KC4pKyQvKSA+PSAwKSB7XG4gICAgICAgIGxldCBxdWVyeSA9IHZhbHVlLnNwbGl0KC9cXCo9LylcbiAgICAgICAgbGV0IHRhZyA9IHF1ZXJ5LnNoaWZ0KClcblxuICAgICAgICBsZXQgY2xhc3NPcklkID0gdGFnLnN1YnN0cih0YWcuc2VhcmNoKC8oXFwufCMpLyksIDEpID09PSAnIycgPyAnaWQnIDogJ2NsYXNzJ1xuICAgICAgICBsZXQgY2xhc3NPcklkTmFtZSA9IHRhZy5zbGljZSh0YWcuc2VhcmNoKC8oXFwufCMpLykgKyAxKVxuXG4gICAgICAgIHRhZyA9IHRhZy5zdWJzdHIoMCwgdGFnLnNlYXJjaCgvKFxcLnwjKS8pKVxuICAgICAgICB1c2luZyA9ICd4cGF0aCdcbiAgICAgICAgdmFsdWUgPSB4cGF0aFByZWZpeCArICh0YWcubGVuZ3RoID8gdGFnIDogJyonKSArICdbY29udGFpbnMoQCcgKyBjbGFzc09ySWQgKyAnLCBcIicgKyBjbGFzc09ySWROYW1lICsgJ1wiKSBhbmQgY29udGFpbnMoLiwgXCInICsgcXVlcnkuam9pbignKj0nKSArICdcIildJ1xuICAgICAgICB2YWx1ZSA9IGAke3hwYXRoUHJlZml4fSR7dGFnLmxlbmd0aCA/IHRhZyA6ICcqJ31bY29udGFpbnMoQCR7Y2xhc3NPcklkfSwgXCIke2NsYXNzT3JJZE5hbWV9XCIpIGFuZCBjb250YWlucyguLCBcIiR7cXVlcnkuam9pbignKj0nKX1cIildYFxuXG4gICAgLy8gYWxsb3cgdG8gbW92ZSB1cCB0byB0aGUgcGFyZW50IG9yIHNlbGVjdCBjdXJyZW50IGVsZW1lbnRcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnLi4nIHx8IHZhbHVlID09PSAnLicpIHtcbiAgICAgICAgdXNpbmcgPSAneHBhdGgnXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdXNpbmc6IHVzaW5nLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZpbmRTdHJhdGVneVxuIl19