(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0 && arguments[0] !== undefined ? arguments[0] : true; // Не проверяем очередь _mgq, если предыдущий вызов _mgwqp не обработал все записи в очереди if (firstCall && typeof _mgwqp.started == 'boolean' && _mgwqp.started) { return; } _mgwqp.started = true; // Выполняем проверку очереди _mgq for (var i = 0; i < _mgq.length; i++) { var mgRec = _mgq[i]; var mglibName = '_mgLib' + mgRec[1].lib; if (typeof window[mglibName] == 'function') { _mgq.splice(i--, 1); if (typeof window[mglibName][mgRec[0]] == 'function') { setTimeout(function (libName, _mgRec) { window[libName][_mgRec[0]](_mgRec[1]); }(mglibName, mgRec), 1); } else { console.warn('MgError: function ' + _mgRec[0] + ' not found in library ' + mglibName); } } } // Если в очереди остались записи, назначаем повторный вызов _mgwqp if (_mgq.length) { setTimeout(function () { _mgwqp(false); }, 1000); } else { _mgwqp.started = false; } }; } },{"./main":1}],3:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _debug = require('./modules/debug'); Object.keys(_debug).forEach(function (key) { if (key === "default" || key === "__esModule") return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _debug[key]; } }); }); var _styles = require('./modules/styles'); Object.keys(_styles).forEach(function (key) { if (key === "default" || key === "__esModule") return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _styles[key]; } }); }); var _widgetCapping = require('./modules/widgetCapping'); Object.keys(_widgetCapping).forEach(function (key) { if (key === "default" || key === "__esModule") return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _widgetCapping[key]; } }); }); var _video = require('./modules/video'); Object.keys(_video).forEach(function (key) { if (key === "default" || key === "__esModule") return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _video[key]; } }); }); },{"./modules/debug":4,"./modules/styles":5,"./modules/video":6,"./modules/widgetCapping":7}],4:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** * @module debug * Поддерживает следующие спобосы включения режима откладки: * 1. Через URL: ?mgwdebug=true или ?mgwdebug_123=true&mgwdebug_456=true * второй вариант включает отладку только в инфромерах с cid=123 и cid=456 * 2. Через конфигурацию информера (поле config в таблице g_blocks) json: {"debug":true} * 3. Через DOM атрибут в блоке кода информера на странице:
*/ /** * Класс Debug */ var Debug = function () { function Debug() { _classCallCheck(this, Debug); } _createClass(Debug, [{ key: 'debug', /** * Выводит отладочную информацию на консоль при установленном debugFlag * @memberof _mgLib2 * @param {*} message */ value: function debug(message) { if (this.debugFlag) { if ((typeof message === 'undefined' ? 'undefined' : _typeof(message)) != 'object') { message = 'MGDEBUG: ' + message; } console.debug(message); } } }], [{ key: 'init', /** * Добавляет к объекту библиотеки информера метод debug и устанавливает флаг debugFlag, если включена отладка * @param {_mgLib2} widget - библиотека информеров */ value: function init(widget) { if (!widget.debug) { var debugObject = new Debug(); widget.debug = debugObject.debug; } var queryArray = this.queryString(); var confDebug = widget.mgRec.config.debug; if (queryArray.mgwdebug || queryArray['mgwdebug_' + widget.mgRec.cid] || confDebug && typeof confDebug != 'string' || typeof confDebug == 'string' && parseInt(confDebug) || widget.block.getAttribute('data-mgwdebug')) { widget.debugFlag = true; } } /** * Возвращает массив аргументов из URL * @returns {Object} */ }, { key: 'queryString', value: function queryString() { var queryArray = {}; var query = window.location.search.substring(1); var vars = query.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); if (typeof queryArray[pair[0]] === 'undefined') { queryArray[pair[0]] = decodeURIComponent(pair[1]); } else if (typeof queryArray[pair[0]] === 'string') { var arr = void 0; arr = [queryArray[pair[0]], decodeURIComponent(pair[1])]; queryArray[pair[0]] = arr; } else { queryArray[pair[0]].push(decodeURIComponent(pair[1])); } } return queryArray; } }]); return Debug; }(); exports.Debug = Debug; },{}],5:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** @module styles */ /** * Класс Styles */ var Styles = function () { function Styles() { _classCallCheck(this, Styles); } _createClass(Styles, null, [{ key: 'init', /** * Добавляет элемент styles в head с данными из конфигурации информера * @param {_mgLib2} widget - библиотека информеров */ value: function init(widget) { if (!widget.mgRec.stylesInited) { widget.mgRec.stylesInited = true; var style = document.createElement('style'); style.setAttribute('type', 'text/css'); style.appendChild(document.createTextNode(widget.mgRec.styles)); document.head.appendChild(style); } } }]); return Styles; }(); exports.Styles = Styles; },{}],6:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** @module video */ /** * Класс inread (out-stream) видео информера */ var Video = function () { /** * Конструктор класса * @param {_mgLib2} widget - библиотека информеров */ function Video(widget) { var _this = this; _classCallCheck(this, Video); var config = widget.mgRec.config; this.widget = widget; this.jwplatformLoaded = false; this.jwplatformUrl = config.jwplatformUrl || '//content.jwplatform.com/libraries/C7LYrhNr.js'; this.velocityUrl = config.velocityUrl || '//cdn.mgid.com/js/velocity.min.js'; this.velocityLoaded = false; this.cappingAdded = false; this.firstQuartile = false; this.midpoint = false; this.thirdQuartile = false; this.ghits = 0; this.jwPlayerStatus = 'none'; this.bottomLinkText = 'Click to visit website'; this.sensorUrl = '//c.mgid.com/vs/'; this.uid = config.uid; this.mgVideoIndex = widget.mgRec.cid + '_' + widget.getWidgets().length; widget.debug('mgVideoIndex: ' + this.mgVideoIndex); this.addLibraries(); var WidgetCapping = widget.modules.WidgetCapping; this.widgetCapping = new WidgetCapping(widget, function () { _this.renderWidget(); }); this.widgetCapping.cappingTimes = config.capping || this.widgetCapping.cappingTimes; this.widgetCapping.cappingInterval = config.cappingInterval || this.widgetCapping.cappingInterval; } /** * Создаёт экземпляр класса Video * @param {_mgLib2} widget - библиотека информеров */ _createClass(Video, [{ key: 'renderWidget', /** * Прорисовывает информер в скрытом виде и инициализирует jwplayer */ value: function renderWidget() { var _this2 = this; if (this.jwplatformLoaded && this.velocityLoaded) { this.widget.debug('Video renderWidget'); this.widget.block.className += ' mgVideoContainer_' + this.widget.mgRec.cid; this.widget.block.style.overflow = 'hidden'; this.widget.block.style.height = '1px'; this.addLogo(); this.initPlayer(); } else { setTimeout(function () { _this2.renderWidget(); }, 500); } } /** * Подгружает библиотеки jwplayer и velocity */ }, { key: 'addLibraries', value: function addLibraries() { var _this3 = this; var jwplatformLib = document.getElementById('mgJwplatform'); if (!jwplatformLib) { jwplatformLib = document.createElement('script'); jwplatformLib.id = 'mgJwplatform'; jwplatformLib.src = this.jwplatformUrl; jwplatformLib.onload = function () { jwplatformLib.setAttribute('data-loaded', true); }; document.head.appendChild(jwplatformLib); } else if (jwplatformLib.getAttribute('data-loaded')) { this.jwplatformLoaded = true; } var velocityLib = document.getElementById('mgVelocity'); if (!velocityLib) { velocityLib = document.createElement('script'); velocityLib.id = 'mgVelocity'; velocityLib.src = this.velocityUrl; velocityLib.onload = function () { velocityLib.setAttribute('data-loaded', true); }; document.head.appendChild(velocityLib); } else if (velocityLib.getAttribute('data-loaded')) { this.velocityLoaded = true; this.Velocity = typeof Velocity == 'undefined' ? typeof $ == 'undefined' ? typeof jQuery == 'undefined' ? null : jQuery.Velocity : $.Velocity : Velocity; } if (!this.jwplatformLoaded || !this.velocityLoaded) { setTimeout(function () { _this3.addLibraries(); }, 500); } } /** * Добавляет html элементы логитипа, плеера и ссылки на рекламодателя */ }, { key: 'addLogo', value: function addLogo() { var logo = document.createElement('div'); logo.setAttribute('id', 'mgVideoLogo_' + this.mgVideoIndex); logo.setAttribute('class', 'mgVideoLogo_' + this.widget.mgRec.cid + ''); logo.innerHTML = ''; this.widget.block.appendChild(logo); var playerDiv = document.createElement('div'); playerDiv.setAttribute('id', 'mgJwPlayer_' + this.mgVideoIndex); this.widget.block.appendChild(playerDiv); var bottomLink = document.createElement('div'); bottomLink.setAttribute('id', 'mgVideoBottomLink_' + this.mgVideoIndex); bottomLink.innerHTML = '
'; this.widget.block.appendChild(bottomLink); } }, { key: 'isMobile', value: function isMobile() { if (typeof this.mobile != 'boolean') { this.mobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); } return this.mobile; } /** * Проверка на поддержку флеша * @returns {boolean} */ }, { key: 'hasFlash', value: function hasFlash() { if (typeof this.flash != 'boolean') { var a = 'Shockwave'; var b = 'Flash'; try { a = new ActiveXObject(a + b + '.' + a + b); } catch (e) { a = navigator.plugins[a + ' ' + b]; } this.flash = !!a; } return this.flash; } /** * Инициализация jwplayer и настройка обработчиков событий от него */ }, { key: 'initPlayer', value: function initPlayer() { var _this4 = this; this.widget.debug('Init player: ' + this.mgVideoIndex); var jwId = 'mgJwPlayer_' + this.mgVideoIndex; var mute = this.widget.mgRec.config.mute; if (mute && typeof mute != 'string') { mute = true; } else if (typeof mute == 'string') { mute = !!parseInt(mute); } else { mute = false; } jwplayer(jwId).setup({ autostart: false, repeat: false, mute: mute, width: this.widget.mgRec.config.width || '100%', height: this.widget.mgRec.config.height || '100%', primary: this.hasFlash() ? 'flash' : 'html5', advertising: { client: 'vast', tag: this.widget.mgRec.config.vast + '?flash=' + (this.hasFlash() ? 1 : 0), skipoffset: this.widget.mgRec.config.skipoffset || null }, playlist: [{ description: '', image: '//content.jwplatform.com/thumbs/XHcEUCFl-720.jpg', link: '//content.jwplatform.com/previews/XHcEUCFl', mediaid: 'XHcEUCFl', pubdate: 'Mon, 30 May 2016 13:13:14 -0000', sources: [{ duration: 1, file: '//content.jwplatform.com/videos/XHcEUCFl-h7x6aGUW.mp4', height: 240, label: '180p', type: 'video/mp4', width: 320 }, { duration: 1, file: '//content.jwplatform.com/videos/XHcEUCFl-J8t63d6S.mp4', height: 360, label: '270p', type: 'video/mp4', width: 480 }, { duration: 1, file: '//content.jwplatform.com/videos/XHcEUCFl-ED0sHGDP.m4a', height: -1, label: 'AAC Audio', type: 'audio/mp4', width: -1 }], tags: '', title: 'Ads', tracks: [{ file: '//content.jwplatform.com/strips/XHcEUCFl-120.vtt', kind: 'thumbnails' }] }] }); this.jwplayer = jwplayer(jwId); this.jwplayer.on('complete', function () { _this4.jwcomplete(); }); this.jwplayer.on('adSkipped', function () { _this4.jwcomplete(); }); this.jwplayer.on('adComplete', function () { _this4.jwcomplete(); }); this.jwplayer.on('play', function () { if (!_this4.jwResolutionInited) { var qualityLevels = _this4.jwplayer.getQualityLevels(); if (qualityLevels != null) { for (var i = 0; i < qualityLevels.length; i++) { if (qualityLevels[i].label == '720p') { _this4.jwplayer.setCurrentQuality(qualityLevels[i].index); break; } } } _this4.jwResolutionInited = true; } }); this.jwplayer.on('ready', function () { setTimeout(function () { _this4.checkPlayer(); }, 1); }); this.jwplayer.on('error', function (e) { _this4.widget.debug('jwplayer error: ' + e.message); }); this.jwplayer.on('adError', function (e) { _this4.widget.debug('adError: ' + e.message); _this4.jwPlayerStatus = 'stop'; if (e.creativetype == 'application/x-shockwave-flash') { _this4.widget.debug('Can not play flash ads in HTML5 player.'); } }); this.jwplayer.on('adRequest', function () { _this4.callSensor('load'); }); this.jwplayer.on('adMeta', function (e) { var mgVideoBottomLink = document.getElementById('mgVideoBottomLink_' + _this4.mgVideoIndex); if (_this4.clickthrough = e.clickthrough) { if (mgVideoBottomLink) { mgVideoBottomLink.firstElementChild.innerHTML = '' + _this4.bottomLinkText + ''; } var gHitsPos = _this4.clickthrough.indexOf('/ghits/'); if (gHitsPos != -1) { _this4.ghits = _this4.clickthrough.substr(gHitsPos + 7, _this4.clickthrough.slice(gHitsPos + 7).indexOf('/')); } } else if (mgVideoBottomLink) { mgVideoBottomLink.style.display = 'none'; } }); this.jwplayer.on('adTime', function (e) { if (e.position > 0) { _this4.adTimeStarted = true; } if (!_this4.cappingAdded && e.position >= 2) { _this4.cappingAdded = true; _this4.widgetCapping.sendAddCapping(); } if (!_this4.firstQuartile && e.position / e.duration > 0.25) { _this4.firstQuartile = true; _this4.callSensor('video_25', e.position); } if (!_this4.midpoint && e.position / e.duration > 0.5) { _this4.midpoint = true; _this4.callSensor('video_50', e.position); } if (!_this4.thirdQuartile && e.position / e.duration > 0.75) { _this4.thirdQuartile = true; _this4.callSensor('video_75', e.position); } }); this.jwplayer.on('adImpression', function (e) { _this4.mediaType = e.creativetype; _this4.widget.debug(e.creativetype); if (_this4.mediaType == 'application/javascript') { (function () { var adStartInt = setInterval(function () { _this4.jwplayer.seek(); if (_this4.adTimeStarted) { clearInterval(adStartInt); } }, 1000); })(); } if (_this4.jwPlayerStatus == 'hiddenPlay') { _this4.showPlayer(); _this4.jwPlayerStatus = 'play'; } }); this.jwplayer.on('adStarted', function (e) { _this4.widget.debug('VPAID adStarted'); if (_this4.jwPlayerStatus == 'hiddenPlay') { _this4.widget.debug('adStarted: Found hiddenPlay'); _this4.showPlayer(); _this4.jwPlayerStatus = 'play'; } }); window.addEventListener('scroll', function () { _this4.checkPlayer(); }); } /** * Сворачивание плеера по окончанию рекламного ролика */ }, { key: 'jwcomplete', value: function jwcomplete() { this.widget.block.style.overflow = 'hidden'; this.Velocity(this.widget.block, { height: 0 }, 1000); this.jwPlayerStatus = 'stop'; } /** * Ставит плеер на паузу */ }, { key: 'pausePlayer', value: function pausePlayer() { var _this5 = this; var state = this.jwplayer.getState(); if (state != 'paused') { this.widget.debug('State: ' + state + ' Send pause jwPlayerStatus: ' + this.jwPlayerStatus); this.jwplayer.pause(); setTimeout(function () { _this5.pausePlayer(); }, 500); } else { this.widget.debug('Player paused'); if (this.jwPlayerStatus != 'stop') { if (this.jwPlayerStatus == 'hide') { this.checkPlayer(); } else if (this.jwPlayerStatus == 'play') { this.startPlayer(); } } } } /** * Проверяет сосотяние плеера и попадение его в область видимости * При измнении состояния запускает или ставит на паузу видео */ }, { key: 'checkPlayer', value: function checkPlayer() { var jwplayerMarker = document.getElementById('mgJwPlayer_' + this.mgVideoIndex); var mgVideo = this.widget.block; if (this.jwPlayerStatus == 'none') { jwplayerMarker.style.width = this.widget.mgRec.config.width; var mgVideoLogo = document.getElementById('mgVideoLogo_' + this.mgVideoIndex); var mgVideoLogoStyle = window.getComputedStyle(mgVideoLogo); this.logoOffsetBottom = mgVideoLogoStyle.marginBottom; this.logoOffset = this.logoOffsetBottom ? parseInt(this.logoOffsetBottom.slice(0, -2)) : 0; this.jwPlayerHeight = jwplayerMarker.offsetHeight + mgVideoLogo.offsetHeight + this.logoOffset; this.widget.debug('jwPlayerHeight: ' + this.jwPlayerHeight); mgVideo.style.width = '6px'; } if (this.isScrolledIntoView(mgVideo, 0.5)) { if (this.jwplayer.getState() == 'playing' && this.jwPlayerStatus != 'play' && this.jwPlayerStatus != 'stop') { this.showPlayer(); this.jwPlayerStatus = 'play'; } this.widget.debug('isScrolledIntoView: true Status: ' + this.jwPlayerStatus); if (this.jwPlayerStatus == 'none') { this.startPlayer(); this.jwPlayerStatus = 'hiddenPlay'; this.widget.debug('checkPlayer: Change status to hiddenPlay.'); } else if (this.jwPlayerStatus == 'hide') { this.startPlayer(); this.jwPlayerStatus = 'hiddenPlay'; } else if (this.jwPlayerStatus == 'pause') { this.startPlayer(); this.jwPlayerStatus = 'play'; } } else { if (this.jwplayer.getState() == 'paused') this.jwPlayerStatus = 'pause'; this.widget.debug('isScrolledIntoView: false Status: ' + this.jwPlayerStatus); if (this.jwPlayerStatus == 'play' && this.showenJwPx / this.jwPlayerHeight < 0.5) { this.widget.debug('checkPlayer: Change status to pause.'); this.jwplayer.pause(); this.jwPlayerStatus = 'pause'; } else if (this.jwPlayerStatus == 'pause' && this.showenJwPx / this.jwPlayerHeight > 0.5) { this.startPlayer(); this.jwPlayerStatus = 'play'; } else if (this.jwPlayerStatus == 'none') { this.jwPlayerStatus = 'hide'; } } } /** * Проверка на попадание элемента в область видимости * @param {HTMLElement} elem - Проверяемый элемент * @param {Number} showenPart - Если число < 1 и > 0, то провека будет успешной если в области видимости только * часть элемента равная showenPart * 100% * @returns {boolean} */ }, { key: 'isScrolledIntoView', value: function isScrolledIntoView(elem) { var showenPart = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var docViewTop = window.pageYOffset || document.documentElement.scrollTop; var windowHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; var docViewBottom = docViewTop + windowHeight; var elemTop = this.getOffsetTop(elem); var elemBottom = elemTop + this.jwPlayerHeight - this.logoOffset; if (elemTop < docViewTop && elemBottom > docViewTop) { this.showenJwPx = elemBottom - docViewTop; } else if (elemTop < docViewBottom && elemBottom > docViewBottom) { this.showenJwPx = docViewBottom - elemTop; } else if (elemBottom <= docViewBottom && elemTop >= docViewTop) { this.showenJwPx = this.jwPlayerHeight - this.logoOffset; } else { this.showenJwPx = 0; } return elemBottom - (1 - showenPart) * this.jwPlayerHeight <= docViewBottom && elemTop + (1 - showenPart) * this.jwPlayerHeight >= docViewTop; } /** * Получить смещение элемента от начала страницы * @param {HTMLElement} elem - Проверяемый элемент * @returns {number} */ }, { key: 'getOffsetTop', value: function getOffsetTop(elem) { var box = elem.getBoundingClientRect(); var body = document.body; var docElem = document.documentElement; var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop; var clientTop = docElem.clientTop || body.clientTop || 0; var top = box.top + scrollTop - clientTop; return Math.round(top); } /** * Запускает проигрывание видео */ }, { key: 'startPlayer', value: function startPlayer() { this.widget.debug('startPlayer: Send play.'); if (this.isMobile()) { this.jwplayer.setMute(true); } if (this.mediaType == 'application/javascript') { this.jwplayer.seek(); } else { this.jwplayer.play(); } } /** * Разворачивает плеер */ }, { key: 'showPlayer', value: function showPlayer() { var mgVideo = this.widget.block; mgVideo.style.width = this.widget.mgRec.config.width + (this.widget.mgRec.config.width.toString().substr(-1, 1) == '%' ? '' : 'px'); this.widget.debug('showPlayer: Width: ' + mgVideo.style.width); this.Velocity(mgVideo, { height: this.jwPlayerHeight }, { complete: function complete() { mgVideo.style.overflow = 'unset'; } }); } /** * Отправляет запрос на video_sensor c указанным в параметрах событием * @param {string} eventName - Событие * @param {Number} timeOffset - Количество секунд проигранного видео */ }, { key: 'callSensor', value: function callSensor(eventName) { var timeOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var img0gif = new Image(); var rnd = Math.floor(Math.random() * 65535); img0gif.src = this.sensorUrl + '?tid=' + this.ghits + '&iid=' + this.uid + '&e=' + eventName + '&o=' + parseInt(timeOffset) + '&c=' + rnd; } }], [{ key: 'init', value: function init(widget) { widget.video = new Video(widget); } }]); return Video; }(); exports.Video = Video; },{}],7:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** @module widgetCapping */ /** * Класс WidgetCapping */ var WidgetCapping = function () { /** * Конструктор класса WidgetCapping * @param {_mgLib2} widget - библиотека информеров * @param {function} renderWidget - функция, которая будет вызываться для отрисовки информера */ function WidgetCapping(widget, renderWidget) { var _this = this; _classCallCheck(this, WidgetCapping); this.widget = widget; this.renderWidget = renderWidget; this.cappingTimes = 0; this.cappingInterval = 24; this.rendered = false; this.addIframe(); window.addEventListener('message', function (e) { _this.messageListener(e); }, false); } /** * Добавляет на страницу iframe для кеппинга */ _createClass(WidgetCapping, [{ key: 'addIframe', value: function addIframe() { var _this2 = this; if (this.widget.isDOMContentLoaded()) { var _ret = function () { var iframeElement = document.getElementById('mgCappingIframe'); if (!iframeElement) { iframeElement = document.createElement('iframe'); iframeElement.id = 'mgCappingIframe'; iframeElement.src = _this2.widget.libConfig.videoCappingUrl; iframeElement.style.display = 'none'; iframeElement.onload = function () { iframeElement.setAttribute('data-loaded', true); _this2.addIframe(); }; document.body.appendChild(iframeElement); } else if (iframeElement.getAttribute('data-loaded')) { if (!_this2.messageSent) { _this2.messageSent = true; var message = JSON.stringify({ action: 'getCapping', cid: _this2.widget.mgRec.cid, libVer: '2' }); _this2.widget.debug('Send getCapping: ' + message); iframeElement.contentWindow.postMessage(message, '*'); } return { v: void 0 }; } }(); if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; } setTimeout(function () { _this2.addIframe(); }, 500); } /** * Обработчик сообщений от capping iframe * @param {Object} e - Событие * @param {string} e.data - Данные переданные в событии */ }, { key: 'messageListener', value: function messageListener(e) { this.widget.debug('messageListener: ' + this.widget.mgRec.cid); this.widget.debug(e.data); if (typeof e.data != 'undefined' && e.data) { try { var req = JSON.parse(e.data); if (typeof req.action != 'undefined') { if (req.action == 'returnCapping' && req.libVer == '2' && req.cid == this.widget.mgRec.cid && !this.rendered) { if (this.cappingTimes == 0 || this.cappingTimes > req.capping) { this.rendered = true; this.renderWidget(); } else { this.widget.debug('WidgetCapping cappingTimes excised.'); } } } } catch (exception) {} } } /** * Отравляет сообщение capping iframe для увеличения счётчика показов */ }, { key: 'sendAddCapping', value: function sendAddCapping() { var iframeElement = document.getElementById('mgCappingIframe'); var message = JSON.stringify({ action: 'addCapping', cid: this.widget.mgRec.cid, libVer: '2', interval: this.cappingInterval }); iframeElement.contentWindow.postMessage(message, '*'); } }]); return WidgetCapping; }(); exports.WidgetCapping = WidgetCapping; },{}]},{},[2]) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvbWFpbi5qcyIsInNyYy9tZ3FwLmpzIiwic3JjL21vZHVsZXMuanMiLCJzcmMvbW9kdWxlcy9kZWJ1Zy5qcyIsInNyYy9tb2R1bGVzL3N0eWxlcy5qcyIsInNyYy9tb2R1bGVzL3ZpZGVvLmpzIiwic3JjL21vZHVsZXMvd2lkZ2V0Q2FwcGluZy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7QUNBQTs7SUFBWSxPOzs7Ozs7QUFFWixJQUFJLENBQUMsT0FBTyxjQUFaLEVBQTRCO0FBQ3hCOzs7Ozs7O0FBT0EsV0FBTyxjQUFQO0FBQ0k7Ozs7O0FBS0Esd0JBQVksS0FBWixFQUFtQixLQUFuQixFQUEwQjtBQUFBOztBQUN0QjtBQUNBLGlCQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0E7QUFDQSxpQkFBSyxLQUFMLEdBQWEsS0FBYjtBQUNBO0FBQ0EsaUJBQUssT0FBTCxHQUFlLGVBQWUsT0FBOUI7QUFDQTtBQUNBLGlCQUFLLFNBQUwsR0FBaUIsZUFBZSxTQUFoQztBQUNBLGlCQUFLLFNBQUw7QUFDSDs7QUFFRDs7Ozs7QUFsQko7QUFBQTtBQUFBLHdDQXFCZ0I7QUFDUixxQkFBSyxJQUFJLFVBQVQsSUFBdUIsZUFBZSxPQUF0QyxFQUErQztBQUMzQyx3QkFBSSxlQUFlLE9BQWYsQ0FBdUIsY0FBdkIsQ0FBc0MsVUFBdEMsS0FBcUQsZUFBZSxPQUFmLENBQXVCLFVBQXZCLEVBQW1DLElBQTVGLEVBQWtHO0FBQzlGLHVDQUFlLE9BQWYsQ0FBdUIsVUFBdkIsRUFBbUMsSUFBbkMsQ0FBd0MsSUFBeEM7QUFDSDtBQUNKO0FBQ0o7O0FBRUQ7Ozs7Ozs7O0FBN0JKO0FBQUE7OztBQXVESTs7Ozs7QUF2REoseUNBNERpQjtBQUNULHVCQUFPLGVBQWUsT0FBdEI7QUFDSDs7QUFFRDs7Ozs7O0FBaEVKO0FBQUE7QUFBQSxpREFxRXlCO0FBQ2pCLHVCQUFPLGVBQWUsZ0JBQXRC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akQ7QUFFSDs7Ozs7O1FBR0csYSxHQUFBLGEiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiaW1wb3J0ICogYXMgbW9kdWxlcyBmcm9tICcuL21vZHVsZXMnO1xuXG5pZiAoIXdpbmRvdy5fbWdMaWIkTElCVkVSJCkge1xuICAgIC8qKlxuICAgICAqINCa0LvQsNGB0YEg0LHQuNCx0LvQuNC+0YLQtdC60Lgg0LjQvdGE0L7RgNC80LXRgNCwXG4gICAgICog0JTQu9GPINC60LDQttC00L7Qs9C+INCx0LvQvtC60LAg0LjQvdGE0L7RgNC80LXRgNCwINC90LDQudC00LXQvdC90L7Qs9C+INC90LAg0YHRgtGA0LDQvdC40YbQtSDRgdC+0LfQtNCw0ZHRgtGB0Y8g0L7RgtC00LXQu9GM0L3Ri9C5INGN0LrQt9C10LzQv9C70Y/RgCDRjdGC0L7Qs9C+INC60LvQsNGB0YHQsFxuICAgICAqIEBjbGFzc1xuICAgICAqIEBhbGlhcyBfbWdMaWIkTElCVkVSJFxuICAgICAqIEBuYW1lc3BhY2VcbiAgICAgKi9cbiAgICB3aW5kb3cuX21nTGliJExJQlZFUiQgPSBjbGFzcyB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgICAgICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudH0gYmxvY2sgLSBET00g0Y3Qu9C10LzQtdC90YIg0LIg0LrQvtGC0L7RgNC+0Lwg0LHRg9C00LXRgiDQv9GA0L7RgNC40YHQvtCy0LDQvSDQuNC90YTQvtGA0LzQtdGAXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtZ1JlYyAtINCa0L7QvdGE0LjQs9GD0YDQsNGG0LjRjyDQuNC90YTQvtGA0LzQtdGA0LBcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0cnVjdG9yKGJsb2NrLCBtZ1JlYykge1xuICAgICAgICAgICAgLyoqIEB0eXBlIHtIVE1MRGl2RWxlbWVudH0gKi9cbiAgICAgICAgICAgIHRoaXMuYmxvY2sgPSBibG9jaztcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7e2NpZDogbnVtYmVyLCBjb25maWc6IHt9LCBzdHlsZXM6IHN0cmluZywgdGVtcGxhdGU6IHN0cmluZ319ICovXG4gICAgICAgICAgICB0aGlzLm1nUmVjID0gbWdSZWM7XG4gICAgICAgICAgICAvKiogQHR5cGUge09iamVjdFtdfSAqL1xuICAgICAgICAgICAgdGhpcy5tb2R1bGVzID0gX21nTGliJExJQlZFUiQubW9kdWxlcztcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqL1xuICAgICAgICAgICAgdGhpcy5saWJDb25maWcgPSBfbWdMaWIkTElCVkVSJC5saWJDb25maWc7XG4gICAgICAgICAgICB0aGlzLmluaXRCbG9jaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqINCS0YvQt9GL0LLQsNC10YIg0YHRgtCw0YLQuNGH0LXRgdC60LjQuSDQvNC10YLQvtC0IGluaXQg0LIg0LrQsNC20LTQvtC8INC80L7QtNGD0LvQtSDQuCDQv9C10YDQtdC00LDRkdGCINC10LzRgyDRgtC10LrRg9GJ0LjQuSDQutC70LDRgdGBINCx0LjQsdC70LjQvtGC0LXQutC4INC40L3RhNC+0YDQvNC10YDQsFxuICAgICAgICAgKi9cbiAgICAgICAgaW5pdEJsb2NrKCkge1xuICAgICAgICAgICAgZm9yIChsZXQgbW9kdWxlTmFtZSBpbiBfbWdMaWIkTElCVkVSJC5tb2R1bGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9tZ0xpYiRMSUJWRVIkLm1vZHVsZXMuaGFzT3duUHJvcGVydHkobW9kdWxlTmFtZSkgJiYgX21nTGliJExJQlZFUiQubW9kdWxlc1ttb2R1bGVOYW1lXS5pbml0KSB7XG4gICAgICAgICAgICAgICAgICAgIF9tZ0xpYiRMSUJWRVIkLm1vZHVsZXNbbW9kdWxlTmFtZV0uaW5pdCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICog0JTQu9GPINC60LDQttC00L7Qs9C+INC90LDQudC00LXQvdC90L7Qs9C+INCx0LvQvtC60LAg0LjQvdGE0L7RgNC80LXRgNCwINGB0L7Qt9C00LDRkdGCINGN0LrQt9C10LzQv9C70Y/RgCDQutC70LDRgdGB0LAg0LHQuNCx0LvQuNC+0YLQtdC60Lgg0LjQvdGE0L7RgNC80LXRgNCwXG4gICAgICAgICAqINCf0L7QuNGB0Log0L/QvtCy0YLQvtGA0Y/QtdGC0YHRjyDQtNC+INGC0LXRhSDQv9C+0YAsINC/0L7QutCwINC90LUg0YHRgNCw0LHQvtGC0LDQtdGCINGB0L7QsdGL0YLQuNC1IERPTUNvbnRlbnRMb2FkZWRcbiAgICAgICAgICogQG1lbWJlck9mIF9tZ0xpYiRMSUJWRVIkXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtZ1JlYyAtINCa0L7QvdGE0LjQs9GD0YDQsNGG0LjRjyDQuNC90YTQvtGA0LzQtdGA0LBcbiAgICAgICAgICogQHN0YXRpY1xuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGljIF9tZ2xvYWQobWdSZWMpIHtcbiAgICAgICAgICAgIGxldCBjaWQgPSBtZ1JlYy5jaWQ7XG4gICAgICAgICAgICBsZXQgbWdCbG9ja3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdfbWd3XycgKyBjaWQpO1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKCdfbWdsb2FkOiAnICsgY2lkICsgJyBsaWJWZXI6ICRMSUJWRVIkJyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IG1nQmxvY2tzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghbWdCbG9ja3NbaV0uZ2V0QXR0cmlidXRlKCdkYXRhLW1nbG9hZGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKG1nQmxvY2tzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgbWdCbG9ja3NbaV0uc2V0QXR0cmlidXRlKCdkYXRhLW1nbG9hZGVkJywgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICAgICAgX21nTGliJExJQlZFUiQud2lkZ2V0cy5wdXNoKG5ldyBfbWdMaWIkTElCVkVSJChtZ0Jsb2Nrc1tpXSwgbWdSZWMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghX21nTGliJExJQlZFUiQuRE9NQ29udGVudExvYWRlZCkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBfbWdMaWIkTElCVkVSJC5fbWdsb2FkKG1nUmVjKTtcbiAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiDQstGB0LUg0L/RgNC+0LjQvdC40YbQuNCw0LvQuNC30LjRgNC+0LLQsNC90L3Ri9C1INGN0LrQt9C10LzQv9C70Y/RgNGLINC60LvQsNGB0YHQvtCyINCx0LjQsdC70LjQvtGC0LXQutC4INC40L3RhNC+0YDQvNC10YDQvtCyXG4gICAgICAgICAqIEBtZW1iZXJPZiBfbWdMaWIkTElCVkVSJFxuICAgICAgICAgKiBAcmV0dXJucyB7X21nTGliJExJQlZFUiRbXX1cbiAgICAgICAgICovXG4gICAgICAgIGdldFdpZGdldHMoKSB7XG4gICAgICAgICAgICByZXR1cm4gX21nTGliJExJQlZFUiQud2lkZ2V0cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQodGA0LDQsdC+0YLQsNC70L4g0LvQuCDRgdC+0LHRi9GC0LjQtSBET01Db250ZW50TG9hZGVkXG4gICAgICAgICAqIEBtZW1iZXJPZiBfbWdMaWIkTElCVkVSJFxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGlzRE9NQ29udGVudExvYWRlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiBfbWdMaWIkTElCVkVSJC5ET01Db250ZW50TG9hZGVkO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIF9tZ0xpYiRMSUJWRVIkLm1vZHVsZXMgPSBtb2R1bGVzO1xuICAgIF9tZ0xpYiRMSUJWRVIkLndpZGdldHMgPSBbXTtcbiAgICBfbWdMaWIkTElCVkVSJC5ET01Db250ZW50TG9hZGVkID0gZG9jdW1lbnQucmVhZHlTdGF0ZSAhPSAnbG9hZGluZyc7XG4gICAgX21nTGliJExJQlZFUiQubGliQ29uZmlnID0gSlNPTi5wYXJzZSgnJExJQl9DT05GSUckJyk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgICAgICBfbWdMaWIkTElCVkVSJC5ET01Db250ZW50TG9hZGVkID0gdHJ1ZTtcbiAgICB9KTtcbn1cbiIsIi8qKiDQkNC90LDQu9C40LfQsNGC0L7RgCDQvtGH0LXRgNC10LTQuCAqL1xuaWYgKCF3aW5kb3cuX21nd3FwKSB7XG4gICAgd2luZG93Ll9tZ3dxcCA9IChmaXJzdENhbGwgPSB0cnVlKSA9PiB7XG4gICAgICAgIC8vINCd0LUg0L/RgNC+0LLQtdGA0Y/QtdC8INC+0YfQtdGA0LXQtNGMIF9tZ3EsINC10YHQu9C4INC/0YDQtdC00YvQtNGD0YnQuNC5INCy0YvQt9C+0LIgX21nd3FwINC90LUg0L7QsdGA0LDQsdC+0YLQsNC7INCy0YHQtSDQt9Cw0L/QuNGB0Lgg0LIg0L7Rh9C10YDQtdC00LhcbiAgICAgICAgaWYgKGZpcnN0Q2FsbCAmJiB0eXBlb2YgX21nd3FwLnN0YXJ0ZWQgPT0gJ2Jvb2xlYW4nICYmIF9tZ3dxcC5zdGFydGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBfbWd3cXAuc3RhcnRlZCA9IHRydWU7XG5cbiAgICAgICAgLy8g0JLRi9C/0L7Qu9C90Y/QtdC8INC/0YDQvtCy0LXRgNC60YMg0L7Rh9C10YDQtdC00LggX21ncVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF9tZ3EubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtZ1JlYyA9IF9tZ3FbaV07XG4gICAgICAgICAgICBsZXQgbWdsaWJOYW1lID0gJ19tZ0xpYicgKyBtZ1JlY1sxXS5saWI7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvd1ttZ2xpYk5hbWVdID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBfbWdxLnNwbGljZShpLS0sIDEpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93W21nbGliTmFtZV1bbWdSZWNbMF1dID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKGxpYk5hbWUsIF9tZ1JlYykgPT4geyB3aW5kb3dbbGliTmFtZV1bX21nUmVjWzBdXShfbWdSZWNbMV0pOyB9KShtZ2xpYk5hbWUsIG1nUmVjKSwgMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNZ0Vycm9yOiBmdW5jdGlvbiAnICsgX21nUmVjWzBdICsgJyBub3QgZm91bmQgaW4gbGlicmFyeSAnICsgbWdsaWJOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDQldGB0LvQuCDQsiDQvtGH0LXRgNC10LTQuCDQvtGB0YLQsNC70LjRgdGMINC30LDQv9C40YHQuCwg0L3QsNC30L3QsNGH0LDQtdC8INC/0L7QstGC0L7RgNC90YvQuSDQstGL0LfQvtCyIF9tZ3dxcFxuICAgICAgICBpZiAoX21ncS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBfbWd3cXAoZmFsc2UpOyB9LCAxMDAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9tZ3dxcC5zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5pbXBvcnQgJy4vbWFpbic7XG4iLCJleHBvcnQgKiBmcm9tICcuL21vZHVsZXMvZGVidWcnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL3N0eWxlcyc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvd2lkZ2V0Q2FwcGluZyc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvdmlkZW8nO1xuIiwiLyoqXG4gKiBAbW9kdWxlIGRlYnVnXG4gKiDQn9C+0LTQtNC10YDQttC40LLQsNC10YIg0YHQu9C10LTRg9GO0YnQuNC1INGB0L/QvtCx0L7RgdGLINCy0LrQu9GO0YfQtdC90LjRjyDRgNC10LbQuNC80LAg0L7RgtC60LvQsNC00LrQuDpcbiAqIDEuINCn0LXRgNC10LcgVVJMOiA/bWd3ZGVidWc9dHJ1ZSDQuNC70LggP21nd2RlYnVnXzEyMz10cnVlJm1nd2RlYnVnXzQ1Nj10cnVlXG4gKiAgICDQstGC0L7RgNC+0Lkg0LLQsNGA0LjQsNC90YIg0LLQutC70Y7Rh9Cw0LXRgiDQvtGC0LvQsNC00LrRgyDRgtC+0LvRjNC60L4g0LIg0LjQvdGE0YDQvtC80LXRgNCw0YUg0YEgY2lkPTEyMyDQuCBjaWQ9NDU2XG4gKiAyLiDQp9C10YDQtdC3INC60L7QvdGE0LjQs9GD0YDQsNGG0LjRjiDQuNC90YTQvtGA0LzQtdGA0LAgKNC/0L7Qu9C1IGNvbmZpZyDQsiDRgtCw0LHQu9C40YbQtSBnX2Jsb2NrcykganNvbjoge1wiZGVidWdcIjp0cnVlfVxuICogMy4g0KfQtdGA0LXQtyBET00g0LDRgtGA0LjQsdGD0YIg0LIg0LHQu9C+0LrQtSDQutC+0LTQsCDQuNC90YTQvtGA0LzQtdGA0LAg0L3QsCDRgdGC0YDQsNC90LjRhtC1OiA8ZGl2IGNsYXNzPVwiX21nd18xMjNcIiBkYXRhLW1nd2RlYnVnPVwidHJ1ZVwiPjwvZGl2PlxuICovXG5cbi8qKlxuICog0JrQu9Cw0YHRgSBEZWJ1Z1xuICovXG5jbGFzcyBEZWJ1ZyB7XG4gICAgLyoqXG4gICAgICog0JTQvtCx0LDQstC70Y/QtdGCINC6INC+0LHRitC10LrRgtGDINCx0LjQsdC70LjQvtGC0LXQutC4INC40L3RhNC+0YDQvNC10YDQsCDQvNC10YLQvtC0IGRlYnVnINC4INGD0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINGE0LvQsNCzIGRlYnVnRmxhZywg0LXRgdC70Lgg0LLQutC70Y7Rh9C10L3QsCDQvtGC0LvQsNC00LrQsFxuICAgICAqIEBwYXJhbSB7X21nTGliJExJQlZFUiR9IHdpZGdldCAtINCx0LjQsdC70LjQvtGC0LXQutCwINC40L3RhNC+0YDQvNC10YDQvtCyXG4gICAgICovXG4gICAgc3RhdGljIGluaXQod2lkZ2V0KSB7XG4gICAgICAgIGlmICghd2lkZ2V0LmRlYnVnKSB7XG4gICAgICAgICAgICBsZXQgZGVidWdPYmplY3QgPSBuZXcgRGVidWcoKTtcbiAgICAgICAgICAgIHdpZGdldC5kZWJ1ZyA9IGRlYnVnT2JqZWN0LmRlYnVnO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHF1ZXJ5QXJyYXkgPSB0aGlzLnF1ZXJ5U3RyaW5nKCk7XG4gICAgICAgIGxldCBjb25mRGVidWcgPSB3aWRnZXQubWdSZWMuY29uZmlnLmRlYnVnO1xuXG4gICAgICAgIGlmIChxdWVyeUFycmF5Lm1nd2RlYnVnXG4gICAgICAgICAgICB8fCBxdWVyeUFycmF5WydtZ3dkZWJ1Z18nICsgd2lkZ2V0Lm1nUmVjLmNpZF1cbiAgICAgICAgICAgIHx8IChjb25mRGVidWcgJiYgdHlwZW9mIGNvbmZEZWJ1ZyAhPSAnc3RyaW5nJylcbiAgICAgICAgICAgIHx8ICh0eXBlb2YgY29uZkRlYnVnID09ICdzdHJpbmcnICYmIHBhcnNlSW50KGNvbmZEZWJ1ZykpXG4gICAgICAgICAgICB8fCB3aWRnZXQuYmxvY2suZ2V0QXR0cmlidXRlKCdkYXRhLW1nd2RlYnVnJykpIHtcbiAgICAgICAgICAgIHdpZGdldC5kZWJ1Z0ZsYWcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiDQvNCw0YHRgdC40LIg0LDRgNCz0YPQvNC10L3RgtC+0LIg0LjQtyBVUkxcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHN0YXRpYyBxdWVyeVN0cmluZygpIHtcbiAgICAgICAgbGV0IHF1ZXJ5QXJyYXkgPSB7fTtcbiAgICAgICAgbGV0IHF1ZXJ5ID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSk7XG4gICAgICAgIGxldCB2YXJzID0gcXVlcnkuc3BsaXQoJyYnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcGFpciA9IHZhcnNbaV0uc3BsaXQoJz0nKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcXVlcnlBcnJheVtwYWlyWzBdXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBxdWVyeUFycmF5W3BhaXJbMF1dID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhaXJbMV0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcXVlcnlBcnJheVtwYWlyWzBdXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBsZXQgYXJyO1xuICAgICAgICAgICAgICAgIGFyciA9IFtxdWVyeUFycmF5W3BhaXJbMF1dLCBkZWNvZGVVUklDb21wb25lbnQocGFpclsxXSldO1xuICAgICAgICAgICAgICAgIHF1ZXJ5QXJyYXlbcGFpclswXV0gPSBhcnI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1ZXJ5QXJyYXlbcGFpclswXV0ucHVzaChkZWNvZGVVUklDb21wb25lbnQocGFpclsxXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1ZXJ5QXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRi9Cy0L7QtNC40YIg0L7RgtC70LDQtNC+0YfQvdGD0Y4g0LjQvdGE0L7RgNC80LDRhtC40Y4g0L3QsCDQutC+0L3RgdC+0LvRjCDQv9GA0Lgg0YPRgdGC0LDQvdC+0LLQu9C10L3QvdC+0LwgZGVidWdGbGFnXG4gICAgICogQG1lbWJlcm9mIF9tZ0xpYiRMSUJWRVIkXG4gICAgICogQHBhcmFtIHsqfSBtZXNzYWdlXG4gICAgICovXG4gICAgZGVidWcobWVzc2FnZSkge1xuICAgICAgICBpZiAodGhpcy5kZWJ1Z0ZsYWcpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSAhPSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnTUdERUJVRzogJyArIG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7RGVidWd9O1xuIiwiLyoqIEBtb2R1bGUgc3R5bGVzICovXG5cbi8qKlxuICog0JrQu9Cw0YHRgSBTdHlsZXNcbiAqL1xuY2xhc3MgU3R5bGVzIHtcbiAgICAvKipcbiAgICAgKiDQlNC+0LHQsNCy0LvRj9C10YIg0Y3Qu9C10LzQtdC90YIgc3R5bGVzINCyIGhlYWQg0YEg0LTQsNC90L3Ri9C80Lgg0LjQtyDQutC+0L3RhNC40LPRg9GA0LDRhtC40Lgg0LjQvdGE0L7RgNC80LXRgNCwXG4gICAgICogQHBhcmFtIHtfbWdMaWIkTElCVkVSJH0gd2lkZ2V0IC0g0LHQuNCx0LvQuNC+0YLQtdC60LAg0LjQvdGE0L7RgNC80LXRgNC+0LJcbiAgICAgKi9cbiAgICBzdGF0aWMgaW5pdCh3aWRnZXQpIHtcbiAgICAgICAgaWYgKCF3aWRnZXQubWdSZWMuc3R5bGVzSW5pdGVkKSB7XG4gICAgICAgICAgICB3aWRnZXQubWdSZWMuc3R5bGVzSW5pdGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgbGV0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2NzcycpO1xuICAgICAgICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUod2lkZ2V0Lm1nUmVjLnN0eWxlcykpO1xuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7U3R5bGVzfTtcbiIsIi8qKiBAbW9kdWxlIHZpZGVvICovXG5cbi8qKlxuICog0JrQu9Cw0YHRgSBpbnJlYWQgKG91dC1zdHJlYW0pINCy0LjQtNC10L4g0LjQvdGE0L7RgNC80LXRgNCwXG4gKi9cbmNsYXNzIFZpZGVvIHtcbiAgICAvKipcbiAgICAgKiDQmtC+0L3RgdGC0YDRg9C60YLQvtGAINC60LvQsNGB0YHQsFxuICAgICAqIEBwYXJhbSB7X21nTGliJExJQlZFUiR9IHdpZGdldCAtINCx0LjQsdC70LjQvtGC0LXQutCwINC40L3RhNC+0YDQvNC10YDQvtCyXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iod2lkZ2V0KSB7XG4gICAgICAgIGxldCBjb25maWcgPSB3aWRnZXQubWdSZWMuY29uZmlnO1xuICAgICAgICB0aGlzLndpZGdldCA9IHdpZGdldDtcbiAgICAgICAgdGhpcy5qd3BsYXRmb3JtTG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuandwbGF0Zm9ybVVybCA9IGNvbmZpZy5qd3BsYXRmb3JtVXJsIHx8ICcvL2NvbnRlbnQuandwbGF0Zm9ybS5jb20vbGlicmFyaWVzL0M3TFlyaE5yLmpzJztcbiAgICAgICAgdGhpcy52ZWxvY2l0eVVybCA9IGNvbmZpZy52ZWxvY2l0eVVybCB8fCAnLy9jZG4ubWdpZC5jb20vanMvdmVsb2NpdHkubWluLmpzJztcbiAgICAgICAgdGhpcy52ZWxvY2l0eUxvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhcHBpbmdBZGRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZpcnN0UXVhcnRpbGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5taWRwb2ludCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRoaXJkUXVhcnRpbGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5naGl0cyA9IDA7XG4gICAgICAgIHRoaXMuandQbGF5ZXJTdGF0dXMgPSAnbm9uZSc7XG4gICAgICAgIHRoaXMuYm90dG9tTGlua1RleHQgPSAnQ2xpY2sgdG8gdmlzaXQgd2Vic2l0ZSc7XG4gICAgICAgIHRoaXMuc2Vuc29yVXJsID0gJy8vYy5tZ2lkLmNvbS92cy8nO1xuICAgICAgICB0aGlzLnVpZCA9IGNvbmZpZy51aWQ7XG5cbiAgICAgICAgdGhpcy5tZ1ZpZGVvSW5kZXggPSB3aWRnZXQubWdSZWMuY2lkICsgJ18nICsgd2lkZ2V0LmdldFdpZGdldHMoKS5sZW5ndGg7XG4gICAgICAgIHdpZGdldC5kZWJ1ZygnbWdWaWRlb0luZGV4OiAnICsgdGhpcy5tZ1ZpZGVvSW5kZXgpO1xuXG4gICAgICAgIHRoaXMuYWRkTGlicmFyaWVzKCk7XG5cbiAgICAgICAgbGV0IFdpZGdldENhcHBpbmcgPSB3aWRnZXQubW9kdWxlcy5XaWRnZXRDYXBwaW5nO1xuICAgICAgICB0aGlzLndpZGdldENhcHBpbmcgPSBuZXcgV2lkZ2V0Q2FwcGluZyh3aWRnZXQsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyV2lkZ2V0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLndpZGdldENhcHBpbmcuY2FwcGluZ1RpbWVzID0gY29uZmlnLmNhcHBpbmcgfHwgdGhpcy53aWRnZXRDYXBwaW5nLmNhcHBpbmdUaW1lcztcbiAgICAgICAgdGhpcy53aWRnZXRDYXBwaW5nLmNhcHBpbmdJbnRlcnZhbCA9IGNvbmZpZy5jYXBwaW5nSW50ZXJ2YWwgfHwgdGhpcy53aWRnZXRDYXBwaW5nLmNhcHBpbmdJbnRlcnZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0ZHRgiDRjdC60LfQtdC80L/Qu9GP0YAg0LrQu9Cw0YHRgdCwIFZpZGVvXG4gICAgICogQHBhcmFtIHtfbWdMaWIkTElCVkVSJH0gd2lkZ2V0IC0g0LHQuNCx0LvQuNC+0YLQtdC60LAg0LjQvdGE0L7RgNC80LXRgNC+0LJcbiAgICAgKi9cbiAgICBzdGF0aWMgaW5pdCh3aWRnZXQpIHtcbiAgICAgICAgd2lkZ2V0LnZpZGVvID0gbmV3IFZpZGVvKHdpZGdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0YDQuNGB0L7QstGL0LLQsNC10YIg0LjQvdGE0L7RgNC80LXRgCDQsiDRgdC60YDRi9GC0L7QvCDQstC40LTQtSDQuCDQuNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdGCIGp3cGxheWVyXG4gICAgICovXG4gICAgcmVuZGVyV2lkZ2V0KCkge1xuICAgICAgICBpZiAodGhpcy5qd3BsYXRmb3JtTG9hZGVkICYmIHRoaXMudmVsb2NpdHlMb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmRlYnVnKCdWaWRlbyByZW5kZXJXaWRnZXQnKTtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmJsb2NrLmNsYXNzTmFtZSArPSAnIG1nVmlkZW9Db250YWluZXJfJyArIHRoaXMud2lkZ2V0Lm1nUmVjLmNpZDtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmJsb2NrLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICB0aGlzLndpZGdldC5ibG9jay5zdHlsZS5oZWlnaHQgPSAnMXB4JztcbiAgICAgICAgICAgIHRoaXMuYWRkTG9nbygpO1xuICAgICAgICAgICAgdGhpcy5pbml0UGxheWVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcldpZGdldCgpO1xuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0L7QtNCz0YDRg9C20LDQtdGCINCx0LjQsdC70LjQvtGC0LXQutC4IGp3cGxheWVyINC4IHZlbG9jaXR5XG4gICAgICovXG4gICAgYWRkTGlicmFyaWVzKCkge1xuICAgICAgICBsZXQgandwbGF0Zm9ybUxpYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZ0p3cGxhdGZvcm0nKTtcbiAgICAgICAgaWYgKCFqd3BsYXRmb3JtTGliKSB7XG4gICAgICAgICAgICBqd3BsYXRmb3JtTGliID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICBqd3BsYXRmb3JtTGliLmlkID0gJ21nSndwbGF0Zm9ybSc7XG4gICAgICAgICAgICBqd3BsYXRmb3JtTGliLnNyYyA9IHRoaXMuandwbGF0Zm9ybVVybDtcbiAgICAgICAgICAgIGp3cGxhdGZvcm1MaWIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGp3cGxhdGZvcm1MaWIuc2V0QXR0cmlidXRlKCdkYXRhLWxvYWRlZCcsIHRydWUpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqd3BsYXRmb3JtTGliKTtcbiAgICAgICAgfSBlbHNlIGlmIChqd3BsYXRmb3JtTGliLmdldEF0dHJpYnV0ZSgnZGF0YS1sb2FkZWQnKSkge1xuICAgICAgICAgICAgdGhpcy5qd3BsYXRmb3JtTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2ZWxvY2l0eUxpYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZ1ZlbG9jaXR5Jyk7XG4gICAgICAgIGlmICghdmVsb2NpdHlMaWIpIHtcbiAgICAgICAgICAgIHZlbG9jaXR5TGliID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICB2ZWxvY2l0eUxpYi5pZCA9ICdtZ1ZlbG9jaXR5JztcbiAgICAgICAgICAgIHZlbG9jaXR5TGliLnNyYyA9IHRoaXMudmVsb2NpdHlVcmw7XG4gICAgICAgICAgICB2ZWxvY2l0eUxpYi5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmVsb2NpdHlMaWIuc2V0QXR0cmlidXRlKCdkYXRhLWxvYWRlZCcsIHRydWUpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh2ZWxvY2l0eUxpYik7XG4gICAgICAgIH0gZWxzZSBpZiAodmVsb2NpdHlMaWIuZ2V0QXR0cmlidXRlKCdkYXRhLWxvYWRlZCcpKSB7XG4gICAgICAgICAgICB0aGlzLnZlbG9jaXR5TG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuVmVsb2NpdHkgPSB0eXBlb2YgVmVsb2NpdHkgPT0gJ3VuZGVmaW5lZCcgP1xuICAgICAgICAgICAgICAgICh0eXBlb2YgJCA9PSAndW5kZWZpbmVkJyA/XG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgalF1ZXJ5ID09ICd1bmRlZmluZWQnID8gbnVsbCA6IGpRdWVyeS5WZWxvY2l0eSkgOiAkLlZlbG9jaXR5KSA6IFZlbG9jaXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmp3cGxhdGZvcm1Mb2FkZWQgfHwgIXRoaXMudmVsb2NpdHlMb2FkZWQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkTGlicmFyaWVzKCk7XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQlNC+0LHQsNCy0LvRj9C10YIgaHRtbCDRjdC70LXQvNC10L3RgtGLINC70L7Qs9C40YLQuNC/0LAsINC/0LvQtdC10YDQsCDQuCDRgdGB0YvQu9C60Lgg0L3QsCDRgNC10LrQu9Cw0LzQvtC00LDRgtC10LvRj1xuICAgICAqL1xuICAgIGFkZExvZ28oKSB7XG4gICAgICAgIGxldCBsb2dvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGxvZ28uc2V0QXR0cmlidXRlKCdpZCcsICdtZ1ZpZGVvTG9nb18nICsgdGhpcy5tZ1ZpZGVvSW5kZXgpO1xuICAgICAgICBsb2dvLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnbWdWaWRlb0xvZ29fJyArIHRoaXMud2lkZ2V0Lm1nUmVjLmNpZCArICcnKTtcbiAgICAgICAgbG9nby5pbm5lckhUTUwgPSAnPGEgaHJlZj1cImh0dHA6Ly9tZ2lkLmNvbS9cIj48aW1nIGNsYXNzPVwibWdWaWRlb0xvZ29JbWdfJ1xuICAgICAgICAgICAgKyB0aGlzLndpZGdldC5tZ1JlYy5jaWQgKyAnXCIgc3JjPVwiaHR0cDovL2Nkbi5tZ2lkLmNvbS9pbWFnZXMvUG93ZXJlZEJ5TWdpZC5zdmdcIj48L2E+JztcbiAgICAgICAgdGhpcy53aWRnZXQuYmxvY2suYXBwZW5kQ2hpbGQobG9nbyk7XG4gICAgICAgIGxldCBwbGF5ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcGxheWVyRGl2LnNldEF0dHJpYnV0ZSgnaWQnLCAnbWdKd1BsYXllcl8nICsgdGhpcy5tZ1ZpZGVvSW5kZXgpO1xuICAgICAgICB0aGlzLndpZGdldC5ibG9jay5hcHBlbmRDaGlsZChwbGF5ZXJEaXYpO1xuICAgICAgICBsZXQgYm90dG9tTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBib3R0b21MaW5rLnNldEF0dHJpYnV0ZSgnaWQnLCAnbWdWaWRlb0JvdHRvbUxpbmtfJyArIHRoaXMubWdWaWRlb0luZGV4KTtcbiAgICAgICAgYm90dG9tTGluay5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cIm1nVmlkZW9Cb3R0b21fJyArIHRoaXMud2lkZ2V0Lm1nUmVjLmNpZCArICdcIj48L2Rpdj4nO1xuICAgICAgICB0aGlzLndpZGdldC5ibG9jay5hcHBlbmRDaGlsZChib3R0b21MaW5rKTtcbiAgICB9XG5cbiAgICBpc01vYmlsZSgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1vYmlsZSAhPSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRoaXMubW9iaWxlID0gL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubW9iaWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0YDQvtCy0LXRgNC60LAg0L3QsCDQv9C+0LTQtNC10YDQttC60YMg0YTQu9C10YjQsFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGhhc0ZsYXNoKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZmxhc2ggIT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBsZXQgYSA9ICdTaG9ja3dhdmUnO1xuICAgICAgICAgICAgbGV0IGIgPSAnRmxhc2gnO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGEgPSBuZXcgQWN0aXZlWE9iamVjdChhICsgYiArICcuJyArIGEgKyBiKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBhID0gbmF2aWdhdG9yLnBsdWdpbnNbYSArICcgJyArIGJdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZsYXNoID0gISFhO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmxhc2g7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8gandwbGF5ZXIg0Lgg0L3QsNGB0YLRgNC+0LnQutCwINC+0LHRgNCw0LHQvtGC0YfQuNC60L7QsiDRgdC+0LHRi9GC0LjQuSDQvtGCINC90LXQs9C+XG4gICAgICovXG4gICAgaW5pdFBsYXllcigpIHtcbiAgICAgICAgdGhpcy53aWRnZXQuZGVidWcoJ0luaXQgcGxheWVyOiAnICsgdGhpcy5tZ1ZpZGVvSW5kZXgpO1xuICAgICAgICBsZXQgandJZCA9ICdtZ0p3UGxheWVyXycgKyB0aGlzLm1nVmlkZW9JbmRleDtcbiAgICAgICAgbGV0IG11dGUgPSB0aGlzLndpZGdldC5tZ1JlYy5jb25maWcubXV0ZTtcbiAgICAgICAgaWYgKG11dGUgJiYgdHlwZW9mIG11dGUgIT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG11dGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBtdXRlID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBtdXRlID0gISFwYXJzZUludChtdXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG11dGUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGp3cGxheWVyKGp3SWQpLnNldHVwKHtcbiAgICAgICAgICAgIGF1dG9zdGFydDogZmFsc2UsXG4gICAgICAgICAgICByZXBlYXQ6IGZhbHNlLFxuICAgICAgICAgICAgbXV0ZTogbXV0ZSxcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLndpZGdldC5tZ1JlYy5jb25maWcud2lkdGggfHwgJzEwMCUnLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLndpZGdldC5tZ1JlYy5jb25maWcuaGVpZ2h0IHx8ICcxMDAlJyxcbiAgICAgICAgICAgIHByaW1hcnk6ICh0aGlzLmhhc0ZsYXNoKCkgPyAnZmxhc2gnIDogJ2h0bWw1JyksXG4gICAgICAgICAgICBhZHZlcnRpc2luZzoge1xuICAgICAgICAgICAgICAgIGNsaWVudDogJ3Zhc3QnLFxuICAgICAgICAgICAgICAgIHRhZzogdGhpcy53aWRnZXQubWdSZWMuY29uZmlnLnZhc3QgKyAnP2ZsYXNoPScgKyAodGhpcy5oYXNGbGFzaCgpID8gMSA6IDApLFxuICAgICAgICAgICAgICAgIHNraXBvZmZzZXQ6IHRoaXMud2lkZ2V0Lm1nUmVjLmNvbmZpZy5za2lwb2Zmc2V0IHx8IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwbGF5bGlzdDogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZTogJy8vY29udGVudC5qd3BsYXRmb3JtLmNvbS90aHVtYnMvWEhjRVVDRmwtNzIwLmpwZycsXG4gICAgICAgICAgICAgICAgICAgIGxpbms6ICcvL2NvbnRlbnQuandwbGF0Zm9ybS5jb20vcHJldmlld3MvWEhjRVVDRmwnLFxuICAgICAgICAgICAgICAgICAgICBtZWRpYWlkOiAnWEhjRVVDRmwnLFxuICAgICAgICAgICAgICAgICAgICBwdWJkYXRlOiAnTW9uLCAzMCBNYXkgMjAxNiAxMzoxMzoxNCAtMDAwMCcsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiAnLy9jb250ZW50Lmp3cGxhdGZvcm0uY29tL3ZpZGVvcy9YSGNFVUNGbC1oN3g2YUdVVy5tcDQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMjQwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnMTgwcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZpZGVvL21wNCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDMyMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiAnLy9jb250ZW50Lmp3cGxhdGZvcm0uY29tL3ZpZGVvcy9YSGNFVUNGbC1KOHQ2M2Q2Uy5tcDQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnMjcwcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZpZGVvL21wNCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDQ4MFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiAnLy9jb250ZW50Lmp3cGxhdGZvcm0uY29tL3ZpZGVvcy9YSGNFVUNGbC1FRDBzSEdEUC5tNGEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogLTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdBQUMgQXVkaW8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhdWRpby9tcDQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAtMVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB0YWdzOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdBZHMnLFxuICAgICAgICAgICAgICAgICAgICB0cmFja3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiAnLy9jb250ZW50Lmp3cGxhdGZvcm0uY29tL3N0cmlwcy9YSGNFVUNGbC0xMjAudnR0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAndGh1bWJuYWlscydcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5qd3BsYXllciA9IGp3cGxheWVyKGp3SWQpO1xuXG4gICAgICAgIHRoaXMuandwbGF5ZXIub24oJ2NvbXBsZXRlJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5qd2NvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmp3cGxheWVyLm9uKCdhZFNraXBwZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmp3Y29tcGxldGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuandwbGF5ZXIub24oJ2FkQ29tcGxldGUnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmp3Y29tcGxldGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuandwbGF5ZXIub24oJ3BsYXknLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuandSZXNvbHV0aW9uSW5pdGVkKSB7XG4gICAgICAgICAgICAgICAgbGV0IHF1YWxpdHlMZXZlbHMgPSB0aGlzLmp3cGxheWVyLmdldFF1YWxpdHlMZXZlbHMoKTtcbiAgICAgICAgICAgICAgICBpZiAocXVhbGl0eUxldmVscyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVhbGl0eUxldmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1YWxpdHlMZXZlbHNbaV0ubGFiZWwgPT0gJzcyMHAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qd3BsYXllci5zZXRDdXJyZW50UXVhbGl0eShxdWFsaXR5TGV2ZWxzW2ldLmluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuandSZXNvbHV0aW9uSW5pdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuandwbGF5ZXIub24oJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja1BsYXllcigpO1xuICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmp3cGxheWVyLm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndpZGdldC5kZWJ1ZygnandwbGF5ZXIgZXJyb3I6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5qd3BsYXllci5vbignYWRFcnJvcicsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndpZGdldC5kZWJ1ZygnYWRFcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLmp3UGxheWVyU3RhdHVzID0gJ3N0b3AnO1xuICAgICAgICAgICAgaWYgKGUuY3JlYXRpdmV0eXBlID09ICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpZGdldC5kZWJ1ZygnQ2FuIG5vdCBwbGF5IGZsYXNoIGFkcyBpbiBIVE1MNSBwbGF5ZXIuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmp3cGxheWVyLm9uKCdhZFJlcXVlc3QnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhbGxTZW5zb3IoJ2xvYWQnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuandwbGF5ZXIub24oJ2FkTWV0YScsIChlKSA9PiB7XG4gICAgICAgICAgICBsZXQgbWdWaWRlb0JvdHRvbUxpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWdWaWRlb0JvdHRvbUxpbmtfJyArIHRoaXMubWdWaWRlb0luZGV4KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNsaWNrdGhyb3VnaCA9IGUuY2xpY2t0aHJvdWdoKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1nVmlkZW9Cb3R0b21MaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIG1nVmlkZW9Cb3R0b21MaW5rLmZpcnN0RWxlbWVudENoaWxkLmlubmVySFRNTCA9ICc8YSB0YXJnZXQ9XCJfYmxhbmtcIidcbiAgICAgICAgICAgICAgICAgICAgICAgICsgJ1wiIGNsYXNzPVwibWdWaWRlb0JvdHRvbUxpbmtBbmNob3JfJyArIHRoaXMud2lkZ2V0Lm1nUmVjLmNpZCArICdcIiBocmVmPVwiJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLmNsaWNrdGhyb3VnaCArICdcIj4nXG4gICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMuYm90dG9tTGlua1RleHQgKyAnPC9hPic7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGdIaXRzUG9zID0gdGhpcy5jbGlja3Rocm91Z2guaW5kZXhPZignL2doaXRzLycpO1xuICAgICAgICAgICAgICAgIGlmIChnSGl0c1BvcyAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdoaXRzID0gdGhpcy5jbGlja3Rocm91Z2guc3Vic3RyKGdIaXRzUG9zICsgNyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpY2t0aHJvdWdoLnNsaWNlKGdIaXRzUG9zICsgNykuaW5kZXhPZignLycpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1nVmlkZW9Cb3R0b21MaW5rKSB7XG4gICAgICAgICAgICAgICAgbWdWaWRlb0JvdHRvbUxpbmsuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuandwbGF5ZXIub24oJ2FkVGltZScsIChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZS5wb3NpdGlvbiA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkVGltZVN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuY2FwcGluZ0FkZGVkICYmIGUucG9zaXRpb24gPj0gMikge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FwcGluZ0FkZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLndpZGdldENhcHBpbmcuc2VuZEFkZENhcHBpbmcoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmZpcnN0UXVhcnRpbGUgJiYgZS5wb3NpdGlvbiAvIGUuZHVyYXRpb24gPiAwLjI1KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdFF1YXJ0aWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxTZW5zb3IoJ3ZpZGVvXzI1JywgZS5wb3NpdGlvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5taWRwb2ludCAmJiBlLnBvc2l0aW9uIC8gZS5kdXJhdGlvbiA+IDAuNSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWlkcG9pbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsbFNlbnNvcigndmlkZW9fNTAnLCBlLnBvc2l0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLnRoaXJkUXVhcnRpbGUgJiYgZS5wb3NpdGlvbiAvIGUuZHVyYXRpb24gPiAwLjc1KSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aGlyZFF1YXJ0aWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxTZW5zb3IoJ3ZpZGVvXzc1JywgZS5wb3NpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuandwbGF5ZXIub24oJ2FkSW1wcmVzc2lvbicsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lZGlhVHlwZSA9IGUuY3JlYXRpdmV0eXBlO1xuICAgICAgICAgICAgdGhpcy53aWRnZXQuZGVidWcoZS5jcmVhdGl2ZXR5cGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMubWVkaWFUeXBlID09ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Jykge1xuICAgICAgICAgICAgICAgIGxldCBhZFN0YXJ0SW50ID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmp3cGxheWVyLnNlZWsoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRUaW1lU3RhcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChhZFN0YXJ0SW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5qd1BsYXllclN0YXR1cyA9PSAnaGlkZGVuUGxheScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dQbGF5ZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmp3UGxheWVyU3RhdHVzID0gJ3BsYXknO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmp3cGxheWVyLm9uKCdhZFN0YXJ0ZWQnLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy53aWRnZXQuZGVidWcoJ1ZQQUlEIGFkU3RhcnRlZCcpO1xuICAgICAgICAgICAgaWYgKHRoaXMuandQbGF5ZXJTdGF0dXMgPT0gJ2hpZGRlblBsYXknKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aWRnZXQuZGVidWcoJ2FkU3RhcnRlZDogRm91bmQgaGlkZGVuUGxheScpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1BsYXllcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuandQbGF5ZXJTdGF0dXMgPSAncGxheSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrUGxheWVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0LLQvtGA0LDRh9C40LLQsNC90LjQtSDQv9C70LXQtdGA0LAg0L/QviDQvtC60L7QvdGH0LDQvdC40Y4g0YDQtdC60LvQsNC80L3QvtCz0L4g0YDQvtC70LjQutCwXG4gICAgICovXG4gICAgandjb21wbGV0ZSgpIHtcbiAgICAgICAgdGhpcy53aWRnZXQuYmxvY2suc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy5WZWxvY2l0eSh0aGlzLndpZGdldC5ibG9jaywgeyBoZWlnaHQ6IDAgfSwgMTAwMCk7XG4gICAgICAgIHRoaXMuandQbGF5ZXJTdGF0dXMgPSAnc3RvcCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHRgtCw0LLQuNGCINC/0LvQtdC10YAg0L3QsCDQv9Cw0YPQt9GDXG4gICAgICovXG4gICAgcGF1c2VQbGF5ZXIoKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuandwbGF5ZXIuZ2V0U3RhdGUoKTtcbiAgICAgICAgaWYgKHN0YXRlICE9ICdwYXVzZWQnKSB7XG4gICAgICAgICAgICB0aGlzLndpZGdldC5kZWJ1ZygnU3RhdGU6ICcgKyBzdGF0ZSArICcgU2VuZCBwYXVzZSBqd1BsYXllclN0YXR1czogJyArIHRoaXMuandQbGF5ZXJTdGF0dXMpO1xuICAgICAgICAgICAgdGhpcy5qd3BsYXllci5wYXVzZSgpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXVzZVBsYXllcigpO1xuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmRlYnVnKCdQbGF5ZXIgcGF1c2VkJyk7XG4gICAgICAgICAgICBpZiAodGhpcy5qd1BsYXllclN0YXR1cyAhPSAnc3RvcCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5qd1BsYXllclN0YXR1cyA9PSAnaGlkZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja1BsYXllcigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5qd1BsYXllclN0YXR1cyA9PSAncGxheScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFBsYXllcigpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0Y/QtdGCINGB0L7RgdC+0YLRj9C90LjQtSDQv9C70LXQtdGA0LAg0Lgg0L/QvtC/0LDQtNC10L3QuNC1INC10LPQviDQsiDQvtCx0LvQsNGB0YLRjCDQstC40LTQuNC80L7RgdGC0LhcbiAgICAgKiDQn9GA0Lgg0LjQt9C80L3QtdC90LjQuCDRgdC+0YHRgtC+0Y/QvdC40Y8g0LfQsNC/0YPRgdC60LDQtdGCINC40LvQuCDRgdGC0LDQstC40YIg0L3QsCDQv9Cw0YPQt9GDINCy0LjQtNC10L5cbiAgICAgKi9cbiAgICBjaGVja1BsYXllcigpIHtcbiAgICAgICAgbGV0IGp3cGxheWVyTWFya2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21nSndQbGF5ZXJfJyArIHRoaXMubWdWaWRlb0luZGV4KTtcbiAgICAgICAgbGV0IG1nVmlkZW8gPSB0aGlzLndpZGdldC5ibG9jaztcbiAgICAgICAgaWYgKHRoaXMuandQbGF5ZXJTdGF0dXMgPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICBqd3BsYXllck1hcmtlci5zdHlsZS53aWR0aCA9IHRoaXMud2lkZ2V0Lm1nUmVjLmNvbmZpZy53aWR0aDtcbiAgICAgICAgICAgIGxldCBtZ1ZpZGVvTG9nbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZ1ZpZGVvTG9nb18nICsgdGhpcy5tZ1ZpZGVvSW5kZXgpO1xuICAgICAgICAgICAgbGV0IG1nVmlkZW9Mb2dvU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShtZ1ZpZGVvTG9nbyk7XG4gICAgICAgICAgICB0aGlzLmxvZ29PZmZzZXRCb3R0b20gPSBtZ1ZpZGVvTG9nb1N0eWxlLm1hcmdpbkJvdHRvbTtcbiAgICAgICAgICAgIHRoaXMubG9nb09mZnNldCA9IHRoaXMubG9nb09mZnNldEJvdHRvbSA/IHBhcnNlSW50KHRoaXMubG9nb09mZnNldEJvdHRvbS5zbGljZSgwLCAtMikpIDogMDtcbiAgICAgICAgICAgIHRoaXMuandQbGF5ZXJIZWlnaHQgPSBqd3BsYXllck1hcmtlci5vZmZzZXRIZWlnaHQgKyBtZ1ZpZGVvTG9nby5vZmZzZXRIZWlnaHQgKyB0aGlzLmxvZ29PZmZzZXQ7XG4gICAgICAgICAgICB0aGlzLndpZGdldC5kZWJ1ZygnandQbGF5ZXJIZWlnaHQ6ICcgKyB0aGlzLmp3UGxheWVySGVpZ2h0KTtcbiAgICAgICAgICAgIG1nVmlkZW8uc3R5bGUud2lkdGggPSAnNnB4JztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsZWRJbnRvVmlldyhtZ1ZpZGVvLCAwLjUpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5qd3BsYXllci5nZXRTdGF0ZSgpID09ICdwbGF5aW5nJyAmJiB0aGlzLmp3UGxheWVyU3RhdHVzICE9ICdwbGF5J1xuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmp3UGxheWVyU3RhdHVzICE9ICdzdG9wJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1BsYXllcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuandQbGF5ZXJTdGF0dXMgPSAncGxheSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmRlYnVnKCdpc1Njcm9sbGVkSW50b1ZpZXc6IHRydWUgU3RhdHVzOiAnICsgdGhpcy5qd1BsYXllclN0YXR1cyk7XG4gICAgICAgICAgICBpZiAodGhpcy5qd1BsYXllclN0YXR1cyA9PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0UGxheWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5qd1BsYXllclN0YXR1cyA9ICdoaWRkZW5QbGF5JztcbiAgICAgICAgICAgICAgICB0aGlzLndpZGdldC5kZWJ1ZygnY2hlY2tQbGF5ZXI6IENoYW5nZSBzdGF0dXMgdG8gaGlkZGVuUGxheS4nKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5qd1BsYXllclN0YXR1cyA9PSAnaGlkZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0UGxheWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5qd1BsYXllclN0YXR1cyA9ICdoaWRkZW5QbGF5JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5qd1BsYXllclN0YXR1cyA9PSAncGF1c2UnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFBsYXllcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuandQbGF5ZXJTdGF0dXMgPSAncGxheSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5qd3BsYXllci5nZXRTdGF0ZSgpID09ICdwYXVzZWQnKSB0aGlzLmp3UGxheWVyU3RhdHVzID0gJ3BhdXNlJztcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0LmRlYnVnKCdpc1Njcm9sbGVkSW50b1ZpZXc6IGZhbHNlIFN0YXR1czogJyArIHRoaXMuandQbGF5ZXJTdGF0dXMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuandQbGF5ZXJTdGF0dXMgPT0gJ3BsYXknICYmICh0aGlzLnNob3dlbkp3UHggLyB0aGlzLmp3UGxheWVySGVpZ2h0IDwgMC41KSkge1xuICAgICAgICAgICAgICAgIHRoaXMud2lkZ2V0LmRlYnVnKCdjaGVja1BsYXllcjogQ2hhbmdlIHN0YXR1cyB0byBwYXVzZS4nKTtcbiAgICAgICAgICAgICAgICB0aGlzLmp3cGxheWVyLnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5qd1BsYXllclN0YXR1cyA9ICdwYXVzZSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuandQbGF5ZXJTdGF0dXMgPT0gJ3BhdXNlJyAmJiAodGhpcy5zaG93ZW5Kd1B4IC8gdGhpcy5qd1BsYXllckhlaWdodCA+IDAuNSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0UGxheWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5qd1BsYXllclN0YXR1cyA9ICdwbGF5JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5qd1BsYXllclN0YXR1cyA9PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmp3UGxheWVyU3RhdHVzID0gJ2hpZGUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0LrQsCDQvdCwINC/0L7Qv9Cw0LTQsNC90LjQtSDRjdC70LXQvNC10L3RgtCwINCyINC+0LHQu9Cw0YHRgtGMINCy0LjQtNC40LzQvtGB0YLQuFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0gLSDQn9GA0L7QstC10YDRj9C10LzRi9C5INGN0LvQtdC80LXQvdGCXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHNob3dlblBhcnQgLSDQldGB0LvQuCDRh9C40YHQu9C+IDwgMSDQuCA+IDAsINGC0L4g0L/RgNC+0LLQtdC60LAg0LHRg9C00LXRgiDRg9GB0L/QtdGI0L3QvtC5INC10YHQu9C4INCyINC+0LHQu9Cw0YHRgtC4INCy0LjQtNC40LzQvtGB0YLQuCDRgtC+0LvRjNC60L5cbiAgICAgKiDRh9Cw0YHRgtGMINGN0LvQtdC80LXQvdGC0LAg0YDQsNCy0L3QsNGPIHNob3dlblBhcnQgKiAxMDAlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNTY3JvbGxlZEludG9WaWV3KGVsZW0sIHNob3dlblBhcnQgPSAxKSB7XG4gICAgICAgIGxldCBkb2NWaWV3VG9wID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XG4gICAgICAgIGxldCB3aW5kb3dIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICAgICAgICAgIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICAgICAgICAgIHx8IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0O1xuICAgICAgICBsZXQgZG9jVmlld0JvdHRvbSA9IGRvY1ZpZXdUb3AgKyB3aW5kb3dIZWlnaHQ7XG5cbiAgICAgICAgbGV0IGVsZW1Ub3AgPSB0aGlzLmdldE9mZnNldFRvcChlbGVtKTtcbiAgICAgICAgbGV0IGVsZW1Cb3R0b20gPSBlbGVtVG9wICsgdGhpcy5qd1BsYXllckhlaWdodCAtIHRoaXMubG9nb09mZnNldDtcbiAgICAgICAgaWYgKGVsZW1Ub3AgPCBkb2NWaWV3VG9wICYmIGVsZW1Cb3R0b20gPiBkb2NWaWV3VG9wKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dlbkp3UHggPSBlbGVtQm90dG9tIC0gZG9jVmlld1RvcDtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtVG9wIDwgZG9jVmlld0JvdHRvbSAmJiBlbGVtQm90dG9tID4gZG9jVmlld0JvdHRvbSkge1xuICAgICAgICAgICAgdGhpcy5zaG93ZW5Kd1B4ID0gZG9jVmlld0JvdHRvbSAtIGVsZW1Ub3A7XG4gICAgICAgIH0gZWxzZSBpZiAoKGVsZW1Cb3R0b20gPD0gZG9jVmlld0JvdHRvbSkgJiYgKGVsZW1Ub3AgPj0gZG9jVmlld1RvcCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd2VuSndQeCA9IHRoaXMuandQbGF5ZXJIZWlnaHQgLSB0aGlzLmxvZ29PZmZzZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dlbkp3UHggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICgoKGVsZW1Cb3R0b20gLSAoKDEgLSBzaG93ZW5QYXJ0KSAqIHRoaXMuandQbGF5ZXJIZWlnaHQpKSA8PSBkb2NWaWV3Qm90dG9tKVxuICAgICAgICAmJiAoKGVsZW1Ub3AgKyAoKDEgLSBzaG93ZW5QYXJ0KSAqIHRoaXMuandQbGF5ZXJIZWlnaHQpKSA+PSBkb2NWaWV3VG9wKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QvtC70YPRh9C40YLRjCDRgdC80LXRidC10L3QuNC1INGN0LvQtdC80LXQvdGC0LAg0L7RgiDQvdCw0YfQsNC70LAg0YHRgtGA0LDQvdC40YbRi1xuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0gLSDQn9GA0L7QstC10YDRj9C10LzRi9C5INGN0LvQtdC80LXQvdGCXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXRPZmZzZXRUb3AoZWxlbSkge1xuICAgICAgICBsZXQgYm94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgbGV0IGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICBsZXQgZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgbGV0IHNjcm9sbFRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2NFbGVtLnNjcm9sbFRvcCB8fCBib2R5LnNjcm9sbFRvcDtcbiAgICAgICAgbGV0IGNsaWVudFRvcCA9IGRvY0VsZW0uY2xpZW50VG9wIHx8IGJvZHkuY2xpZW50VG9wIHx8IDA7XG4gICAgICAgIGxldCB0b3AgPSBib3gudG9wICsgc2Nyb2xsVG9wIC0gY2xpZW50VG9wO1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh0b3ApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCX0LDQv9GD0YHQutCw0LXRgiDQv9GA0L7QuNCz0YDRi9Cy0LDQvdC40LUg0LLQuNC00LXQvlxuICAgICAqL1xuICAgIHN0YXJ0UGxheWVyKCkge1xuICAgICAgICB0aGlzLndpZGdldC5kZWJ1Zygnc3RhcnRQbGF5ZXI6IFNlbmQgcGxheS4nKTtcbiAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgdGhpcy5qd3BsYXllci5zZXRNdXRlKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWVkaWFUeXBlID09ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Jykge1xuICAgICAgICAgICAgdGhpcy5qd3BsYXllci5zZWVrKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmp3cGxheWVyLnBsYXkoKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KDQsNC30LLQvtGA0LDRh9C40LLQsNC10YIg0L/Qu9C10LXRgFxuICAgICAqL1xuICAgIHNob3dQbGF5ZXIoKSB7XG4gICAgICAgIGxldCBtZ1ZpZGVvID0gdGhpcy53aWRnZXQuYmxvY2s7XG4gICAgICAgIG1nVmlkZW8uc3R5bGUud2lkdGggPSB0aGlzLndpZGdldC5tZ1JlYy5jb25maWcud2lkdGhcbiAgICAgICAgICAgICsgKHRoaXMud2lkZ2V0Lm1nUmVjLmNvbmZpZy53aWR0aC50b1N0cmluZygpLnN1YnN0cigtMSwgMSkgPT0gJyUnID8gJycgOiAncHgnKTtcbiAgICAgICAgdGhpcy53aWRnZXQuZGVidWcoJ3Nob3dQbGF5ZXI6IFdpZHRoOiAnICsgbWdWaWRlby5zdHlsZS53aWR0aCk7XG4gICAgICAgIHRoaXMuVmVsb2NpdHkobWdWaWRlbywgeyBoZWlnaHQ6IHRoaXMuandQbGF5ZXJIZWlnaHQgfSwge1xuICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBtZ1ZpZGVvLnN0eWxlLm92ZXJmbG93ID0gJ3Vuc2V0JztcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0YLQv9GA0LDQstC70Y/QtdGCINC30LDQv9GA0L7RgSDQvdCwIHZpZGVvX3NlbnNvciBjINGD0LrQsNC30LDQvdC90YvQvCDQsiDQv9Cw0YDQsNC80LXRgtGA0LDRhSDRgdC+0LHRi9GC0LjQtdC8XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtINCh0L7QsdGL0YLQuNC1XG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHRpbWVPZmZzZXQgLSDQmtC+0LvQuNGH0LXRgdGC0LLQviDRgdC10LrRg9C90LQg0L/RgNC+0LjQs9GA0LDQvdC90L7Qs9C+INCy0LjQtNC10L5cbiAgICAgKi9cbiAgICBjYWxsU2Vuc29yKGV2ZW50TmFtZSwgdGltZU9mZnNldCA9IDApIHtcbiAgICAgICAgbGV0IGltZzBnaWYgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgbGV0IHJuZCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDY1NTM1KTtcbiAgICAgICAgaW1nMGdpZi5zcmMgPSB0aGlzLnNlbnNvclVybCArICc/dGlkPScgKyB0aGlzLmdoaXRzICsgJyZpaWQ9JyArIHRoaXMudWlkICsgJyZlPScgKyBldmVudE5hbWUgK1xuICAgICAgICAgICAgJyZvPScgKyBwYXJzZUludCh0aW1lT2Zmc2V0KSArICcmYz0nICsgcm5kO1xuICAgIH1cblxufVxuXG5leHBvcnQge1ZpZGVvfTtcbiIsIi8qKiBAbW9kdWxlIHdpZGdldENhcHBpbmcgKi9cblxuLyoqXG4gKiDQmtC70LDRgdGBIFdpZGdldENhcHBpbmdcbiAqL1xuY2xhc3MgV2lkZ2V0Q2FwcGluZyB7XG4gICAgLyoqXG4gICAgICog0JrQvtC90YHRgtGA0YPQutGC0L7RgCDQutC70LDRgdGB0LAgV2lkZ2V0Q2FwcGluZ1xuICAgICAqIEBwYXJhbSB7X21nTGliJExJQlZFUiR9IHdpZGdldCAtINCx0LjQsdC70LjQvtGC0LXQutCwINC40L3RhNC+0YDQvNC10YDQvtCyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcmVuZGVyV2lkZ2V0IC0g0YTRg9C90LrRhtC40Y8sINC60L7RgtC+0YDQsNGPINCx0YPQtNC10YIg0LLRi9C30YvQstCw0YLRjNGB0Y8g0LTQu9GPINC+0YLRgNC40YHQvtCy0LrQuCDQuNC90YTQvtGA0LzQtdGA0LBcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih3aWRnZXQsIHJlbmRlcldpZGdldCkge1xuICAgICAgICB0aGlzLndpZGdldCA9IHdpZGdldDtcbiAgICAgICAgdGhpcy5yZW5kZXJXaWRnZXQgPSByZW5kZXJXaWRnZXQ7XG4gICAgICAgIHRoaXMuY2FwcGluZ1RpbWVzID0gMDtcbiAgICAgICAgdGhpcy5jYXBwaW5nSW50ZXJ2YWwgPSAyNDtcbiAgICAgICAgdGhpcy5yZW5kZXJlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuYWRkSWZyYW1lKCk7XG5cbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdGVuZXIoZSk7XG5cbiAgICAgICAgfSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCU0L7QsdCw0LLQu9GP0LXRgiDQvdCwINGB0YLRgNCw0L3QuNGG0YMgaWZyYW1lINC00LvRjyDQutC10L/Qv9C40L3Qs9CwXG4gICAgICovXG4gICAgYWRkSWZyYW1lKCkge1xuICAgICAgICBpZiAodGhpcy53aWRnZXQuaXNET01Db250ZW50TG9hZGVkKCkpIHtcbiAgICAgICAgICAgIGxldCBpZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21nQ2FwcGluZ0lmcmFtZScpO1xuICAgICAgICAgICAgaWYgKCFpZnJhbWVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgICAgIGlmcmFtZUVsZW1lbnQuaWQgPSAnbWdDYXBwaW5nSWZyYW1lJztcbiAgICAgICAgICAgICAgICBpZnJhbWVFbGVtZW50LnNyYyA9IHRoaXMud2lkZ2V0LmxpYkNvbmZpZy52aWRlb0NhcHBpbmdVcmw7XG4gICAgICAgICAgICAgICAgaWZyYW1lRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgIGlmcmFtZUVsZW1lbnQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1sb2FkZWQnLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRJZnJhbWUoKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpZnJhbWVFbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWZyYW1lRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbG9hZGVkJykpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWVzc2FnZVNlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnZ2V0Q2FwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjaWQ6IHRoaXMud2lkZ2V0Lm1nUmVjLmNpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpYlZlcjogJyRMSUJWRVIkJ1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53aWRnZXQuZGVidWcoJ1NlbmQgZ2V0Q2FwcGluZzogJyArIG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UobWVzc2FnZSwgJyonKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkSWZyYW1lKCk7XG4gICAgICAgIH0sIDUwMCk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0L7RgtGH0LjQuiDRgdC+0L7QsdGJ0LXQvdC40Lkg0L7RgiBjYXBwaW5nIGlmcmFtZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0g0KHQvtCx0YvRgtC40LVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZS5kYXRhIC0g0JTQsNC90L3Ri9C1INC/0LXRgNC10LTQsNC90L3Ri9C1INCyINGB0L7QsdGL0YLQuNC4XG4gICAgICovXG4gICAgbWVzc2FnZUxpc3RlbmVyKGUpIHtcbiAgICAgICAgdGhpcy53aWRnZXQuZGVidWcoJ21lc3NhZ2VMaXN0ZW5lcjogJyArIHRoaXMud2lkZ2V0Lm1nUmVjLmNpZCk7XG4gICAgICAgIHRoaXMud2lkZ2V0LmRlYnVnKGUuZGF0YSk7XG4gICAgICAgIGlmICh0eXBlb2YgZS5kYXRhICE9ICd1bmRlZmluZWQnICYmIGUuZGF0YSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgcmVxID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVxLmFjdGlvbiAhPSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVxLmFjdGlvbiA9PSAncmV0dXJuQ2FwcGluZycgJiYgcmVxLmxpYlZlciA9PSAnJExJQlZFUiQnXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiByZXEuY2lkID09IHRoaXMud2lkZ2V0Lm1nUmVjLmNpZCAmJiAhdGhpcy5yZW5kZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FwcGluZ1RpbWVzID09IDAgfHwgdGhpcy5jYXBwaW5nVGltZXMgPiByZXEuY2FwcGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyV2lkZ2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2lkZ2V0LmRlYnVnKCdXaWRnZXRDYXBwaW5nIGNhcHBpbmdUaW1lcyBleGNpc2VkLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntGC0YDQsNCy0LvRj9C10YIg0YHQvtC+0LHRidC10L3QuNC1IGNhcHBpbmcgaWZyYW1lINC00LvRjyDRg9Cy0LXQu9C40YfQtdC90LjRjyDRgdGH0ZHRgtGH0LjQutCwINC/0L7QutCw0LfQvtCyXG4gICAgICovXG4gICAgc2VuZEFkZENhcHBpbmcoKSB7XG4gICAgICAgIGxldCBpZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21nQ2FwcGluZ0lmcmFtZScpO1xuICAgICAgICBsZXQgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ2FkZENhcHBpbmcnLCBjaWQ6IHRoaXMud2lkZ2V0Lm1nUmVjLmNpZCwgbGliVmVyOiAnJExJQlZFUiQnLFxuICAgICAgICAgICAgaW50ZXJ2YWw6IHRoaXMuY2FwcGluZ0ludGVydmFsXG4gICAgICAgIH0pO1xuICAgICAgICBpZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UobWVzc2FnZSwgJyonKTtcblxuICAgIH1cbn1cblxuZXhwb3J0IHtXaWRnZXRDYXBwaW5nfTtcbiJdfQ==