Code coverage report for ./src/ocLazyLoad.loaders.common.js

Statements: 63.08% (41 / 65)      Branches: 44.68% (21 / 47)      Functions: 87.5% (7 / 8)      Lines: 64.06% (41 / 64)      Ignored: none     

All files » ./src\ » ocLazyLoad.loaders.common.js
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    1     1 24 23                     23 11         1 1           1             11 11       11   3 3 3 3 3   8 8 8         11 9 9 9 9 9   11 2   11   11 11           11               11 3 3     3       3       3           3                               11     23        
"use strict";
 
(function (angular) {
    "use strict";
 
    angular.module("oc.lazyLoad").config(function ($provide) {
        $provide.decorator("$ocLazyLoad", function ($delegate, $q, $window, $interval) {
            var uaCssChecked = false,
                useCssLoadPatch = false,
                anchor = $window.document.getElementsByTagName("head")[0] || $window.document.getElementsByTagName("body")[0];
 
            /**
             * Load a js/css file
             * @param type
             * @param path
             * @param params
             * @returns promise
             */
            $delegate.buildElement = function buildElement(type, path, params) {
                var deferred = $q.defer(),
                    el,
                    loaded,
                    filesCache = $delegate._getFilesCache(),
                    cacheBuster = function cacheBuster(url) {
                    var dc = new Date().getTime();
                    Iif (url.indexOf("?") >= 0) {
                        if (url.substring(0, url.length - 1) === "&") {
                            return url + "_dc=" + dc;
                        }
                        return url + "&_dc=" + dc;
                    } else {
                        return url + "?_dc=" + dc;
                    }
                };
 
                // Store the promise early so the file load can be detected by other parallel lazy loads
                // (ie: multiple routes on one page) a 'true' value isn't sufficient
                // as it causes false positive load results.
                Eif (angular.isUndefined(filesCache.get(path))) {
                    filesCache.put(path, deferred.promise);
                }
 
                // Switch in case more content types are added later
                switch (type) {
                    case "css":
                        el = $window.document.createElement("link");
                        el.type = "text/css";
                        el.rel = "stylesheet";
                        el.href = params.cache === false ? cacheBuster(path) : path;
                        break;
                    case "js":
                        el = $window.document.createElement("script");
                        el.src = params.cache === false ? cacheBuster(path) : path;
                        break;
                    default:
                        deferred.reject(new Error("Requested type \"" + type + "\" is not known. Could not inject \"" + path + "\""));
                        break;
                }
                el.onload = el.onreadystatechange = function (e) {
                    Iif (el.readyState && !/^c|loade/.test(el.readyState) || loaded) return;
                    el.onload = el.onreadystatechange = null;
                    loaded = 1;
                    $delegate._broadcast("ocLazyLoad.fileLoaded", path);
                    deferred.resolve();
                };
                el.onerror = function () {
                    deferred.reject(new Error("Unable to load " + path));
                };
                el.async = params.serie ? 0 : 1;
 
                var insertBeforeElem = anchor.lastChild;
                Iif (params.insertBefore) {
                    var element = angular.element(params.insertBefore);
                    if (element && element.length > 0) {
                        insertBeforeElem = element[0];
                    }
                }
                anchor.insertBefore(el, insertBeforeElem);
 
                /*
                 The event load or readystatechange doesn't fire in:
                 - iOS < 6       (default mobile browser)
                 - Android < 4.4 (default mobile browser)
                 - Safari < 6    (desktop browser)
                 */
                if (type == "css") {
                    Eif (!uaCssChecked) {
                        var ua = $window.navigator.userAgent.toLowerCase();
 
                        // iOS < 6
                        Iif (/iP(hone|od|ad)/.test($window.navigator.platform)) {
                            var v = $window.navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);
                            var iOSVersion = parseFloat([parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)].join("."));
                            useCssLoadPatch = iOSVersion < 6;
                        } else Iif (ua.indexOf("android") > -1) {
                            // Android < 4.4
                            var androidVersion = parseFloat(ua.slice(ua.indexOf("android") + 8));
                            useCssLoadPatch = androidVersion < 4.4;
                        } else Iif (ua.indexOf("safari") > -1 && ua.indexOf("chrome") == -1 && ua.indexOf("phantomjs") == -1) {
                            var safariVersion = parseFloat(ua.match(/version\/([\.\d]+)/i)[1]);
                            useCssLoadPatch = safariVersion < 6;
                        }
                    }
 
                    Iif (useCssLoadPatch) {
                        var tries = 1000; // * 20 = 20000 miliseconds
                        var interval = $interval(function () {
                            try {
                                el.sheet.cssRules;
                                $interval.cancel(interval);
                                el.onload();
                            } catch (e) {
                                if (--tries <= 0) {
                                    el.onerror();
                                }
                            }
                        }, 20);
                    }
                }
 
                return deferred.promise;
            };
 
            return $delegate;
        });
    });
})(angular);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3dhbXAvd3d3L29jTGF6eUxvYWQvc3JjL29jTGF6eUxvYWQubG9hZGVycy5jb21tb24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxDQUFDLFVBQVMsT0FBTyxFQUFFO0FBQ2YsZ0JBQVksQ0FBQzs7QUFFYixXQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFTLFFBQVEsRUFBRTtBQUNwRCxnQkFBUSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsVUFBVSxTQUFTLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUU7QUFDM0UsZ0JBQUksWUFBWSxHQUFHLEtBQUs7Z0JBQ3BCLGVBQWUsR0FBRyxLQUFLO2dCQUN2QixNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7QUFTbEgscUJBQVMsQ0FBQyxZQUFZLEdBQUcsU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7QUFDL0Qsb0JBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUU7b0JBQ3JCLEVBQUU7b0JBQ0YsTUFBTTtvQkFDTixVQUFVLEdBQUcsU0FBUyxDQUFDLGNBQWMsRUFBRTtvQkFDdkMsV0FBVyxHQUFHLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRTtBQUNwQyx3QkFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUM5Qix3QkFBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUN0Qiw0QkFBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFL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RUFBRSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkUsMkNBQWUsR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDO3lCQUN2QztxQkFDSjs7QUFFRCx3QkFBRyxlQUFlLEVBQUU7QUFDaEIsNEJBQUksS0FBSyxHQUFHLElBQUksQ0FBQztBQUNqQiw0QkFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLFlBQVc7QUFDaEMsZ0NBQUk7QUFDQSxrQ0FBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7QUFDbEIseUNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDM0Isa0NBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs2QkFDZixDQUFDLE9BQU0sQ0FBQyxFQUFFO0FBQ1Asb0NBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFO0FBQ2Isc0NBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQ0FDaEI7NkJBQ0o7eUJBQ0osRUFBRSxFQUFFLENBQUMsQ0FBQztxQkFDVjtpQkFDSjs7QUFFRCx1QkFBTyxRQUFRLENBQUMsT0FBTyxDQUFDO2FBQzNCLENBQUM7O0FBRUYsbUJBQU8sU0FBUyxDQUFDO1NBQ3BCLENBQUMsQ0FBQTtLQUNMLENBQUMsQ0FBQztDQUVOLENBQUEsQ0FBRSxPQUFPLENBQUMsQ0FBQyIsImZpbGUiOiJDOi93YW1wL3d3dy9vY0xhenlMb2FkL3NyYy9vY0xhenlMb2FkLmxvYWRlcnMuY29tbW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKGFuZ3VsYXIpIHtcclxuICAgICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgICBhbmd1bGFyLm1vZHVsZSgnb2MubGF6eUxvYWQnKS5jb25maWcoZnVuY3Rpb24oJHByb3ZpZGUpIHtcclxuICAgICAgICAkcHJvdmlkZS5kZWNvcmF0b3IoJyRvY0xhenlMb2FkJywgZnVuY3Rpb24gKCRkZWxlZ2F0ZSwgJHEsICR3aW5kb3csICRpbnRlcnZhbCkge1xyXG4gICAgICAgICAgICB2YXIgdWFDc3NDaGVja2VkID0gZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB1c2VDc3NMb2FkUGF0Y2ggPSBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGFuY2hvciA9ICR3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXSB8fCAkd2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF07XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogTG9hZCBhIGpzL2NzcyBmaWxlXHJcbiAgICAgICAgICAgICAqIEBwYXJhbSB0eXBlXHJcbiAgICAgICAgICAgICAqIEBwYXJhbSBwYXRoXHJcbiAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbXNcclxuICAgICAgICAgICAgICogQHJldHVybnMgcHJvbWlzZVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgJGRlbGVnYXRlLmJ1aWxkRWxlbWVudCA9IGZ1bmN0aW9uIGJ1aWxkRWxlbWVudCh0eXBlLCBwYXRoLCBwYXJhbXMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCksXHJcbiAgICAgICAgICAgICAgICAgICAgZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVkLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVzQ2FjaGUgPSAkZGVsZWdhdGUuX2dldEZpbGVzQ2FjaGUoKSxcclxuICAgICAgICAgICAgICAgICAgICBjYWNoZUJ1c3RlciA9IGZ1bmN0aW9uIGNhY2hlQnVzdGVyKHVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodXJsLmluZGV4T2YoJz8nKSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1cmwuc3Vic3RyaW5nKDAsIHVybC5sZW5ndGggLSAxKSA9PT0gJyYnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybCArICdfZGM9JyArIGRjO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybCArICcmX2RjPScgKyBkYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmwgKyAnP19kYz0nICsgZGM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBwcm9taXNlIGVhcmx5IHNvIHRoZSBmaWxlIGxvYWQgY2FuIGJlIGRldGVjdGVkIGJ5IG90aGVyIHBhcmFsbGVsIGxhenkgbG9hZHNcclxuICAgICAgICAgICAgICAgIC8vIChpZTogbXVsdGlwbGUgcm91dGVzIG9uIG9uZSBwYWdlKSBhICd0cnVlJyB2YWx1ZSBpc24ndCBzdWZmaWNpZW50XHJcbiAgICAgICAgICAgICAgICAvLyBhcyBpdCBjYXVzZXMgZmFsc2UgcG9zaXRpdmUgbG9hZCByZXN1bHRzLlxyXG4gICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc1VuZGVmaW5lZChmaWxlc0NhY2hlLmdldChwYXRoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWxlc0NhY2hlLnB1dChwYXRoLCBkZWZlcnJlZC5wcm9taXNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTd2l0Y2ggaW4gY2FzZSBtb3JlIGNvbnRlbnQgdHlwZXMgYXJlIGFkZGVkIGxhdGVyXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2godHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nzcyc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsID0gJHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnR5cGUgPSAndGV4dC9jc3MnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5yZWwgPSAnc3R5bGVzaGVldCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLmhyZWYgPSBwYXJhbXMuY2FjaGUgPT09IGZhbHNlID8gY2FjaGVCdXN0ZXIocGF0aCkgOiBwYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdqcyc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsID0gJHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3JjID0gcGFyYW1zLmNhY2hlID09PSBmYWxzZSA/IGNhY2hlQnVzdGVyKHBhdGgpIDogcGF0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KG5ldyBFcnJvcignUmVxdWVzdGVkIHR5cGUgXCInICsgdHlwZSArICdcIiBpcyBub3Qga25vd24uIENvdWxkIG5vdCBpbmplY3QgXCInICsgcGF0aCArICdcIicpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbC5vbmxvYWQgPSBlbFsnb25yZWFkeXN0YXRlY2hhbmdlJ10gPSBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoKGVsWydyZWFkeVN0YXRlJ10gJiYgISgvXmN8bG9hZGUvLnRlc3QoZWxbJ3JlYWR5U3RhdGUnXSkpKSB8fCBsb2FkZWQpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICBlbC5vbmxvYWQgPSBlbFsnb25yZWFkeXN0YXRlY2hhbmdlJ10gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLl9icm9hZGNhc3QoJ29jTGF6eUxvYWQuZmlsZUxvYWRlZCcsIHBhdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBlbC5vbmVycm9yID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KG5ldyBFcnJvcignVW5hYmxlIHRvIGxvYWQgJyArIHBhdGgpKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBlbC5hc3luYyA9IHBhcmFtcy5zZXJpZSA/IDAgOiAxO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBpbnNlcnRCZWZvcmVFbGVtID0gYW5jaG9yLmxhc3RDaGlsZDtcclxuICAgICAgICAgICAgICAgIGlmKHBhcmFtcy5pbnNlcnRCZWZvcmUpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudChwYXJhbXMuaW5zZXJ0QmVmb3JlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZihlbGVtZW50ICYmIGVsZW1lbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmVFbGVtID0gZWxlbWVudFswXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhbmNob3IuaW5zZXJ0QmVmb3JlKGVsLCBpbnNlcnRCZWZvcmVFbGVtKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgICAgIFRoZSBldmVudCBsb2FkIG9yIHJlYWR5c3RhdGVjaGFuZ2UgZG9lc24ndCBmaXJlIGluOlxyXG4gICAgICAgICAgICAgICAgIC0gaU9TIDwgNiAgICAgICAoZGVmYXVsdCBtb2JpbGUgYnJvd3NlcilcclxuICAgICAgICAgICAgICAgICAtIEFuZHJvaWQgPCA0LjQgKGRlZmF1bHQgbW9iaWxlIGJyb3dzZXIpXHJcbiAgICAgICAgICAgICAgICAgLSBTYWZhcmkgPCA2ICAgIChkZXNrdG9wIGJyb3dzZXIpXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGlmKHR5cGUgPT0gJ2NzcycpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZighdWFDc3NDaGVja2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1YSA9ICR3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaU9TIDwgNlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZigvaVAoaG9uZXxvZHxhZCkvLnRlc3QoJHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9ICgkd2luZG93Lm5hdmlnYXRvci5hcHBWZXJzaW9uKS5tYXRjaCgvT1MgKFxcZCspXyhcXGQrKV8/KFxcZCspPy8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlPU1ZlcnNpb24gPSBwYXJzZUZsb2F0KFtwYXJzZUludCh2WzFdLCAxMCksIHBhcnNlSW50KHZbMl0sIDEwKSwgcGFyc2VJbnQodlszXSB8fCAwLCAxMCldLmpvaW4oJy4nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VDc3NMb2FkUGF0Y2ggPSBpT1NWZXJzaW9uIDwgNjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHVhLmluZGV4T2YoXCJhbmRyb2lkXCIpID4gLTEpIHsgLy8gQW5kcm9pZCA8IDQuNFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFuZHJvaWRWZXJzaW9uID0gcGFyc2VGbG9hdCh1YS5zbGljZSh1YS5pbmRleE9mKFwiYW5kcm9pZFwiKSArIDgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUNzc0xvYWRQYXRjaCA9IGFuZHJvaWRWZXJzaW9uIDwgNC40O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYodWEuaW5kZXhPZignc2FmYXJpJykgPiAtMSAmJiB1YS5pbmRleE9mKCdjaHJvbWUnKSA9PSAtMSAmJiB1YS5pbmRleE9mKCdwaGFudG9tanMnKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNhZmFyaVZlcnNpb24gPSBwYXJzZUZsb2F0KHVhLm1hdGNoKC92ZXJzaW9uXFwvKFtcXC5cXGRdKykvaSlbMV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlQ3NzTG9hZFBhdGNoID0gc2FmYXJpVmVyc2lvbiA8IDY7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHVzZUNzc0xvYWRQYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHJpZXMgPSAxMDAwOyAvLyAqIDIwID0gMjAwMDAgbWlsaXNlY29uZHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGludGVydmFsID0gJGludGVydmFsKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5zaGVldC5jc3NSdWxlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW50ZXJ2YWwuY2FuY2VsKGludGVydmFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5vbmxvYWQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKC0tdHJpZXMgPD0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5vbmVycm9yKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAyMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuICRkZWxlZ2F0ZTtcclxuICAgICAgICB9KVxyXG4gICAgfSk7XHJcblxyXG59KShhbmd1bGFyKTtcclxuIl19