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 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 | 1 1 28 27 19 19 19 19 19 19 19 1 1 19 19 19 1 1 19 17 17 19 3 16 4 12 12 19 2 17 17 19 3 3 3 1 1 2 3 19 4 4 4 1 1 3 4 19 12 12 12 1 1 11 12 19 19 1 1 18 18 18 27 23 23 23 23 23 5 10 5 4 1 5 18 14 14 14 4 4 1 3 18 18 18 18 18 15 14 1 3 18 27 | 'use strict'; (function (angular) { 'use strict'; angular.module('oc.lazyLoad').config(function ($provide) { $provide.decorator('$ocLazyLoad', function ($delegate, $q) { /** * The function that loads new files * @param config * @param params * @returns {*} */ $delegate.filesLoader = function filesLoader(config) { var params = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var cssFiles = [], templatesFiles = [], jsFiles = [], promises = [], cachePromise = null, filesCache = $delegate._getFilesCache(); $delegate.toggleWatch(true); // start watching angular.module calls angular.extend(params, config); var pushFile = function pushFile(path) { var file_type = null, m; if (angular.isObject(path)) { file_type = path.type; path = path.path; } cachePromise = filesCache.get(path); Eif (angular.isUndefined(cachePromise) || params.cache === false) { // always check for requirejs syntax just in case if ((m = /^(css|less|html|htm|js)?(?=!)/.exec(path)) !== null) { // Detect file type using preceding type declaration (ala requireJS) file_type = m[1]; path = path.substr(m[1].length + 1, path.length); // Strip the type from the path } if (!file_type) { Eif ((m = /[.](css|less|html|htm|js)?((\?|#).*)?$/.exec(path)) !== null) { // Detect file type via file extension file_type = m[1]; } else if (!$delegate.jsLoader.hasOwnProperty('ocLazyLoadLoader') && $delegate.jsLoader.hasOwnProperty('load')) { // requirejs file_type = 'js'; } else { $delegate._$log.error('File type could not be determined. ' + path); return; } } if ((file_type === 'css' || file_type === 'less') && cssFiles.indexOf(path) === -1) { cssFiles.push(path); } else if ((file_type === 'html' || file_type === 'htm') && templatesFiles.indexOf(path) === -1) { templatesFiles.push(path); } else Eif (file_type === 'js' || jsFiles.indexOf(path) === -1) { jsFiles.push(path); } else { $delegate._$log.error('File type is not valid. ' + path); } } else if (cachePromise) { promises.push(cachePromise); } }; if (params.serie) { pushFile(params.files.shift()); } else { angular.forEach(params.files, function (path) { pushFile(path); }); } if (cssFiles.length > 0) { var cssDeferred = $q.defer(); $delegate.cssLoader(cssFiles, function (err) { if (angular.isDefined(err) && $delegate.cssLoader.hasOwnProperty('ocLazyLoadLoader')) { $delegate._$log.error(err); cssDeferred.reject(err); } else { cssDeferred.resolve(); } }, params); promises.push(cssDeferred.promise); } if (templatesFiles.length > 0) { var templatesDeferred = $q.defer(); $delegate.templatesLoader(templatesFiles, function (err) { if (angular.isDefined(err) && $delegate.templatesLoader.hasOwnProperty('ocLazyLoadLoader')) { $delegate._$log.error(err); templatesDeferred.reject(err); } else { templatesDeferred.resolve(); } }, params); promises.push(templatesDeferred.promise); } if (jsFiles.length > 0) { var jsDeferred = $q.defer(); $delegate.jsLoader(jsFiles, function (err) { if (angular.isDefined(err) && $delegate.jsLoader.hasOwnProperty('ocLazyLoadLoader')) { $delegate._$log.error(err); jsDeferred.reject(err); } else { jsDeferred.resolve(); } }, params); promises.push(jsDeferred.promise); } Iif (promises.length === 0) { var deferred = $q.defer(), err = "Error: no file to load has been found, if you're trying to load an existing module you should use the 'inject' method instead of 'load'."; $delegate._$log.error(err); deferred.reject(err); return deferred.promise; } else if (params.serie && params.files.length > 0) { return $q.all(promises).then(function () { return $delegate.filesLoader(config, params); }); } else { return $q.all(promises)['finally'](function (res) { $delegate.toggleWatch(false); // stop watching angular.module calls return res; }); } }; /** * Load a module or a list of modules into Angular * @param module Mixed the name of a predefined module config object, or a module config object, or an array of either * @param params Object optional parameters * @returns promise */ $delegate.load = function (originalModule) { var originalParams = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var self = this, config = null, deferredList = [], deferred = $q.defer(), errText; // clean copy var module = angular.copy(originalModule); var params = angular.copy(originalParams); // If module is an array, break it down if (angular.isArray(module)) { // Resubmit each entry as a single module angular.forEach(module, function (m) { deferredList.push(self.load(m, params)); }); // Resolve the promise once everything has loaded $q.all(deferredList).then(function (res) { deferred.resolve(res); }, function (err) { deferred.reject(err); }); return deferred.promise; } // Get or Set a configuration depending on what was passed in if (angular.isString(module)) { config = self.getModuleConfig(module); Eif (!config) { config = { files: [module] }; } } else Eif (angular.isObject(module)) { // case {type: 'js', path: lazyLoadUrl + 'testModule.fakejs'} if (angular.isDefined(module.path) && angular.isDefined(module.type)) { config = { files: [module] }; } else { config = self.setModuleConfig(module); } } Iif (config === null) { var moduleName = self._getModuleName(module); errText = 'Module "' + (moduleName || 'unknown') + '" is not configured, cannot load.'; $delegate._$log.error(errText); deferred.reject(new Error(errText)); return deferred.promise; } else { // deprecated Iif (angular.isDefined(config.template)) { if (angular.isUndefined(config.files)) { config.files = []; } if (angular.isString(config.template)) { config.files.push(config.template); } else if (angular.isArray(config.template)) { config.files.concat(config.template); } } } var localParams = angular.extend({}, params, config); // if someone used an external loader and called the load function with just the module name Iif (angular.isUndefined(config.files) && angular.isDefined(config.name) && $delegate.moduleExists(config.name)) { return $delegate.inject(config.name, localParams, true); } $delegate.filesLoader(config, localParams).then(function () { $delegate.inject(null, localParams).then(function (res) { deferred.resolve(res); }, function (err) { deferred.reject(err); }); }, function (err) { deferred.reject(err); }); return deferred.promise; }; // return the patched service return $delegate; }); }); })(angular); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3dhbXAvd3d3L29jTGF6eUxvYWQvc3JjL29jTGF6eUxvYWQubG9hZGVycy5jb3JlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsQ0FBQyxVQUFBLE9BQU8sRUFBSTtBQUNSLGdCQUFZLENBQUM7O0FBRWIsV0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBUyxRQUFRLEVBQUU7QUFDcEQsZ0JBQVEsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLFVBQVMsU0FBUyxFQUFFLEVBQUUsRUFBRTs7Ozs7OztBQU90RCxxQkFBUyxDQUFDLFdBQVcsR0FBRyxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQWU7b0JBQWIsTUFBTSx5REFBRyxFQUFFOztBQUM1RCxvQkFBSSxRQUFRLEdBQUcsRUFBRTtvQkFDYixjQUFjLEdBQUcsRUFBRTtvQkFDbkIsT0FBTyxHQUFHLEVBQUU7b0JBQ1osUUFBUSxHQUFHLEVBQUU7b0JBQ2IsWUFBWSxHQUFHLElBQUk7b0JBQ25CLFVBQVUsR0FBRyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7O0FBRTVDLHlCQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDOztBQUU1Qix1QkFBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7O0FBRS9CLG9CQUFJLFFBQVEsR0FBRyxTQUFYLFFBQVEsQ0FBWSxJQUFJLEVBQUU7QUFDMUIsd0JBQUksU0FBUyxHQUFHLElBQUk7d0JBQUUsQ0FBQyxDQUFDO0FBQ3hCLHdCQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDdkIsaUNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3RCLDRCQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztxQkFDcEI7QUFDRCxnQ0FBWSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEMsd0JBQUcsT0FBTyxDQUFDLFdB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QUFDLENBQUM7eUJBQ3hDO3FCQUNKO2lCQUNKOztBQUVELG9CQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7OztBQUdyRCxvQkFBRyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUMzRywyQkFBTyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUMzRDs7QUFFRCx5QkFBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQU07QUFDbEQsNkJBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsRUFBSTtBQUM1QyxnQ0FBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDekIsRUFBRSxVQUFBLEdBQUcsRUFBSTtBQUNOLGdDQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUN4QixDQUFDLENBQUM7aUJBQ04sRUFBRSxVQUFBLEdBQUcsRUFBSTtBQUNOLDRCQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUN4QixDQUFDLENBQUM7O0FBRUgsdUJBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQzthQUMzQixDQUFDOzs7QUFHRixtQkFBTyxTQUFTLENBQUM7U0FDcEIsQ0FBQyxDQUFDO0tBQ04sQ0FBQyxDQUFDO0NBRU4sQ0FBQSxDQUFFLE9BQU8sQ0FBQyxDQUFDIiwiZmlsZSI6IkM6L3dhbXAvd3d3L29jTGF6eUxvYWQvc3JjL29jTGF6eUxvYWQubG9hZGVycy5jb3JlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGFuZ3VsYXIgPT4ge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAgIGFuZ3VsYXIubW9kdWxlKCdvYy5sYXp5TG9hZCcpLmNvbmZpZyhmdW5jdGlvbigkcHJvdmlkZSkge1xyXG4gICAgICAgICRwcm92aWRlLmRlY29yYXRvcignJG9jTGF6eUxvYWQnLCBmdW5jdGlvbigkZGVsZWdhdGUsICRxKSB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBUaGUgZnVuY3Rpb24gdGhhdCBsb2FkcyBuZXcgZmlsZXNcclxuICAgICAgICAgICAgICogQHBhcmFtIGNvbmZpZ1xyXG4gICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICAgICAgICAgICAqIEByZXR1cm5zIHsqfVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgJGRlbGVnYXRlLmZpbGVzTG9hZGVyID0gZnVuY3Rpb24gZmlsZXNMb2FkZXIoY29uZmlnLCBwYXJhbXMgPSB7fSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNzc0ZpbGVzID0gW10sXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzRmlsZXMgPSBbXSxcclxuICAgICAgICAgICAgICAgICAgICBqc0ZpbGVzID0gW10sXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMgPSBbXSxcclxuICAgICAgICAgICAgICAgICAgICBjYWNoZVByb21pc2UgPSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVzQ2FjaGUgPSAkZGVsZWdhdGUuX2dldEZpbGVzQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAkZGVsZWdhdGUudG9nZ2xlV2F0Y2godHJ1ZSk7IC8vIHN0YXJ0IHdhdGNoaW5nIGFuZ3VsYXIubW9kdWxlIGNhbGxzXHJcblxyXG4gICAgICAgICAgICAgICAgYW5ndWxhci5leHRlbmQocGFyYW1zLCBjb25maWcpO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBwdXNoRmlsZSA9IGZ1bmN0aW9uKHBhdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZV90eXBlID0gbnVsbCwgbTtcclxuICAgICAgICAgICAgICAgICAgICBpZihhbmd1bGFyLmlzT2JqZWN0KHBhdGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdHlwZSA9IHBhdGgudHlwZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucGF0aDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVQcm9taXNlID0gZmlsZXNDYWNoZS5nZXQocGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc1VuZGVmaW5lZChjYWNoZVByb21pc2UpIHx8IHBhcmFtcy5jYWNoZSA9PT0gZmFsc2UpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBjaGVjayBmb3IgcmVxdWlyZWpzIHN5bnRheCBqdXN0IGluIGNhc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG0gPSAvXihjc3N8bGVzc3xodG1sfGh0bXxqcyk/KD89ISkvLmV4ZWMocGF0aCkpICE9PSBudWxsKSB7IC8vIERldGVjdCBmaWxlIHR5cGUgdXNpbmcgcHJlY2VkaW5nIHR5cGUgZGVjbGFyYXRpb24gKGFsYSByZXF1aXJlSlMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3R5cGUgPSBtWzFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKG1bMV0ubGVuZ3RoICsgMSwgcGF0aC5sZW5ndGgpOyAgLy8gU3RyaXAgdGhlIHR5cGUgZnJvbSB0aGUgcGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZighZmlsZV90eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigobSA9IC9bLl0oY3NzfGxlc3N8aHRtbHxodG18anMpPygoXFw/fCMpLiopPyQvLmV4ZWMocGF0aCkpICE9PSBudWxsKSB7ICAvLyBEZXRlY3QgZmlsZSB0eXBlIHZpYSBmaWxlIGV4dGVuc2lvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdHlwZSA9IG1bMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoISRkZWxlZ2F0ZS5qc0xvYWRlci5oYXNPd25Qcm9wZXJ0eSgnb2NMYXp5TG9hZExvYWRlcicpICYmICRkZWxlZ2F0ZS5qc0xvYWRlci5oYXNPd25Qcm9wZXJ0eSgnbG9hZCcpKSB7IC8vIHJlcXVpcmVqc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdHlwZSA9ICdqcyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5fJGxvZy5lcnJvcihgRmlsZSB0eXBlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLiAkeyBwYXRoIH1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKChmaWxlX3R5cGUgPT09ICdjc3MnIHx8IGZpbGVfdHlwZSA9PT0gJ2xlc3MnKSAmJiBjc3NGaWxlcy5pbmRleE9mKHBhdGgpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzRmlsZXMucHVzaChwYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKChmaWxlX3R5cGUgPT09ICdodG1sJyB8fCBmaWxlX3R5cGUgPT09ICdodG0nKSAmJiB0ZW1wbGF0ZXNGaWxlcy5pbmRleE9mKHBhdGgpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzRmlsZXMucHVzaChwYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGZpbGVfdHlwZSA9PT0gJ2pzJyB8fCBqc0ZpbGVzLmluZGV4T2YocGF0aCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc0ZpbGVzLnB1c2gocGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVsZWdhdGUuXyRsb2cuZXJyb3IoYEZpbGUgdHlwZSBpcyBub3QgdmFsaWQuICR7IHBhdGggfWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihjYWNoZVByb21pc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChjYWNoZVByb21pc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYocGFyYW1zLnNlcmllKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHVzaEZpbGUocGFyYW1zLmZpbGVzLnNoaWZ0KCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocGFyYW1zLmZpbGVzLCBwYXRoID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEZpbGUocGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoY3NzRmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjc3NEZWZlcnJlZCA9ICRxLmRlZmVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLmNzc0xvYWRlcihjc3NGaWxlcywgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc0RlZmluZWQoZXJyKSAmJiAkZGVsZWdhdGUuY3NzTG9hZGVyLmhhc093blByb3BlcnR5KCdvY0xhenlMb2FkTG9hZGVyJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5fJGxvZy5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzRGVmZXJyZWQucmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NEZWZlcnJlZC5yZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCBwYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goY3NzRGVmZXJyZWQucHJvbWlzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYodGVtcGxhdGVzRmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZXNEZWZlcnJlZCA9ICRxLmRlZmVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLnRlbXBsYXRlc0xvYWRlcih0ZW1wbGF0ZXNGaWxlcywgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc0RlZmluZWQoZXJyKSAmJiAkZGVsZWdhdGUudGVtcGxhdGVzTG9hZGVyLmhhc093blByb3BlcnR5KCdvY0xhenlMb2FkTG9hZGVyJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5fJGxvZy5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzRGVmZXJyZWQucmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXNEZWZlcnJlZC5yZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCBwYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godGVtcGxhdGVzRGVmZXJyZWQucHJvbWlzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoanNGaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGpzRGVmZXJyZWQgPSAkcS5kZWZlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5qc0xvYWRlcihqc0ZpbGVzLCBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihhbmd1bGFyLmlzRGVmaW5lZChlcnIpICYmICRkZWxlZ2F0ZS5qc0xvYWRlci5oYXNPd25Qcm9wZXJ0eSgnb2NMYXp5TG9hZExvYWRlcicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVsZWdhdGUuXyRsb2cuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzRGVmZXJyZWQucmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc0RlZmVycmVkLnJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChqc0RlZmVycmVkLnByb21pc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmKHByb21pc2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkZWZlcnJlZCA9ICRxLmRlZmVyKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IFwiRXJyb3I6IG5vIGZpbGUgdG8gbG9hZCBoYXMgYmVlbiBmb3VuZCwgaWYgeW91J3JlIHRyeWluZyB0byBsb2FkIGFuIGV4aXN0aW5nIG1vZHVsZSB5b3Ugc2hvdWxkIHVzZSB0aGUgJ2luamVjdCcgbWV0aG9kIGluc3RlYWQgb2YgJ2xvYWQnLlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5fJGxvZy5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmKHBhcmFtcy5zZXJpZSAmJiBwYXJhbXMuZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkcS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4gJGRlbGVnYXRlLmZpbGVzTG9hZGVyKGNvbmZpZywgcGFyYW1zKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkcS5hbGwocHJvbWlzZXMpLmZpbmFsbHkocmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLnRvZ2dsZVdhdGNoKGZhbHNlKTsgLy8gc3RvcCB3YXRjaGluZyBhbmd1bGFyLm1vZHVsZSBjYWxsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIExvYWQgYSBtb2R1bGUgb3IgYSBsaXN0IG9mIG1vZHVsZXMgaW50byBBbmd1bGFyXHJcbiAgICAgICAgICAgICAqIEBwYXJhbSBtb2R1bGUgTWl4ZWQgdGhlIG5hbWUgb2YgYSBwcmVkZWZpbmVkIG1vZHVsZSBjb25maWcgb2JqZWN0LCBvciBhIG1vZHVsZSBjb25maWcgb2JqZWN0LCBvciBhbiBhcnJheSBvZiBlaXRoZXJcclxuICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtcyBPYmplY3Qgb3B0aW9uYWwgcGFyYW1ldGVyc1xyXG4gICAgICAgICAgICAgKiBAcmV0dXJucyBwcm9taXNlXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAkZGVsZWdhdGUubG9hZCA9IGZ1bmN0aW9uKG9yaWdpbmFsTW9kdWxlLCBvcmlnaW5hbFBhcmFtcyA9IHt9KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXMsXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZExpc3QgPSBbXSxcclxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9ICRxLmRlZmVyKCksXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyVGV4dDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBjbGVhbiBjb3B5XHJcbiAgICAgICAgICAgICAgICB2YXIgbW9kdWxlID0gYW5ndWxhci5jb3B5KG9yaWdpbmFsTW9kdWxlKTtcclxuICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSBhbmd1bGFyLmNvcHkob3JpZ2luYWxQYXJhbXMpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIElmIG1vZHVsZSBpcyBhbiBhcnJheSwgYnJlYWsgaXQgZG93blxyXG4gICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc0FycmF5KG1vZHVsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBSZXN1Ym1pdCBlYWNoIGVudHJ5IGFzIGEgc2luZ2xlIG1vZHVsZVxyXG4gICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChtb2R1bGUsIG0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZExpc3QucHVzaChzZWxmLmxvYWQobSwgcGFyYW1zKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIHByb21pc2Ugb25jZSBldmVyeXRoaW5nIGhhcyBsb2FkZWRcclxuICAgICAgICAgICAgICAgICAgICAkcS5hbGwoZGVmZXJyZWRMaXN0KS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gR2V0IG9yIFNldCBhIGNvbmZpZ3VyYXRpb24gZGVwZW5kaW5nIG9uIHdoYXQgd2FzIHBhc3NlZCBpblxyXG4gICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc1N0cmluZyhtb2R1bGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gc2VsZi5nZXRNb2R1bGVDb25maWcobW9kdWxlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZighY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzOiBbbW9kdWxlXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZihhbmd1bGFyLmlzT2JqZWN0KG1vZHVsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIHt0eXBlOiAnanMnLCBwYXRoOiBsYXp5TG9hZFVybCArICd0ZXN0TW9kdWxlLmZha2Vqcyd9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc0RlZmluZWQobW9kdWxlLnBhdGgpICYmIGFuZ3VsYXIuaXNEZWZpbmVkKG1vZHVsZS50eXBlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlczogW21vZHVsZV1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBzZWxmLnNldE1vZHVsZUNvbmZpZyhtb2R1bGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZihjb25maWcgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbW9kdWxlTmFtZSA9IHNlbGYuX2dldE1vZHVsZU5hbWUobW9kdWxlKTtcclxuICAgICAgICAgICAgICAgICAgICBlcnJUZXh0ID0gYE1vZHVsZSBcIiR7IG1vZHVsZU5hbWUgfHwgJ3Vua25vd24nIH1cIiBpcyBub3QgY29uZmlndXJlZCwgY2Fubm90IGxvYWQuYDtcclxuICAgICAgICAgICAgICAgICAgICAkZGVsZWdhdGUuXyRsb2cuZXJyb3IoZXJyVGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KG5ldyBFcnJvcihlcnJUZXh0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlcHJlY2F0ZWRcclxuICAgICAgICAgICAgICAgICAgICBpZihhbmd1bGFyLmlzRGVmaW5lZChjb25maWcudGVtcGxhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFuZ3VsYXIuaXNVbmRlZmluZWQoY29uZmlnLmZpbGVzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZpbGVzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoYW5ndWxhci5pc1N0cmluZyhjb25maWcudGVtcGxhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZmlsZXMucHVzaChjb25maWcudGVtcGxhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoYW5ndWxhci5pc0FycmF5KGNvbmZpZy50ZW1wbGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5maWxlcy5jb25jYXQoY29uZmlnLnRlbXBsYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgbG9jYWxQYXJhbXMgPSBhbmd1bGFyLmV4dGVuZCh7fSwgcGFyYW1zLCBjb25maWcpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGlmIHNvbWVvbmUgdXNlZCBhbiBleHRlcm5hbCBsb2FkZXIgYW5kIGNhbGxlZCB0aGUgbG9hZCBmdW5jdGlvbiB3aXRoIGp1c3QgdGhlIG1vZHVsZSBuYW1lXHJcbiAgICAgICAgICAgICAgICBpZihhbmd1bGFyLmlzVW5kZWZpbmVkKGNvbmZpZy5maWxlcykgJiYgYW5ndWxhci5pc0RlZmluZWQoY29uZmlnLm5hbWUpICYmICRkZWxlZ2F0ZS5tb2R1bGVFeGlzdHMoY29uZmlnLm5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRkZWxlZ2F0ZS5pbmplY3QoY29uZmlnLm5hbWUsIGxvY2FsUGFyYW1zLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAkZGVsZWdhdGUuZmlsZXNMb2FkZXIoY29uZmlnLCBsb2NhbFBhcmFtcykudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlLmluamVjdChudWxsLCBsb2NhbFBhcmFtcykudGhlbihyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9LCBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAvLyByZXR1cm4gdGhlIHBhdGNoZWQgc2VydmljZVxyXG4gICAgICAgICAgICByZXR1cm4gJGRlbGVnYXRlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG59KShhbmd1bGFyKTtcclxuIl19 |