Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
- <head>
- <meta charset="UTF-8">
- </head>
- <head>
- <title>Портал обучения и развития ГК "Белуга Групп"</title>
- <link rel="apple-touch-icon" sizes="180x180" href="download_file.html?file_id=6580249293358135002">
- <link rel="icon" type="image/png" sizes="32x32" href="download_file.html?file_id=6580249740371323075">
- <link rel="icon" type="image/png" sizes="16x16" href="download_file.html?file_id=6580249635751793539">
- <!-- <link rel="manifest" href="/site.webmanifest"> -->
- <link rel="SHORTCUT ICON" type="image/x-icon" href="download_file.html?file_id=6580249487043410683"/>
- <link rel="mask-icon" href="download_file.html?file_id=6580250129698875782" color="#5bbad5">
- <meta name="msapplication-TileColor" content="#da532c">
- <meta name="theme-color" content="#ffffff">
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <script type="text/javascript" src="scripts/jquery.js" language="javascript"></script>
- <script type="text/javascript" src="scripts/main_functions.js" language="javascript"></script>
- <script type="text/javascript" src="scripts/wt-common.js" language="javascript"></script>
- <script type="text/javascript" src="scripts/wt-game.js" language="javascript"></script>
- <!-- <script type="text/javascript" src="scripts/jquery.ui.totop.js" language="javascript"></script> -->
- <script type="text/javascript" src="scripts/jquery.easing.1.3.js" language="javascript"></script>
- <script type="text/javascript" src="scripts/jqplugins/qtip/jquery.qtip.min.js" language="javascript"></script>
- <link href="wt-game.css" rel="stylesheet" type="text/css"/>
- <meta name="viewport" content="width=device-width">
- <link href="scripts/jqplugins/qtip/jquery.qtip.min.css" rel="stylesheet" type="text/css"/>
- <link rel="stylesheet" href="fonts/fontico/style.css" type="text/css">
- <link href="custom_web_template.html?object_id=6034009707764127317" rel="stylesheet" type="text/css"/>
- <link rel="stylesheet" href="scripts/extjs-5/build/packages/ext-theme-crisp/build/resources/ext-theme-crisp-all.css" type="text/css">
- <link rel="stylesheet" href="pp/Ext5/player.css" type="text/css">
- <link href="custom_web_template.html?object_id=6015134018786367009" rel="stylesheet" type="text/css"/>
- <!-- IE9 uses the same CSS rules as W3C. Older versions may need some CSS fixes. Files below are here to apply these fixes. IE6 is not supported anymore -->
- <!--[if lte IE 8]><link rel="stylesheet" type="text/css" href="/ie8-lte.css" /><![endif]-->
- <!--[if lte IE 7]><link rel="stylesheet" type="text/css" href="/ie7-lte.css" /><![endif]-->
- </head>
- <link rel="stylesheet" href="fonts/fontico/style.css" type="text/css">
- <link href="/custom_web_template.html?object_id=5725320134341301769" rel="stylesheet" type="text/css"/>
- <link href="custom_web_template.html?object_id=6034009707764127317" rel="stylesheet" type="text/css"/>
- <link href="/custom_web_template.html?object_id=6039881813288121903" rel="stylesheet" type="text/css"/>
- <link href="/custom_web_template.html?object_code=beluga_assessment_style" rel="stylesheet" type="text/css"/>
- <body id="wt-body" onload="OnLoad()" onresize="OnResize()">
- <script>
- var s = location.href;
- if (s.indexOf("logout:true@") > 0)
- {
- location.href = window.location.protocol+"//" +window.location.host + window.location.pathname + window.location.search;
- }
- </script>
- <script>
- /**
- * Intro.js v0.9.0
- * https://github.com/usablica/intro.js
- * MIT licensed
- *
- * Copyright (C) 2013 usabli.ca - A weekend project by Afshin Mehrabani (@afshinmeh)
- */
- (function (root, factory) {
- if (typeof exports === 'object') {
- // CommonJS
- factory(exports);
- } else if (typeof define === 'function' && define.amd) {
- // AMD. Register as an anonymous module.
- define(['exports'], factory);
- } else {
- // Browser globals
- factory(root);
- }
- } (this, function (exports) {
- //Default config/variables
- var VERSION = '0.9.0';
- /**
- * IntroJs main class
- *
- * @class IntroJs
- */
- function IntroJs(obj) {
- this._targetElement = obj;
- this._options = {
- /* Next button label in tooltip box */
- /*nextLabel: 'Next →',*/
- nextLabel: 'Далее →',
- /* Previous button label in tooltip box */
- /* prevLabel: '← Back',*/
- prevLabel: '← Назад',
- /* Skip button label in tooltip box */
- /* skipLabel: 'Skip', */
- skipLabel: 'Пропустить',
- /* Done button label in tooltip box */
- /* doneLabel: 'Done',*/
- doneLabel: 'Готово',
- /* Default tooltip box position */
- tooltipPosition: 'bottom',
- /* Next CSS class for tooltip boxes */
- tooltipClass: '',
- /* Close introduction when pressing Escape button? */
- exitOnEsc: true,
- /* Close introduction when clicking on overlay layer? */
- exitOnOverlayClick: true,
- /* Show step numbers in introduction? */
- showStepNumbers: true,
- /* Let user use keyboard to navigate the tour? */
- keyboardNavigation: true,
- /* Show tour control buttons? */
- showButtons: true,
- /* Show tour bullets? */
- showBullets: true,
- /* Scroll to highlighted element? */
- scrollToElement: true,
- /* Set the overlay opacity */
- overlayOpacity: 0.8
- };
- }
- /**
- * Initiate a new introduction/guide from an element in the page
- *
- * @api private
- * @method _introForElement
- * @param {Object} targetElm
- * @returns {Boolean} Success or not?
- */
- function _introForElement(targetElm) {
- var introItems = [],
- self = this;
- if (this._options.steps) {
- //use steps passed programmatically
- var allIntroSteps = [];
- for (var i = 0, stepsLength = this._options.steps.length; i < stepsLength; i++) {
- var currentItem = _cloneObject(this._options.steps[i]);
- //set the step
- currentItem.step = introItems.length + 1;
- //use querySelector function only when developer used CSS selector
- if (typeof(currentItem.element) === 'string') {
- //grab the element with given selector from the page
- currentItem.element = document.querySelector(currentItem.element);
- }
- //intro without element
- if (typeof(currentItem.element) === 'undefined' || currentItem.element == null) {
- var floatingElementQuery = document.querySelector(".introjsFloatingElement");
- if (floatingElementQuery == null) {
- floatingElementQuery = document.createElement('div');
- floatingElementQuery.className = 'introjsFloatingElement';
- document.body.appendChild(floatingElementQuery);
- }
- currentItem.element = floatingElementQuery;
- currentItem.position = 'floating';
- }
- if (currentItem.element != null) {
- introItems.push(currentItem);
- }
- }
- } else {
- //use steps from data-* annotations
- var allIntroSteps = targetElm.querySelectorAll('*[data-intro]');
- //if there's no element to intro
- if (allIntroSteps.length < 1) {
- return false;
- }
- //first add intro items with data-step
- for (var i = 0, elmsLength = allIntroSteps.length; i < elmsLength; i++) {
- var currentElement = allIntroSteps[i];
- var step = parseInt(currentElement.getAttribute('data-step'), 10);
- if (step > 0) {
- introItems[step - 1] = {
- element: currentElement,
- intro: currentElement.getAttribute('data-intro'),
- step: parseInt(currentElement.getAttribute('data-step'), 10),
- tooltipClass: currentElement.getAttribute('data-tooltipClass'),
- position: currentElement.getAttribute('data-position') || this._options.tooltipPosition
- };
- }
- }
- //next add intro items without data-step
- //todo: we need a cleanup here, two loops are redundant
- var nextStep = 0;
- for (var i = 0, elmsLength = allIntroSteps.length; i < elmsLength; i++) {
- var currentElement = allIntroSteps[i];
- if (currentElement.getAttribute('data-step') == null) {
- while (true) {
- if (typeof introItems[nextStep] == 'undefined') {
- break;
- } else {
- nextStep++;
- }
- }
- introItems[nextStep] = {
- element: currentElement,
- intro: currentElement.getAttribute('data-intro'),
- step: nextStep + 1,
- tooltipClass: currentElement.getAttribute('data-tooltipClass'),
- position: currentElement.getAttribute('data-position') || this._options.tooltipPosition
- };
- }
- }
- }
- //removing undefined/null elements
- var tempIntroItems = [];
- for (var z = 0; z < introItems.length; z++) {
- introItems[z] && tempIntroItems.push(introItems[z]); // copy non-empty values to the end of the array
- }
- introItems = tempIntroItems;
- //Ok, sort all items with given steps
- introItems.sort(function (a, b) {
- return a.step - b.step;
- });
- //set it to the introJs object
- self._introItems = introItems;
- //add overlay layer to the page
- if(_addOverlayLayer.call(self, targetElm)) {
- //then, start the show
- _nextStep.call(self);
- var skipButton = targetElm.querySelector('.introjs-skipbutton'),
- nextStepButton = targetElm.querySelector('.introjs-nextbutton');
- self._onKeyDown = function(e) {
- if (e.keyCode === 27 && self._options.exitOnEsc == true) {
- //escape key pressed, exit the intro
- _exitIntro.call(self, targetElm);
- //check if any callback is defined
- if (self._introExitCallback != undefined) {
- self._introExitCallback.call(self);
- }
- } else if(e.keyCode === 37) {
- //left arrow
- _previousStep.call(self);
- } else if (e.keyCode === 39 || e.keyCode === 13) {
- //right arrow or enter
- _nextStep.call(self);
- //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers
- if(e.preventDefault) {
- e.preventDefault();
- } else {
- e.returnValue = false;
- }
- }
- };
- self._onResize = function(e) {
- _setHelperLayerPosition.call(self, document.querySelector('.introjs-helperLayer'));
- };
- if (window.addEventListener) {
- if (this._options.keyboardNavigation) {
- window.addEventListener('keydown', self._onKeyDown, true);
- }
- //for window resize
- window.addEventListener("resize", self._onResize, true);
- } else if (document.attachEvent) { //IE
- if (this._options.keyboardNavigation) {
- document.attachEvent('onkeydown', self._onKeyDown);
- }
- //for window resize
- document.attachEvent("onresize", self._onResize);
- }
- }
- return false;
- }
- /*
- * makes a copy of the object
- * @api private
- * @method _cloneObject
- */
- function _cloneObject(object) {
- if (object == null || typeof (object) != 'object' || typeof (object.nodeType) != 'undefined') {
- return object;
- }
- var temp = {};
- for (var key in object) {
- temp[key] = _cloneObject(object[key]);
- }
- return temp;
- }
- /**
- * Go to specific step of introduction
- *
- * @api private
- * @method _goToStep
- */
- function _goToStep(step) {
- //because steps starts with zero
- this._currentStep = step - 2;
- if (typeof (this._introItems) !== 'undefined') {
- _nextStep.call(this);
- }
- }
- /**
- * Go to next step on intro
- *
- * @api private
- * @method _nextStep
- */
- function _nextStep() {
- this._direction = 'forward';
- if (typeof (this._currentStep) === 'undefined') {
- this._currentStep = 0;
- } else {
- ++this._currentStep;
- }
- if ((this._introItems.length) <= this._currentStep) {
- //end of the intro
- //check if any callback is defined
- if (typeof (this._introCompleteCallback) === 'function') {
- this._introCompleteCallback.call(this);
- }
- _exitIntro.call(this, this._targetElement);
- return;
- }
- var nextStep = this._introItems[this._currentStep];
- if (typeof (this._introBeforeChangeCallback) !== 'undefined') {
- this._introBeforeChangeCallback.call(this, nextStep.element);
- }
- _showElement.call(this, nextStep);
- }
- /**
- * Go to previous step on intro
- *
- * @api private
- * @method _nextStep
- */
- function _previousStep() {
- this._direction = 'backward';
- if (this._currentStep === 0) {
- return false;
- }
- var nextStep = this._introItems[--this._currentStep];
- if (typeof (this._introBeforeChangeCallback) !== 'undefined') {
- this._introBeforeChangeCallback.call(this, nextStep.element);
- }
- _showElement.call(this, nextStep);
- }
- /**
- * Exit from intro
- *
- * @api private
- * @method _exitIntro
- * @param {Object} targetElement
- */
- function _exitIntro(targetElement) {
- //remove overlay layer from the page
- var overlayLayer = targetElement.querySelector('.introjs-overlay');
- //return if intro already completed or skipped
- if (overlayLayer == null) {
- return;
- }
- //for fade-out animation
- overlayLayer.style.opacity = 0;
- setTimeout(function () {
- if (overlayLayer.parentNode) {
- overlayLayer.parentNode.removeChild(overlayLayer);
- }
- }, 500);
- //remove all helper layers
- var helperLayer = targetElement.querySelector('.introjs-helperLayer');
- if (helperLayer) {
- helperLayer.parentNode.removeChild(helperLayer);
- }
- //remove intro floating element
- var floatingElement = document.querySelector('.introjsFloatingElement');
- if (floatingElement) {
- floatingElement.parentNode.removeChild(floatingElement);
- }
- //remove `introjs-showElement` class from the element
- var showElement = document.querySelector('.introjs-showElement');
- if (showElement) {
- showElement.className = showElement.className.replace(/introjs-[a-zA-Z]+/g, '').replace(/^\s+|\s+$/g, ''); // This is a manual trim.
- }
- //remove `introjs-fixParent` class from the elements
- var fixParents = document.querySelectorAll('.introjs-fixParent');
- if (fixParents && fixParents.length > 0) {
- for (var i = fixParents.length - 1; i >= 0; i--) {
- fixParents[i].className = fixParents[i].className.replace(/introjs-fixParent/g, '').replace(/^\s+|\s+$/g, '');
- };
- }
- //clean listeners
- if (window.removeEventListener) {
- window.removeEventListener('keydown', this._onKeyDown, true);
- } else if (document.detachEvent) { //IE
- document.detachEvent('onkeydown', this._onKeyDown);
- }
- //set the step to zero
- this._currentStep = undefined;
- }
- /**
- * Render tooltip box in the page
- *
- * @api private
- * @method _placeTooltip
- * @param {Object} targetElement
- * @param {Object} tooltipLayer
- * @param {Object} arrowLayer
- */
- function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer) {
- var tooltipCssClass = '',
- currentStepObj,
- tooltipOffset,
- targetElementOffset;
- //reset the old style
- tooltipLayer.style.top = null;
- tooltipLayer.style.right = null;
- tooltipLayer.style.bottom = null;
- tooltipLayer.style.left = null;
- tooltipLayer.style.marginLeft = null;
- tooltipLayer.style.marginTop = null;
- arrowLayer.style.display = 'inherit';
- if (typeof(helperNumberLayer) != 'undefined' && helperNumberLayer != null) {
- helperNumberLayer.style.top = null;
- helperNumberLayer.style.left = null;
- }
- //prevent error when `this._currentStep` is undefined
- if (!this._introItems[this._currentStep]) return;
- //if we have a custom css class for each step
- currentStepObj = this._introItems[this._currentStep];
- if (typeof (currentStepObj.tooltipClass) === 'string') {
- tooltipCssClass = currentStepObj.tooltipClass;
- } else {
- tooltipCssClass = this._options.tooltipClass;
- }
- tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\s+|\s+$/g, '');
- //custom css class for tooltip boxes
- var tooltipCssClass = this._options.tooltipClass;
- currentTooltipPosition = this._introItems[this._currentStep].position;
- switch (currentTooltipPosition) {
- case 'top':
- tooltipLayer.style.left = '15px';
- tooltipLayer.style.top = '-' + (_getOffset(tooltipLayer).height + 10) + 'px';
- arrowLayer.className = 'introjs-arrow bottom';
- break;
- case 'right':
- tooltipLayer.style.left = (_getOffset(targetElement).width + 20) + 'px';
- arrowLayer.className = 'introjs-arrow left';
- break;
- case 'left':
- if (this._options.showStepNumbers == true) {
- tooltipLayer.style.top = '15px';
- }
- tooltipLayer.style.right = (_getOffset(targetElement).width + 20) + 'px';
- arrowLayer.className = 'introjs-arrow right';
- break;
- case 'floating':
- arrowLayer.style.display = 'none';
- //we have to adjust the top and left of layer manually for intro items without element
- tooltipOffset = _getOffset(tooltipLayer);
- tooltipLayer.style.left = '50%';
- tooltipLayer.style.top = '50%';
- tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2) + 'px';
- tooltipLayer.style.marginTop = '-' + (tooltipOffset.height / 2) + 'px';
- if (typeof(helperNumberLayer) != 'undefined' && helperNumberLayer != null) {
- helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';
- helperNumberLayer.style.top = '-' + ((tooltipOffset.height / 2) + 18) + 'px';
- }
- break;
- case 'bottom-right-aligned':
- arrowLayer.className = 'introjs-arrow top-right';
- tooltipLayer.style.right = '0px';
- tooltipLayer.style.bottom = '-' + (_getOffset(tooltipLayer).height + 10) + 'px';
- break;
- case 'bottom-middle-aligned':
- targetElementOffset = _getOffset(targetElement);
- tooltipOffset = _getOffset(tooltipLayer);
- arrowLayer.className = 'introjs-arrow top-middle';
- tooltipLayer.style.left = (targetElementOffset.width / 2 - tooltipOffset.width / 2) + 'px';
- tooltipLayer.style.bottom = '-' + (tooltipOffset.height + 10) + 'px';
- break;
- case 'bottom-left-aligned':
- // Bottom-left-aligned is the same as the default bottom
- case 'bottom':
- // Bottom going to follow the default behavior
- default:
- tooltipLayer.style.bottom = '-' + (_getOffset(tooltipLayer).height + 10) + 'px';
- arrowLayer.className = 'introjs-arrow top';
- break;
- }
- }
- /**
- * Update the position of the helper layer on the screen
- *
- * @api private
- * @method _setHelperLayerPosition
- * @param {Object} helperLayer
- */
- function _setHelperLayerPosition(helperLayer) {
- if (helperLayer) {
- //prevent error when `this._currentStep` in undefined
- if (!this._introItems[this._currentStep]) return;
- var currentElement = this._introItems[this._currentStep],
- elementPosition = _getOffset(currentElement.element),
- widthHeightPadding = 10;
- if (currentElement.position == 'floating') {
- widthHeightPadding = 0;
- }
- //set new position to helper layer
- helperLayer.setAttribute('style', 'width: ' + (elementPosition.width + widthHeightPadding) + 'px; ' +
- 'height:' + (elementPosition.height + widthHeightPadding) + 'px; ' +
- 'top:' + (elementPosition.top - 5) + 'px;' +
- 'left: ' + (elementPosition.left - 5) + 'px;');
- }
- }
- /**
- * Show an element on the page
- *
- * @api private
- * @method _showElement
- * @param {Object} targetElement
- */
- function _showElement(targetElement) {
- if (typeof (this._introChangeCallback) !== 'undefined') {
- this._introChangeCallback.call(this, targetElement.element);
- }
- var self = this,
- oldHelperLayer = document.querySelector('.introjs-helperLayer'),
- elementPosition = _getOffset(targetElement.element);
- if (oldHelperLayer != null) {
- var oldHelperNumberLayer = oldHelperLayer.querySelector('.introjs-helperNumberLayer'),
- oldtooltipLayer = oldHelperLayer.querySelector('.introjs-tooltiptext'),
- oldArrowLayer = oldHelperLayer.querySelector('.introjs-arrow'),
- oldtooltipContainer = oldHelperLayer.querySelector('.introjs-tooltip'),
- skipTooltipButton = oldHelperLayer.querySelector('.introjs-skipbutton'),
- prevTooltipButton = oldHelperLayer.querySelector('.introjs-prevbutton'),
- nextTooltipButton = oldHelperLayer.querySelector('.introjs-nextbutton');
- //hide the tooltip
- oldtooltipContainer.style.opacity = 0;
- if (oldHelperNumberLayer != null) {
- var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];
- if (lastIntroItem != null && (this._direction == 'forward' && lastIntroItem.position == 'floating') || (this._direction == 'backward' && targetElement.position == 'floating')) {
- oldHelperNumberLayer.style.opacity = 0;
- }
- }
- //set new position to helper layer
- _setHelperLayerPosition.call(self, oldHelperLayer);
- //remove `introjs-fixParent` class from the elements
- var fixParents = document.querySelectorAll('.introjs-fixParent');
- if (fixParents && fixParents.length > 0) {
- for (var i = fixParents.length - 1; i >= 0; i--) {
- fixParents[i].className = fixParents[i].className.replace(/introjs-fixParent/g, '').replace(/^\s+|\s+$/g, '');
- };
- }
- //remove old classes
- var oldShowElement = document.querySelector('.introjs-showElement');
- oldShowElement.className = oldShowElement.className.replace(/introjs-[a-zA-Z]+/g, '').replace(/^\s+|\s+$/g, '');
- //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation
- if (self._lastShowElementTimer) {
- clearTimeout(self._lastShowElementTimer);
- }
- self._lastShowElementTimer = setTimeout(function() {
- //set current step to the label
- if (oldHelperNumberLayer != null) {
- oldHelperNumberLayer.innerHTML = targetElement.step;
- }
- //set current tooltip text
- oldtooltipLayer.innerHTML = targetElement.intro;
- //set the tooltip position
- _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);
- //change active bullet
- oldHelperLayer.querySelector('.introjs-bullets li > a.active').className = '';
- oldHelperLayer.querySelector('.introjs-bullets li > a[data-stepnumber="' + targetElement.step + '"]').className = 'active';
- //show the tooltip
- oldtooltipContainer.style.opacity = 1;
- if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;
- }, 350);
- } else {
- var helperLayer = document.createElement('div'),
- arrowLayer = document.createElement('div'),
- tooltipLayer = document.createElement('div'),
- tooltipTextLayer = document.createElement('div'),
- bulletsLayer = document.createElement('div'),
- buttonsLayer = document.createElement('div');
- helperLayer.className = 'introjs-helperLayer';
- //set new position to helper layer
- _setHelperLayerPosition.call(self, helperLayer);
- //add helper layer to target element
- this._targetElement.appendChild(helperLayer);
- arrowLayer.className = 'introjs-arrow';
- tooltipTextLayer.className = 'introjs-tooltiptext';
- tooltipTextLayer.innerHTML = targetElement.intro;
- bulletsLayer.className = 'introjs-bullets';
- if (this._options.showBullets === false) {
- bulletsLayer.style.display = 'none';
- }
- var ulContainer = document.createElement('ul');
- for (var i = 0, stepsLength = this._introItems.length; i < stepsLength; i++) {
- var innerLi = document.createElement('li');
- var anchorLink = document.createElement('a');
- anchorLink.onclick = function() {
- self.goToStep(this.getAttribute('data-stepnumber'));
- };
- if (i === 0) anchorLink.className = "active";
- anchorLink.href = 'javascript:void(0);';
- anchorLink.innerHTML = " ";
- anchorLink.setAttribute('data-stepnumber', this._introItems[i].step);
- innerLi.appendChild(anchorLink);
- ulContainer.appendChild(innerLi);
- }
- bulletsLayer.appendChild(ulContainer);
- buttonsLayer.className = 'introjs-tooltipbuttons';
- if (this._options.showButtons === false) {
- buttonsLayer.style.display = 'none';
- }
- tooltipLayer.className = 'introjs-tooltip';
- tooltipLayer.appendChild(tooltipTextLayer);
- tooltipLayer.appendChild(bulletsLayer);
- //add helper layer number
- if (this._options.showStepNumbers == true) {
- var helperNumberLayer = document.createElement('span');
- helperNumberLayer.className = 'introjs-helperNumberLayer';
- helperNumberLayer.innerHTML = targetElement.step;
- helperLayer.appendChild(helperNumberLayer);
- }
- tooltipLayer.appendChild(arrowLayer);
- helperLayer.appendChild(tooltipLayer);
- //next button
- var nextTooltipButton = document.createElement('a');
- nextTooltipButton.onclick = function() {
- if (self._introItems.length - 1 != self._currentStep) {
- _nextStep.call(self);
- }
- };
- nextTooltipButton.href = 'javascript:void(0);';
- nextTooltipButton.innerHTML = this._options.nextLabel;
- //previous button
- var prevTooltipButton = document.createElement('a');
- prevTooltipButton.onclick = function() {
- if (self._currentStep != 0) {
- _previousStep.call(self);
- }
- };
- prevTooltipButton.href = 'javascript:void(0);';
- prevTooltipButton.innerHTML = this._options.prevLabel;
- //skip button
- var skipTooltipButton = document.createElement('a');
- skipTooltipButton.className = 'introjs-button introjs-skipbutton';
- skipTooltipButton.href = 'javascript:void(0);';
- skipTooltipButton.innerHTML = this._options.skipLabel;
- skipTooltipButton.onclick = function() {
- if (self._introItems.length - 1 == self._currentStep && typeof (self._introCompleteCallback) === 'function') {
- self._introCompleteCallback.call(self);
- }
- if (self._introItems.length - 1 != self._currentStep && typeof (self._introExitCallback) === 'function') {
- self._introExitCallback.call(self);
- }
- _exitIntro.call(self, self._targetElement);
- };
- buttonsLayer.appendChild(skipTooltipButton);
- //in order to prevent displaying next/previous button always
- if (this._introItems.length > 1) {
- buttonsLayer.appendChild(prevTooltipButton);
- buttonsLayer.appendChild(nextTooltipButton);
- }
- tooltipLayer.appendChild(buttonsLayer);
- //set proper position
- _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);
- }
- if (this._currentStep == 0 && this._introItems.length > 1) {
- prevTooltipButton.className = 'introjs-button introjs-prevbutton introjs-disabled';
- nextTooltipButton.className = 'introjs-button introjs-nextbutton';
- skipTooltipButton.innerHTML = this._options.skipLabel;
- } else if (this._introItems.length - 1 == this._currentStep || this._introItems.length == 1) {
- skipTooltipButton.innerHTML = this._options.doneLabel;
- prevTooltipButton.className = 'introjs-button introjs-prevbutton';
- nextTooltipButton.className = 'introjs-button introjs-nextbutton introjs-disabled';
- } else {
- prevTooltipButton.className = 'introjs-button introjs-prevbutton';
- nextTooltipButton.className = 'introjs-button introjs-nextbutton';
- skipTooltipButton.innerHTML = this._options.skipLabel;
- }
- //Set focus on "next" button, so that hitting Enter always moves you onto the next step
- nextTooltipButton.focus();
- //add target element position style
- targetElement.element.className += ' introjs-showElement';
- var currentElementPosition = _getPropValue(targetElement.element, 'position');
- if (currentElementPosition !== 'absolute' &&
- currentElementPosition !== 'relative') {
- //change to new intro item
- targetElement.element.className += ' introjs-relativePosition';
- }
- var parentElm = targetElement.element.parentNode;
- while (parentElm != null) {
- if (parentElm.tagName.toLowerCase() === 'body') break;
- //fix The Stacking Contenxt problem.
- //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context
- var zIndex = _getPropValue(parentElm, 'z-index');
- var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));
- if (/[0-9]+/.test(zIndex) || opacity < 1) {
- parentElm.className += ' introjs-fixParent';
- }
- parentElm = parentElm.parentNode;
- }
- if (!_elementInViewport(targetElement.element) && this._options.scrollToElement === true) {
- var rect = targetElement.element.getBoundingClientRect(),
- winHeight=_getWinSize().height,
- top = rect.bottom - (rect.bottom - rect.top),
- bottom = rect.bottom - winHeight;
- //Scroll up
- if (top < 0 || targetElement.element.clientHeight > winHeight) {
- window.scrollBy(0, top - 30); // 30px padding from edge to look nice
- //Scroll down
- } else {
- window.scrollBy(0, bottom + 100); // 70px + 30px padding from edge to look nice
- }
- }
- if (typeof (this._introAfterChangeCallback) !== 'undefined') {
- this._introAfterChangeCallback.call(this, targetElement.element);
- }
- }
- /**
- * Get an element CSS property on the page
- * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml
- *
- * @api private
- * @method _getPropValue
- * @param {Object} element
- * @param {String} propName
- * @returns Element's property value
- */
- function _getPropValue (element, propName) {
- var propValue = '';
- if (element.currentStyle) { //IE
- propValue = element.currentStyle[propName];
- } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others
- propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);
- }
- //Prevent exception in IE
- if (propValue && propValue.toLowerCase) {
- return propValue.toLowerCase();
- } else {
- return propValue;
- }
- }
- /**
- * Provides a cross-browser way to get the screen dimensions
- * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight
- *
- * @api private
- * @method _getWinSize
- * @returns {Object} width and height attributes
- */
- function _getWinSize() {
- if (window.innerWidth != undefined) {
- return { width: window.innerWidth, height: window.innerHeight };
- } else {
- var D = document.documentElement;
- return { width: D.clientWidth, height: D.clientHeight };
- }
- }
- /**
- * Add overlay layer to the page
- * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport
- *
- * @api private
- * @method _elementInViewport
- * @param {Object} el
- */
- function _elementInViewport(el) {
- var rect = el.getBoundingClientRect();
- return (
- rect.top >= 0 &&
- rect.left >= 0 &&
- (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right
- rect.right <= window.innerWidth
- );
- }
- /**
- * Add overlay layer to the page
- *
- * @api private
- * @method _addOverlayLayer
- * @param {Object} targetElm
- */
- function _addOverlayLayer(targetElm) {
- var overlayLayer = document.createElement('div'),
- styleText = '',
- self = this;
- //set css class name
- overlayLayer.className = 'introjs-overlay';
- //check if the target element is body, we should calculate the size of overlay layer in a better way
- if (targetElm.tagName.toLowerCase() === 'body') {
- styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';
- overlayLayer.setAttribute('style', styleText);
- } else {
- //set overlay layer position
- var elementPosition = _getOffset(targetElm);
- if (elementPosition) {
- styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';
- overlayLayer.setAttribute('style', styleText);
- }
- }
- targetElm.appendChild(overlayLayer);
- overlayLayer.onclick = function() {
- if (self._options.exitOnOverlayClick == true) {
- _exitIntro.call(self, targetElm);
- //check if any callback is defined
- if (self._introExitCallback != undefined) {
- self._introExitCallback.call(self);
- }
- }
- };
- setTimeout(function() {
- styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';
- overlayLayer.setAttribute('style', styleText);
- }, 10);
- return true;
- }
- /**
- * Get an element position on the page
- * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966
- *
- * @api private
- * @method _getOffset
- * @param {Object} element
- * @returns Element's position info
- */
- function _getOffset(element) {
- var elementPosition = {};
- //set width
- elementPosition.width = element.offsetWidth;
- //set height
- elementPosition.height = element.offsetHeight;
- //calculate element top and left
- var _x = 0;
- var _y = 0;
- while (element && !isNaN(element.offsetLeft) && !isNaN(element.offsetTop)) {
- _x += element.offsetLeft;
- _y += element.offsetTop;
- element = element.offsetParent;
- }
- //set top
- elementPosition.top = _y;
- //set left
- elementPosition.left = _x;
- return elementPosition;
- }
- /**
- * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1
- * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically
- *
- * @param obj1
- * @param obj2
- * @returns obj3 a new object based on obj1 and obj2
- */
- function _mergeOptions(obj1,obj2) {
- var obj3 = {};
- for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; }
- for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; }
- return obj3;
- }
- var introJs = function (targetElm) {
- if (typeof (targetElm) === 'object') {
- //Ok, create a new instance
- return new IntroJs(targetElm);
- } else if (typeof (targetElm) === 'string') {
- //select the target element with query selector
- var targetElement = document.querySelector(targetElm);
- if (targetElement) {
- return new IntroJs(targetElement);
- } else {
- throw new Error('There is no element with given selector.');
- }
- } else {
- return new IntroJs(document.body);
- }
- };
- /**
- * Current IntroJs version
- *
- * @property version
- * @type String
- */
- introJs.version = VERSION;
- //Prototype
- introJs.fn = IntroJs.prototype = {
- clone: function () {
- return new IntroJs(this);
- },
- setOption: function(option, value) {
- this._options[option] = value;
- return this;
- },
- setOptions: function(options) {
- this._options = _mergeOptions(this._options, options);
- return this;
- },
- start: function () {
- _introForElement.call(this, this._targetElement);
- return this;
- },
- goToStep: function(step) {
- _goToStep.call(this, step);
- return this;
- },
- nextStep: function() {
- _nextStep.call(this);
- return this;
- },
- previousStep: function() {
- _previousStep.call(this);
- return this;
- },
- exit: function() {
- _exitIntro.call(this, this._targetElement);
- },
- refresh: function() {
- _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));
- return this;
- },
- onbeforechange: function(providedCallback) {
- if (typeof (providedCallback) === 'function') {
- this._introBeforeChangeCallback = providedCallback;
- } else {
- throw new Error('Provided callback for onbeforechange was not a function');
- }
- return this;
- },
- onchange: function(providedCallback) {
- if (typeof (providedCallback) === 'function') {
- this._introChangeCallback = providedCallback;
- } else {
- throw new Error('Provided callback for onchange was not a function.');
- }
- return this;
- },
- onafterchange: function(providedCallback) {
- if (typeof (providedCallback) === 'function') {
- this._introAfterChangeCallback = providedCallback;
- } else {
- throw new Error('Provided callback for onafterchange was not a function');
- }
- return this;
- },
- oncomplete: function(providedCallback) {
- if (typeof (providedCallback) === 'function') {
- this._introCompleteCallback = providedCallback;
- } else {
- throw new Error('Provided callback for oncomplete was not a function.');
- }
- return this;
- },
- onexit: function(providedCallback) {
- if (typeof (providedCallback) === 'function') {
- this._introExitCallback = providedCallback;
- } else {
- throw new Error('Provided callback for onexit was not a function.');
- }
- return this;
- }
- };
- exports.introJs = introJs;
- return introJs;
- }));
- </script><script>
- /*смена позиционирования у класса slide-wrap1 для плавной прокрутки верхнего слайдера-меню*/
- var SLIDER_ANIMATION_DELAY = 400;
- $(document).ready(function(){
- if (window.navigator.appName == "Microsoft Internet Explorer")
- {
- // This is an IE browser. What mode is the engine in?
- if (document.documentMode == 7) //
- {
- $("img.icon_of_task").css("margin-top", "0");
- $(".task_spis_list").css("width", "266px");
- $("p.day").css("margin-top", "0");
- }
- }
- var slideWrap = $(".slide-wrap1");
- $(".slide-item1").mouseover(function() {
- if (!slideWrap.is(":animated"))
- {
- $(this).addClass("slide-item1-hover");
- css_heigth = $("body").height() - $(".header_top").eq(0).height() + parseInt($(".top_slider").eq(0).css("padding-top").split("px")[0] )+200;
- $(".slide-list1").css("height", css_heigth);
- if ($(this).index() == 3)
- {
- $(this).find(".dropmenu .dropdown_list").css("left", -238);
- }
- else
- {
- $(this).find(".dropmenu .dropdown_list").css("left", 226);
- }
- // вертикальное центрирование текста:
- $(this).find(".item_name_many").each(function() {
- $(this).css("padding-top", ($(this).parent().outerHeight() - $(this).height()) / 2 - 3);
- });
- }
- });
- $(".slide-item1").mouseout(function() {
- if (!slideWrap.is(":animated"))
- {
- $(this).removeClass("slide-item1-hover");
- $(".slide-list1").css("height", "");
- }
- });
- // выравнивание текста главного меню:
- $(".slide-item1-text").each(function() {
- $(this).css({
- top: ($(this).parent().outerHeight() - $(this).outerHeight()) / 2 - 3
- });
- });
- });
- /*нижний слайдер с брендами*/
- function htmSlider(){
- /* Зададим следующие параметры */
- /* обертка слайдера */
- var slideWrap = jQuery('.slide-wrap');
- /* кнопки вперед/назад */
- var nextLink = jQuery('.next-slide');
- var prevLink = jQuery('.prev-slide');
- /* ширина слайда с отступами */
- var slideWidth = jQuery('.slide-item').outerWidth(true);
- /* смещение слайдера */
- var scrollSlider = -slideWidth;
- w = slideWrap.children().length *(slideWidth);
- if (w < slideWrap.parent().innerWidth())
- {
- nextLink.hide(); prevLink.hide();
- }
- else
- {
- nextLink.show(); prevLink.show();
- }
- /* Клик по ссылке на следующий слайд */
- nextLink.click(function(){
- if(!slideWrap.is(':animated')) {
- slideWrap.find('.slide-item:first').clone().appendTo(slideWrap);
- slideWrap.animate({left: scrollSlider}, SLIDER_ANIMATION_DELAY, function(){
- slideWrap.find('.slide-item:first').remove();
- slideWrap.css({'left': 0});
- });
- }
- });
- /* Клик по ссылке на предыдующий слайд */
- prevLink.click(function(){
- if(!slideWrap.is(':animated')) {
- slideWrap.css({'left': scrollSlider}).find('.slide-item:last').clone().prependTo(slideWrap);
- slideWrap.animate({left: 0}, SLIDER_ANIMATION_DELAY, function(){
- slideWrap.find('.slide-item:last').remove();
- });
- }
- });
- }
- jQuery(document).ready(function(){
- /* иницилизируем функцию слайдера */
- htmSlider();
- });
- /*верхний слайдер-меню*/
- function htmSlider_m(){
- /* Зададим следующие параметры */
- /* обертка слайдера */
- var slideWrap = jQuery('.slide-wrap1');
- /* кнопки вперед/назад */
- var nextLink = jQuery('.next-slide1');
- var prevLink = jQuery('.prev-slide1');
- /* ширина слайда с отступами */
- var slideWidth = jQuery('.slide-item1').outerWidth(true);
- /* смещение слайдера */
- var scrollSlider = -slideWidth;
- //
- w = slideWrap.children().length *(slideWidth);
- if (w <= slideWrap.parent().innerWidth())
- {
- nextLink.hide(); prevLink.hide();
- }
- else
- {
- nextLink.show(); prevLink.show();
- }
- /* Клик по ссылке на следующий слайд */
- nextLink.click(function(){
- if(!slideWrap.is(':animated')) {
- slideWrap.animate({left: scrollSlider}, SLIDER_ANIMATION_DELAY, function(){
- slideWrap
- .find('.slide-item1:first')
- .appendTo(slideWrap)
- .parent()
- .css({'left': 0});
- slideWrap.find("div[num]").each(function(){
- if ($(this).attr("rel") != undefined)
- {
- //$(this).attr("onclick", "window.location ='" + $(this).attr("rel") + "&slider=" + slideWrap.children().eq(0).attr("num") + "'; if (event.stopPropagation){ event.stopPropagation();event.cancelBubble = true;}else{ event.cancelBubble = true;};");
- $(this).attr("slide", slideWrap.children().eq(0).attr("num"));
- }
- })
- $(".crumbs").eq(0).children().each(function(){
- if ($(this).attr("rel") != undefined)
- {
- //$(this).attr("onclick", "window.location ='" + $(this).attr("rel") + "&slider=" + slideWrap.children().eq(0).attr("num") + "'");
- $(this).attr("slide", slideWrap.children().eq(0).attr("num"));
- }
- });
- });
- }
- });
- /* Клик по ссылке на предыдующий слайд */
- prevLink.click(function(){
- if(!slideWrap.is(':animated')) {
- slideWrap
- .css({'left': scrollSlider})
- .find('.slide-item1:last')
- .prependTo(slideWrap)
- .parent()
- .animate({left: 0}, SLIDER_ANIMATION_DELAY, function(){
- slideWrap.find("div[num]").each(function(){
- //$(this).attr("onclick", "window.location ='" + $(this).attr("rel") + "&slider=" + slideWrap.children().eq(0).attr("num") + "'; if (event.stopPropagation){ event.stopPropagation();event.cancelBubble = true;} else{ event.cancelBubble = true;};");
- $(this).attr("slide", slideWrap.children().eq(0).attr("num"));
- })
- $(".crumbs").eq(0).children().each(function(){
- if ($(this).attr("rel") != undefined)
- {
- //$(this).attr("onclick", "window.location ='" + $(this).attr("rel") + "&slider=" + slideWrap.children().eq(0).attr("num") + "'");
- $(this).attr("slide", slideWrap.children().eq(0).attr("num"));
- }
- });
- });
- }
- });
- }
- jQuery(document).ready(function(){
- /* иницилизируем функцию слайдера */
- htmSlider_m();
- });
- // Кастомизация элементов ввода:
- var synergyGetSelectElementText = function(selectElement) {
- try {
- return selectElement.options[selectElement.selectedIndex].text;
- } catch(_err) {
- console.log("synergyGetSelectElementText ERROR : " + _err);
- return "";
- }
- };
- function HtmlEscapeString(str)
- {
- str = str.replace(/&/g, "&");
- str = str.replace(/"/g, """);
- str = str.replace(/'/g, "'");
- str = str.replace(/</g, "<");
- str = str.replace(/>/g, ">");
- return str;
- }
- function synergyCustomizeElements() {
- // Выпадающие списки:
- $("select.synergy_select_element").each(function() {
- $(this).removeClass("synergy_select_element");
- $(this).hide();
- if ($(this).hasClass("select-disabled")){
- $(this).wrap("<div class=\"synergy_select_box select-disabled\"></div>");
- }
- else{
- $(this).wrap("<div class=\"synergy_select_box\"></div>");
- }
- $(this).after("<p class=\"synergy_select_box_text\">" + synergyGetSelectElementText(this) + "</p><div class=\"synergy_select_box_button\"></div>");
- var selectBoxDropdown = "<div class=\"synergy_select_box_dropdown\">";
- for (var i = 0; i < this.options.length; i++)
- {
- selectBoxDropdown += "<a index=\"" + i + "\" title=\"" + HtmlEscapeString(this.options[i].text) + "\">" + this.options[i].text + "</a>";
- }
- selectBoxDropdown += "</div>";
- $(this).parent().append(selectBoxDropdown);
- });
- }
- $(document).ready(function(){
- synergyCustomizeElements();
- $("body").click(function(event) {
- var target = event.target;
- if($(target).closest(".synergy_select_box.select-disabled").length){return};
- var dropdownVisible = $("div.synergy_select_box_dropdown:visible").get(0);
- if (dropdownVisible)
- {
- $(dropdownVisible).hide();
- }
- var targetSelectBox = $(target).hasClass("synergy_select_box") ? target : $(target).parents("div.synergy_select_box").get(0);
- if (targetSelectBox)
- {
- if ($(target).parent().hasClass("synergy_select_box_dropdown"))
- {
- var selectElement = $(targetSelectBox).children("select").get(0);
- selectElement.selectedIndex = parseInt($(target).attr("index"));
- $(selectElement).trigger("change");
- $(targetSelectBox).children("p").get(0).innerHTML = synergyGetSelectElementText(selectElement);
- }
- if (!dropdownVisible || dropdownVisible && $(dropdownVisible).parent().get(0) != targetSelectBox)
- {
- $(targetSelectBox).children("div.synergy_select_box_dropdown").show();
- }
- }
- });
- });
- </script>
- <div class="main-wrapper">
- <script>
- $('head').append('<meta name="viewport" content="width=device-width">');
- </script>
- <div id="b-shade" class="b-view-preloader" style="display: block;">
- <div class="b-ball-1"></div>
- <div class="b-ball-2"></div>
- </div>
- <!--HEADER-->
- <script>
- function getInitials (string) {
- var names = (string != "" && string != " ") ? string.split(' ') : [];
- var initials = "";
- if (names.length > 1) {
- initials = names[1].substring(0, 1).toUpperCase();
- initials += (names[1] != "") ? "." : "";
- initials += names[0].substring(0, 1).toUpperCase();
- initials += (names[0] != "") ? "." : "";
- } else {
- if (names.length != 0) {
- initials = string.substring(0, 1).toUpperCase();
- initials += ".";
- }
- }
- return initials;
- }
- function closeMenu() {
- $("#work_cabinet_icon").removeClass("active");
- $("#wk_list").removeClass("active");
- $("#mob_work_cabinet").toggleClass("active");
- $("#mob_work_cabinet_content").toggleClass("active");
- }
- $(document).ready(function () {
- var options = {"userID":"6017678077230275438","is_admin":false,"dropdown_menu_items":[{"name":"Мои оцениваемые сотрудники","link_href":"view_doc.html?mode=my_employees_evaluation&doc_id=6631859965698670224"},{"name":"Панель руководителя","link_href":"view_doc.html?mode=boss_panel&doc_id=6335652978792405855"},{"name":"Адаптация сотрудника","link_href":"view_doc.html?mode=adaptation&doc_id=6335653159623287534"},{"name":"Отчет по адаптации","link_href":"view_doc.html?mode=doc_type&object_id=6039881813288121911&doc_id=6335653748949613493"}],"user_roles":["func_manager_menu"],"menuItems":[{"name":"Каталог курсов","link_href":"view_doc.html?mode=edu_catalog&doc_id=6628161676399233617"},{"name":"Документы","link_href":"view_doc.html?mode=lib&doc_id=6628162092753246374"},{"name":"Обучение","link_href":"view_doc.html?mode=doc&doc_id=5800376573543914533"},{"name":"МИРР","link_href":"view_doc.html?mode=self_assessment&doc_id=6631857937049990730"},{"name":"Библиотека","link_href":"view_doc.html?mode=doc&doc_id=6522717384966615904"},{"name":"Заявки","link_href":"view_doc.html?mode=doc&doc_id=6148914691236517176"},{"name":"Вакансии компании","link_href":"view_doc.html?mode=company_vacancys&doc_id=6711191531803911194"}],"avatar":"/download_file.html?file_id=6631996913705945604","fullname":"Лебедев Дмитрий Олегович","scores":0,"scoresText":"баллов","mode":"learning_stat","eventsCount":0,"learnCount":3,"auth_type":"outside","breadcrumbs":[]},
- mainMenuContainer,
- mainMobMenuContainer,
- workCabinetContainer,
- mobWorkCabinetContainer,
- roleNamesContainer,
- mobRoleNamesContainer;
- //отключаем прелоадер
- setTimeout(function () {
- $("#b-shade").hide();
- }, 2000);
- //мероприятия
- $('#header_events, #header_mob_events').text(options.eventsCount);
- //аватар
- if (options.avatar.length > 0) {
- $('#userpic').append(
- $('<div/>')
- .addClass("b-header__userpic")
- .css("background-image", "url("+options.avatar+")")
- );
- } else {
- $('#userpic').append(
- $('<div/>')
- .addClass("b-user__avatar no-photo header active")
- .text(getInitials(options.fullname))
- );
- }
- //меню
- mainMenuContainer = $('#header_menu_main');
- mainMobMenuContainer = $('#header_mob_menu_main');
- options.menuItems.forEach(function (item) {
- var a = $('<a href="' + item.link_href + '"></a>');
- a.text(item.name);
- mainMenuContainer.append(a);
- var li = $('<li><a href="' + item.link_href + '"></a></li>');
- $("a", li).text(item.name);
- mainMobMenuContainer.append(li);
- });
- //курсы тесты
- $('#header_learnings, #header_mob_learnings').text(options.learnCount);
- //меню рабочего кабинета
- roleNamesContainer = $('#role_names');
- mobRoleNamesContainer = $('#mob_role_names');
- if (options.is_admin) {
- roleNamesContainer.append(
- $("<span/>")
- .addClass("b-text__grey")
- .text("Администратор")
- );
- mobRoleNamesContainer.append(
- $("<li/>")
- .append(
- $("<a/>")
- .attr("href", "javascript:void(0);")
- .text("Администратор")
- )
- );
- } else {
- options.user_roles.forEach(function (item) {
- var span = $('<span class="b-text__grey"></span>'),
- li = $('<li><a href="javascript:void(0);"></a></li>'),
- a = $('a', li);
- if (item == "sub_manager_menu") {
- span.text("Руководитель подразделения");
- a.text("Руководитель подразделения");
- } else if (item == "hr_menu") {
- span.text("HR");
- a.text("HR");
- } else if (item == "trainer_menu") {
- span.text("Тренер");
- a.text("Тренер");
- } else if (item == "sv_menu") {
- span.text("Супервайзер");
- a.text("Супервайзер");
- } else if (item == "field_manager_menu") {
- span.text("Полевой руководитель");
- a.text("Полевой руководитель");
- } else if (item == "func_manager_menu") {
- span.text("Функциональный руководитель");
- a.text("Функциональный руководитель");
- } else if (item == "ks_menu") {
- span.text("КС");
- a.text("КС");
- } else if (item == "edu_manager_menu") {
- span.text("Ответственный по обучению");
- a.text("Ответственный по обучению");
- }
- roleNamesContainer.append(span);
- mobRoleNamesContainer.append(li);
- });
- }
- workCabinetContainer = $('#wk_list');
- mobWorkCabinetContainer = $('#mob_wk_list');
- if (options.dropdown_menu_items.length > 0) {
- options.dropdown_menu_items.forEach(function (item) {
- var li = $('<li class="b-header__user-account-item"><a href="' + item.link_href + '" class="b-header__user-account-links">' + item.name + '</a></li>');
- workCabinetContainer.append(li);
- var mob_li = $('<li/>')
- .append(
- $('<a href="' + item.link_href + '"></a>')
- .text(item.name)
- );
- mobWorkCabinetContainer.append(mob_li);
- });
- } else {
- $("#work_cabinet")
- .removeClass("b-header__user-link-item")
- .text("Личный кабинет")
- .css("font-size", "12px")
- .css("line-height", "16px");
- $("#mob_work_cabinet span").text("Личный кабинет");
- $("#mob_work_cabinet i").remove();
- }
- //Хлебные крошки
- if(options.breadcrumbs.length > 0){
- options.breadcrumbs.forEach(function(el){
- $(".b-breadcrumbs-ul").prepend(
- $('<li/>')
- .addClass('b-breadcrumbs-item')
- .append(
- (function(){
- var link = 'javascript:void(0);';
- if (el.template != '') {
- link = el.template;
- } else {
- link = 'view_doc.html?mode=doc&doc_id='+el.id;
- }
- return '<a href="' + link + '" class="b-breadcrumbs-link">' + el.name + '</a>';
- })()
- )
- )
- });
- } else {
- $(".b-breadcrumbs").remove();
- }
- // скрытие рабочего кабинета
- $(document).on("click", function(event) {
- var target_id = event.target.id;
- if (target_id === "wk_list" || target_id === "work_cabinet_icon" || target_id === "work_cabinet") {
- return false;
- } work_cabinet
- closeMenu();
- });
- //кнопка "рабочий кабинет"
- $("#work_cabinet_icon, #mob_work_cabinet span").on('click', function () {
- if (options.dropdown_menu_items.length > 0) {
- if ( $("#work_cabinet_icon").hasClass("active")) {
- $("#work_cabinet_icon").removeClass("active");
- $("#wk_list").removeClass("active");
- } else {
- $("#work_cabinet_icon").addClass("active");
- $("#wk_list").addClass("active");
- }
- $("#mob_work_cabinet").toggleClass("active");
- $("#mob_work_cabinet_content").toggleClass("active");
- } else {
- location.href = "/view_doc.html?mode=profile";
- }
- });
- //кнопка выход
- $('#header_exit, #mob_exit').on('click', function (event) {
- if (options.auth_type === 'cookie') {
- var sDate = new Date(0).toUTCString();
- document.cookie = "user_login=null; path=/; expires=" + sDate + ";";
- document.cookie = "user_password=null; path=/; expires=" + sDate + ";";
- document.location.href = window.location.protocol + "//" + window.location.host + "/view_doc.html?mode=default&logout=1";
- } else if (options.auth_type === 'basic') {
- var xhr = new XMLHttpRequest();
- xhr.open('GET', document.location.origin + '/view_doc.html?mode=home', true);
- xhr.setRequestHeader('Authorization', '');
- xhr.send();
- document.location.href = document.location.origin + '/view_doc.html?mode=default';
- } else {
- try {
- if (document.all || !!navigator.userAgent.match(/Trident\/7\./)) {
- document.execCommand("ClearAuthenticationCache");
- window.history.back();
- window.location.href = window.location.protocol + "//" + window.location.host + "/view_doc.html?mode=default&logout=1";
- } else {
- window.history.back();
- window.location.href = window.location.protocol + "//logout:true@" + window.location.host + "/view_doc.html?mode=default&logout=1";
- }
- }
- catch(e)
- {}
- }
- });
- //ссылка на my_account
- $('#header_course_test_link, #header_event_link').on('click', function () {
- window.open('/view_doc.html?mode=my_account');
- });
- $('#mob_work_cabinet, #mob_work_cabinet span').on('click', function () {
- $('#mob_work_cabinet').toggleClass('active');
- $('.b-header__icon-open').toggleClass('active');
- $('.b-header__cabinet-content').toggleClass('active');
- });
- //клик по бургеру
- $(".b-header__toggle-menu").on('click', function(){
- $('.b-header__mob-menu-container').toggleClass('active');
- $('.b-header__fixed').toggleClass('active');
- $('#show-xs').toggleClass('is-close')
- });
- });
- </script>
- <script>
- function preloaderOn(){
- $("#b-shade").show();
- }
- function preloaderOff(){
- $("#b-shade").hide();
- }
- </script>
- <header class="b-header">
- <div class="b-header__mob-menu-container">
- <div class="b-container">
- <div class="b-header__mob-menu-but-wrap">
- <a href="/view_doc.html?mode=my_account" class="b-header__mob-menu-but">
- <div class="b-header__mob-menu-but-container">
- <div class="float-left b-header__icon-course b-header__mob-icon-course"></div>
- <div class="float-left b-header__icon-test b-header__mob-icon-test"></div>
- <div id="header_mob_learnings" class="b-header__user-account-courses-num float-left b-header__mob-text"></div>
- </div>
- </a>
- <a href="/view_doc.html?mode=my_account" class="b-header__mob-menu-but">
- <div class="b-header__mob-menu-but-container two">
- <div class="float-left b-header__icon-union b-header__mob-icon-union"></div>
- <div id="header_mob_events" class="b-header__user-account-star-text float-left b-header__mob-text"></div>
- </div>
- </a>
- </div>
- <div id="mob_work_cabinet" class="b-header__cabinet"><span>Рабочий кабинет</span> <i class="b-icon__open little b-header__icon-open"></i></div>
- <div id="mob_work_cabinet_content" class="b-header__cabinet-content">
- <ul id="mob_role_names" class="b-header__cabinet-breadcrumbs">
- </ul>
- <div class="b-header__cabinet-nav">
- <ul id="mob_wk_list">
- </ul>
- </div>
- </div>
- <div class="b-header__mob-nav">
- <ul id="header_mob_menu_main">
- </ul>
- </div>
- <div class="b-header__mob-points clearfix">
- <div class="b-header__mob-points-num">
- <span id="header_mob_scores"></span>
- <span id="header_mob_scores_text"></span>
- </div>
- <div class="b-header__mob-exit"><a id="mob_exit" href="javascript:void(0);">Выход <span class="b-icon__exit-white"></span></a></div>
- </div>
- </div>
- </div>
- <div class="b-container b-header__fixed">
- <div class="b-header__wrap clearfix">
- <div class="b-header__mob-menu float-left">
- <div id="show-xs" class="b-header__toggle-menu hidden-lg show-xs">
- <span class="b-header__toggle-wrapper-elements">
- <span class="b-header__toggle-element-first"></span>
- <span class="b-header__toggle-element-second"></span>
- <span class="b-header__toggle-element-third"></span>
- </span>
- </div>
- </div>
- <div class="b-header__logo clearfix float-left">
- <a href="/view_doc.html?mode=home" class="float-left"><img src="download_file.html?file_id=6621495142608807619" alt="logo"></a>
- <div class="b-header__logo-text float-left"><span>Портал обучения и развития</span></div>
- </div>
- <div class="b-header__user-account-wrap clearfix float-right">
- <div class="b-header__user-exit float-right">
- <div class="t-icon-exit">
- <div class="t-icon-exit__wrap-arrow">
- <div class="t-icon-exit__arrow"></div>
- </div>
- <div class="t-icon-exit__wrap-footer">
- <div id="header_exit" class="t-icon-exit__footer"></div>
- </div>
- </div>
- </div>
- <div class="b-header__user-account clearfix float-right">
- <div class="b-header__user-account-icons clearfix float-left">
- <div id="header_course_test_link" class="b-header__user-account-courses clearfix float-left">
- <a href="javascript:void(0);" class="b-header__user-courses-link">
- <div class="b-icon-course float-left b-header__icon-course"></div>
- <div class="b-icon-test float-left b-header__icon-test"></div>
- <div id="header_learnings" class="b-header__user-account-courses-num float-left"></div>
- </a>
- </div>
- <div id="header_event_link" class="b-header__user-account-star clearfix float-left">
- <a href="javascript:void(0);" class="b-header__user-star-link">
- <div class="b-icon-union float-left b-header__icon-union"></div>
- <div id="header_events" class="b-header__user-account-star-text float-left"></div>
- </a>
- </div>
- </div>
- <div id="work_cabinet_icon" class="b-header__user-account-link float-left" style="cursor: pointer">
- <a id="work_cabinet" href="javascript:void(0);" class="b-header__user-link-item">Рабочий кабинет</a>
- <ul id="wk_list" class="b-header__user-account-wrapper">
- <li id="role_names" class="b-header__user-account-item first"></li>
- </ul>
- </div>
- <div class="b-header__user-account-image-wrap float-left">
- <a id="userpic" href="/view_doc.html?mode=profile"></a>
- </div>
- </div>
- </div>
- </div>
- <div class="b-header__nav">
- <nav id="header_menu_main">
- </nav>
- </div>
- </div>
- </header>
- <!-- Global site tag (gtag.js) - Google Analytics -->
- <script async src="https://www.googletagmanager.com/gtag/js?id=UA-146633021-1"></script>
- <script>
- window.dataLayer = window.dataLayer || [];
- function gtag(){dataLayer.push(arguments);}
- gtag('js', new Date());
- gtag('config', 'UA-146633021-1');
- </script>
- <div class="b-breadcrumbs">
- <div class="b-container">
- <ul class="b-breadcrumbs-ul">
- </ul>
- </div>
- </div>
- <div class="content">
- <!--MAIN -->
- <script>
- /*!
- * jQuery UI Core 1.9.2
- * http://jqueryui.com
- *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/category/ui-core/
- */
- (function( $, undefined ) {
- var uuid = 0,
- runiqueId = /^ui-id-\d+$/;
- // prevent duplicate loading
- // this is only a problem because we proxy existing functions
- // and we don't want to double proxy them
- $.ui = $.ui || {};
- if ( $.ui.version ) {
- return;
- }
- $.extend( $.ui, {
- version: "1.9.2",
- keyCode: {
- BACKSPACE: 8,
- COMMA: 188,
- DELETE: 46,
- DOWN: 40,
- END: 35,
- ENTER: 13,
- ESCAPE: 27,
- HOME: 36,
- LEFT: 37,
- NUMPAD_ADD: 107,
- NUMPAD_DECIMAL: 110,
- NUMPAD_DIVIDE: 111,
- NUMPAD_ENTER: 108,
- NUMPAD_MULTIPLY: 106,
- NUMPAD_SUBTRACT: 109,
- PAGE_DOWN: 34,
- PAGE_UP: 33,
- PERIOD: 190,
- RIGHT: 39,
- SPACE: 32,
- TAB: 9,
- UP: 38
- }
- });
- // plugins
- $.fn.extend({
- _focus: $.fn.focus,
- focus: function( delay, fn ) {
- return typeof delay === "number" ?
- this.each(function() {
- var elem = this;
- setTimeout(function() {
- $( elem ).focus();
- if ( fn ) {
- fn.call( elem );
- }
- }, delay );
- }) :
- this._focus.apply( this, arguments );
- },
- scrollParent: function() {
- var scrollParent;
- if (($.ui.ie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
- scrollParent = this.parents().filter(function() {
- return (/(relative|absolute|fixed)/).test($.css(this,'position')) && (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
- }).eq(0);
- } else {
- scrollParent = this.parents().filter(function() {
- return (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
- }).eq(0);
- }
- return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
- },
- zIndex: function( zIndex ) {
- if ( zIndex !== undefined ) {
- return this.css( "zIndex", zIndex );
- }
- if ( this.length ) {
- var elem = $( this[ 0 ] ), position, value;
- while ( elem.length && elem[ 0 ] !== document ) {
- // Ignore z-index if position is set to a value where z-index is ignored by the browser
- // This makes behavior of this function consistent across browsers
- // WebKit always returns auto if the element is positioned
- position = elem.css( "position" );
- if ( position === "absolute" || position === "relative" || position === "fixed" ) {
- // IE returns 0 when zIndex is not specified
- // other browsers return a string
- // we ignore the case of nested elements with an explicit value of 0
- // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
- value = parseInt( elem.css( "zIndex" ), 10 );
- if ( !isNaN( value ) && value !== 0 ) {
- return value;
- }
- }
- elem = elem.parent();
- }
- }
- return 0;
- },
- uniqueId: function() {
- return this.each(function() {
- if ( !this.id ) {
- this.id = "ui-id-" + (++uuid);
- }
- });
- },
- removeUniqueId: function() {
- return this.each(function() {
- if ( runiqueId.test( this.id ) ) {
- $( this ).removeAttr( "id" );
- }
- });
- }
- });
- // selectors
- function focusable( element, isTabIndexNotNaN ) {
- var map, mapName, img,
- nodeName = element.nodeName.toLowerCase();
- if ( "area" === nodeName ) {
- map = element.parentNode;
- mapName = map.name;
- if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
- return false;
- }
- img = $( "img[usemap=#" + mapName + "]" )[0];
- return !!img && visible( img );
- }
- return ( /input|select|textarea|button|object/.test( nodeName ) ?
- !element.disabled :
- "a" === nodeName ?
- element.href || isTabIndexNotNaN :
- isTabIndexNotNaN) &&
- // the element and all of its ancestors must be visible
- visible( element );
- }
- function visible( element ) {
- return $.expr.filters.visible( element ) &&
- !$( element ).parents().andSelf().filter(function() {
- return $.css( this, "visibility" ) === "hidden";
- }).length;
- }
- $.extend( $.expr[ ":" ], {
- data: $.expr.createPseudo ?
- $.expr.createPseudo(function( dataName ) {
- return function( elem ) {
- return !!$.data( elem, dataName );
- };
- }) :
- // support: jQuery <1.8
- function( elem, i, match ) {
- return !!$.data( elem, match[ 3 ] );
- },
- focusable: function( element ) {
- return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
- },
- tabbable: function( element ) {
- var tabIndex = $.attr( element, "tabindex" ),
- isTabIndexNaN = isNaN( tabIndex );
- return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
- }
- });
- // support
- $(function() {
- var body = document.body,
- div = body.appendChild( div = document.createElement( "div" ) );
- // access offsetHeight before setting the style to prevent a layout bug
- // in IE 9 which causes the element to continue to take up space even
- // after it is removed from the DOM (#8026)
- div.offsetHeight;
- $.extend( div.style, {
- minHeight: "100px",
- height: "auto",
- padding: 0,
- borderWidth: 0
- });
- $.support.minHeight = div.offsetHeight === 100;
- $.support.selectstart = "onselectstart" in div;
- // set display to none to avoid a layout bug in IE
- // http://dev.jquery.com/ticket/4014
- body.removeChild( div ).style.display = "none";
- });
- // support: jQuery <1.8
- if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
- $.each( [ "Width", "Height" ], function( i, name ) {
- var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
- type = name.toLowerCase(),
- orig = {
- innerWidth: $.fn.innerWidth,
- innerHeight: $.fn.innerHeight,
- outerWidth: $.fn.outerWidth,
- outerHeight: $.fn.outerHeight
- };
- function reduce( elem, size, border, margin ) {
- $.each( side, function() {
- size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
- if ( border ) {
- size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
- }
- if ( margin ) {
- size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
- }
- });
- return size;
- }
- $.fn[ "inner" + name ] = function( size ) {
- if ( size === undefined ) {
- return orig[ "inner" + name ].call( this );
- }
- return this.each(function() {
- $( this ).css( type, reduce( this, size ) + "px" );
- });
- };
- $.fn[ "outer" + name] = function( size, margin ) {
- if ( typeof size !== "number" ) {
- return orig[ "outer" + name ].call( this, size );
- }
- return this.each(function() {
- $( this).css( type, reduce( this, size, true, margin ) + "px" );
- });
- };
- });
- }
- // support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
- if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
- $.fn.removeData = (function( removeData ) {
- return function( key ) {
- if ( arguments.length ) {
- return removeData.call( this, $.camelCase( key ) );
- } else {
- return removeData.call( this );
- }
- };
- })( $.fn.removeData );
- }
- // deprecated
- (function() {
- var uaMatch = /msie ([\w.]+)/.exec( navigator.userAgent.toLowerCase() ) || [];
- $.ui.ie = uaMatch.length ? true : false;
- $.ui.ie6 = parseFloat( uaMatch[ 1 ], 10 ) === 6;
- })();
- $.fn.extend({
- disableSelection: function() {
- return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
- ".ui-disableSelection", function( event ) {
- event.preventDefault();
- });
- },
- enableSelection: function() {
- return this.unbind( ".ui-disableSelection" );
- }
- });
- $.extend( $.ui, {
- // $.ui.plugin is deprecated. Use the proxy pattern instead.
- plugin: {
- add: function( module, option, set ) {
- var i,
- proto = $.ui[ module ].prototype;
- for ( i in set ) {
- proto.plugins[ i ] = proto.plugins[ i ] || [];
- proto.plugins[ i ].push( [ option, set[ i ] ] );
- }
- },
- call: function( instance, name, args ) {
- var i,
- set = instance.plugins[ name ];
- if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {
- return;
- }
- for ( i = 0; i < set.length; i++ ) {
- if ( instance.options[ set[ i ][ 0 ] ] ) {
- set[ i ][ 1 ].apply( instance.element, args );
- }
- }
- }
- },
- contains: $.contains,
- // only used by resizable
- hasScroll: function( el, a ) {
- //If overflow is hidden, the element might have extra content, but the user wants to hide it
- if ( $( el ).css( "overflow" ) === "hidden") {
- return false;
- }
- var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
- has = false;
- if ( el[ scroll ] > 0 ) {
- return true;
- }
- // TODO: determine which cases actually cause this to happen
- // if the element doesn't have the scroll set, see if it's possible to
- // set the scroll
- el[ scroll ] = 1;
- has = ( el[ scroll ] > 0 );
- el[ scroll ] = 0;
- return has;
- },
- // these are odd functions, fix the API or move into individual plugins
- isOverAxis: function( x, reference, size ) {
- //Determines when x coordinate is over "b" element axis
- return ( x > reference ) && ( x < ( reference + size ) );
- },
- isOver: function( y, x, top, left, height, width ) {
- //Determines when x, y coordinates is over "b" element
- return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
- }
- });
- })( jQuery );
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJqcXVlcnl1aS9qcXVlcnkudWkuY29yZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGpRdWVyeSBVSSBDb3JlIDEuOS4yXG4gKiBodHRwOi8vanF1ZXJ5dWkuY29tXG4gKlxuICogQ29weXJpZ2h0IDIwMTIgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZVxuICpcbiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2NhdGVnb3J5L3VpLWNvcmUvXG4gKi9cbihmdW5jdGlvbiggJCwgdW5kZWZpbmVkICkge1xuXG52YXIgdXVpZCA9IDAsXG5cdHJ1bmlxdWVJZCA9IC9edWktaWQtXFxkKyQvO1xuXG4vLyBwcmV2ZW50IGR1cGxpY2F0ZSBsb2FkaW5nXG4vLyB0aGlzIGlzIG9ubHkgYSBwcm9ibGVtIGJlY2F1c2Ugd2UgcHJveHkgZXhpc3RpbmcgZnVuY3Rpb25zXG4vLyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBkb3VibGUgcHJveHkgdGhlbVxuJC51aSA9ICQudWkgfHwge307XG5pZiAoICQudWkudmVyc2lvbiApIHtcblx0cmV0dXJuO1xufVxuXG4kLmV4dGVuZCggJC51aSwge1xuXHR2ZXJzaW9uOiBcIjEuOS4yXCIsXG5cblx0a2V5Q29kZToge1xuXHRcdEJBQ0tTUEFDRTogOCxcblx0XHRDT01NQTogMTg4LFxuXHRcdERFTEVURTogNDYsXG5cdFx0RE9XTjogNDAsXG5cdFx0RU5EOiAzNSxcblx0XHRFTlRFUjogMTMsXG5cdFx0RVNDQVBFOiAyNyxcblx0XHRIT01FOiAzNixcblx0XHRMRUZUOiAzNyxcblx0XHROVU1QQURfQUREOiAxMDcsXG5cdFx0TlVNUEFEX0RFQ0lNQUw6IDExMCxcblx0XHROVU1QQURfRElWSURFOiAxMTEsXG5cdFx0TlVNUEFEX0VOVEVSOiAxMDgsXG5cdFx0TlVNUEFEX01VTFRJUExZOiAxMDYsXG5cdFx0TlVNUEFEX1NVQlRSQUNUOiAxMDksXG5cdFx0UEFHRV9ET1dOOiAzNCxcblx0XHRQQUdFX1VQOiAzMyxcblx0XHRQRVJJT0Q6IDE5MCxcblx0XHRSSUdIVDogMzksXG5cdFx0U1BBQ0U6IDMyLFxuXHRcdFRBQjogOSxcblx0XHRVUDogMzhcblx0fVxufSk7XG5cbi8vIHBsdWdpbnNcbiQuZm4uZXh0ZW5kKHtcblx0X2ZvY3VzOiAkLmZuLmZvY3VzLFxuXHRmb2N1czogZnVuY3Rpb24oIGRlbGF5LCBmbiApIHtcblx0XHRyZXR1cm4gdHlwZW9mIGRlbGF5ID09PSBcIm51bWJlclwiID9cblx0XHRcdHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGVsZW0gPSB0aGlzO1xuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdCQoIGVsZW0gKS5mb2N1cygpO1xuXHRcdFx0XHRcdGlmICggZm4gKSB7XG5cdFx0XHRcdFx0XHRmbi5jYWxsKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LCBkZWxheSApO1xuXHRcdFx0fSkgOlxuXHRcdFx0dGhpcy5fZm9jdXMuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9LFxuXG5cdHNjcm9sbFBhcmVudDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNjcm9sbFBhcmVudDtcblx0XHRpZiAoKCQudWkuaWUgJiYgKC8oc3RhdGljfHJlbGF0aXZlKS8pLnRlc3QodGhpcy5jc3MoJ3Bvc2l0aW9uJykpKSB8fCAoL2Fic29sdXRlLykudGVzdCh0aGlzLmNzcygncG9zaXRpb24nKSkpIHtcblx0XHRcdHNjcm9sbFBhcmVudCA9IHRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICgvKHJlbGF0aXZlfGFic29sdXRlfGZpeGVkKS8pLnRlc3QoJC5jc3ModGhpcywncG9zaXRpb24nKSkgJiYgKC8oYXV0b3xzY3JvbGwpLykudGVzdCgkLmNzcyh0aGlzLCdvdmVyZmxvdycpKyQuY3NzKHRoaXMsJ292ZXJmbG93LXknKSskLmNzcyh0aGlzLCdvdmVyZmxvdy14JykpO1xuXHRcdFx0fSkuZXEoMCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNjcm9sbFBhcmVudCA9IHRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICgvKGF1dG98c2Nyb2xsKS8pLnRlc3QoJC5jc3ModGhpcywnb3ZlcmZsb3cnKSskLmNzcyh0aGlzLCdvdmVyZmxvdy15JykrJC5jc3ModGhpcywnb3ZlcmZsb3cteCcpKTtcblx0XHRcdH0pLmVxKDApO1xuXHRcdH1cblxuXHRcdHJldHVybiAoL2ZpeGVkLykudGVzdCh0aGlzLmNzcygncG9zaXRpb24nKSkgfHwgIXNjcm9sbFBhcmVudC5sZW5ndGggPyAkKGRvY3VtZW50KSA6IHNjcm9sbFBhcmVudDtcblx0fSxcblxuXHR6SW5kZXg6IGZ1bmN0aW9uKCB6SW5kZXggKSB7XG5cdFx0aWYgKCB6SW5kZXggIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHJldHVybiB0aGlzLmNzcyggXCJ6SW5kZXhcIiwgekluZGV4ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmxlbmd0aCApIHtcblx0XHRcdHZhciBlbGVtID0gJCggdGhpc1sgMCBdICksIHBvc2l0aW9uLCB2YWx1ZTtcblx0XHRcdHdoaWxlICggZWxlbS5sZW5ndGggJiYgZWxlbVsgMCBdICE9PSBkb2N1bWVudCApIHtcblx0XHRcdFx0Ly8gSWdub3JlIHotaW5kZXggaWYgcG9zaXRpb24gaXMgc2V0IHRvIGEgdmFsdWUgd2hlcmUgei1pbmRleCBpcyBpZ25vcmVkIGJ5IHRoZSBicm93c2VyXG5cdFx0XHRcdC8vIFRoaXMgbWFrZXMgYmVoYXZpb3Igb2YgdGhpcyBmdW5jdGlvbiBjb25zaXN0ZW50IGFjcm9zcyBicm93c2Vyc1xuXHRcdFx0XHQvLyBXZWJLaXQgYWx3YXlzIHJldHVybnMgYXV0byBpZiB0aGUgZWxlbWVudCBpcyBwb3NpdGlvbmVkXG5cdFx0XHRcdHBvc2l0aW9uID0gZWxlbS5jc3MoIFwicG9zaXRpb25cIiApO1xuXHRcdFx0XHRpZiAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwicmVsYXRpdmVcIiB8fCBwb3NpdGlvbiA9PT0gXCJmaXhlZFwiICkge1xuXHRcdFx0XHRcdC8vIElFIHJldHVybnMgMCB3aGVuIHpJbmRleCBpcyBub3Qgc3BlY2lmaWVkXG5cdFx0XHRcdFx0Ly8gb3RoZXIgYnJvd3NlcnMgcmV0dXJuIGEgc3RyaW5nXG5cdFx0XHRcdFx0Ly8gd2UgaWdub3JlIHRoZSBjYXNlIG9mIG5lc3RlZCBlbGVtZW50cyB3aXRoIGFuIGV4cGxpY2l0IHZhbHVlIG9mIDBcblx0XHRcdFx0XHQvLyA8ZGl2IHN0eWxlPVwiei1pbmRleDogLTEwO1wiPjxkaXYgc3R5bGU9XCJ6LWluZGV4OiAwO1wiPjwvZGl2PjwvZGl2PlxuXHRcdFx0XHRcdHZhbHVlID0gcGFyc2VJbnQoIGVsZW0uY3NzKCBcInpJbmRleFwiICksIDEwICk7XG5cdFx0XHRcdFx0aWYgKCAhaXNOYU4oIHZhbHVlICkgJiYgdmFsdWUgIT09IDAgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsZW0gPSBlbGVtLnBhcmVudCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdHVuaXF1ZUlkOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhdGhpcy5pZCApIHtcblx0XHRcdFx0dGhpcy5pZCA9IFwidWktaWQtXCIgKyAoKyt1dWlkKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRyZW1vdmVVbmlxdWVJZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdGlmICggcnVuaXF1ZUlkLnRlc3QoIHRoaXMuaWQgKSApIHtcblx0XHRcdFx0JCggdGhpcyApLnJlbW92ZUF0dHIoIFwiaWRcIiApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59KTtcblxuLy8gc2VsZWN0b3JzXG5mdW5jdGlvbiBmb2N1c2FibGUoIGVsZW1lbnQsIGlzVGFiSW5kZXhOb3ROYU4gKSB7XG5cdHZhciBtYXAsIG1hcE5hbWUsIGltZyxcblx0XHRub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0aWYgKCBcImFyZWFcIiA9PT0gbm9kZU5hbWUgKSB7XG5cdFx0bWFwID0gZWxlbWVudC5wYXJlbnROb2RlO1xuXHRcdG1hcE5hbWUgPSBtYXAubmFtZTtcblx0XHRpZiAoICFlbGVtZW50LmhyZWYgfHwgIW1hcE5hbWUgfHwgbWFwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwibWFwXCIgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdGltZyA9ICQoIFwiaW1nW3VzZW1hcD0jXCIgKyBtYXBOYW1lICsgXCJdXCIgKVswXTtcblx0XHRyZXR1cm4gISFpbWcgJiYgdmlzaWJsZSggaW1nICk7XG5cdH1cblx0cmV0dXJuICggL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0Ly50ZXN0KCBub2RlTmFtZSApID9cblx0XHQhZWxlbWVudC5kaXNhYmxlZCA6XG5cdFx0XCJhXCIgPT09IG5vZGVOYW1lID9cblx0XHRcdGVsZW1lbnQuaHJlZiB8fCBpc1RhYkluZGV4Tm90TmFOIDpcblx0XHRcdGlzVGFiSW5kZXhOb3ROYU4pICYmXG5cdFx0Ly8gdGhlIGVsZW1lbnQgYW5kIGFsbCBvZiBpdHMgYW5jZXN0b3JzIG11c3QgYmUgdmlzaWJsZVxuXHRcdHZpc2libGUoIGVsZW1lbnQgKTtcbn1cblxuZnVuY3Rpb24gdmlzaWJsZSggZWxlbWVudCApIHtcblx0cmV0dXJuICQuZXhwci5maWx0ZXJzLnZpc2libGUoIGVsZW1lbnQgKSAmJlxuXHRcdCEkKCBlbGVtZW50ICkucGFyZW50cygpLmFuZFNlbGYoKS5maWx0ZXIoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gJC5jc3MoIHRoaXMsIFwidmlzaWJpbGl0eVwiICkgPT09IFwiaGlkZGVuXCI7XG5cdFx0fSkubGVuZ3RoO1xufVxuXG4kLmV4dGVuZCggJC5leHByWyBcIjpcIiBdLCB7XG5cdGRhdGE6ICQuZXhwci5jcmVhdGVQc2V1ZG8gP1xuXHRcdCQuZXhwci5jcmVhdGVQc2V1ZG8oZnVuY3Rpb24oIGRhdGFOYW1lICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gISEkLmRhdGEoIGVsZW0sIGRhdGFOYW1lICk7XG5cdFx0XHR9O1xuXHRcdH0pIDpcblx0XHQvLyBzdXBwb3J0OiBqUXVlcnkgPDEuOFxuXHRcdGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHtcblx0XHRcdHJldHVybiAhISQuZGF0YSggZWxlbSwgbWF0Y2hbIDMgXSApO1xuXHRcdH0sXG5cblx0Zm9jdXNhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHtcblx0XHRyZXR1cm4gZm9jdXNhYmxlKCBlbGVtZW50LCAhaXNOYU4oICQuYXR0ciggZWxlbWVudCwgXCJ0YWJpbmRleFwiICkgKSApO1xuXHR9LFxuXG5cdHRhYmJhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHtcblx0XHR2YXIgdGFiSW5kZXggPSAkLmF0dHIoIGVsZW1lbnQsIFwidGFiaW5kZXhcIiApLFxuXHRcdFx0aXNUYWJJbmRleE5hTiA9IGlzTmFOKCB0YWJJbmRleCApO1xuXHRcdHJldHVybiAoIGlzVGFiSW5kZXhOYU4gfHwgdGFiSW5kZXggPj0gMCApICYmIGZvY3VzYWJsZSggZWxlbWVudCwgIWlzVGFiSW5kZXhOYU4gKTtcblx0fVxufSk7XG5cbi8vIHN1cHBvcnRcbiQoZnVuY3Rpb24oKSB7XG5cdHZhciBib2R5ID0gZG9jdW1lbnQuYm9keSxcblx0XHRkaXYgPSBib2R5LmFwcGVuZENoaWxkKCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKTtcblxuXHQvLyBhY2Nlc3Mgb2Zmc2V0SGVpZ2h0IGJlZm9yZSBzZXR0aW5nIHRoZSBzdHlsZSB0byBwcmV2ZW50IGEgbGF5b3V0IGJ1Z1xuXHQvLyBpbiBJRSA5IHdoaWNoIGNhdXNlcyB0aGUgZWxlbWVudCB0byBjb250aW51ZSB0byB0YWtlIHVwIHNwYWNlIGV2ZW5cblx0Ly8gYWZ0ZXIgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00gKCM4MDI2KVxuXHRkaXYub2Zmc2V0SGVpZ2h0O1xuXG5cdCQuZXh0ZW5kKCBkaXYuc3R5bGUsIHtcblx0XHRtaW5IZWlnaHQ6IFwiMTAwcHhcIixcblx0XHRoZWlnaHQ6IFwiYXV0b1wiLFxuXHRcdHBhZGRpbmc6IDAsXG5cdFx0Ym9yZGVyV2lkdGg6IDBcblx0fSk7XG5cblx0JC5zdXBwb3J0Lm1pbkhlaWdodCA9IGRpdi5vZmZzZXRIZWlnaHQgPT09IDEwMDtcblx0JC5zdXBwb3J0LnNlbGVjdHN0YXJ0ID0gXCJvbnNlbGVjdHN0YXJ0XCIgaW4gZGl2O1xuXG5cdC8vIHNldCBkaXNwbGF5IHRvIG5vbmUgdG8gYXZvaWQgYSBsYXlvdXQgYnVnIGluIElFXG5cdC8vIGh0dHA6Ly9kZXYuanF1ZXJ5LmNvbS90aWNrZXQvNDAxNFxuXHRib2R5LnJlbW92ZUNoaWxkKCBkaXYgKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG59KTtcblxuLy8gc3VwcG9ydDogalF1ZXJ5IDwxLjhcbmlmICggISQoIFwiPGE+XCIgKS5vdXRlcldpZHRoKCAxICkuanF1ZXJ5ICkge1xuXHQkLmVhY2goIFsgXCJXaWR0aFwiLCBcIkhlaWdodFwiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHRcdHZhciBzaWRlID0gbmFtZSA9PT0gXCJXaWR0aFwiID8gWyBcIkxlZnRcIiwgXCJSaWdodFwiIF0gOiBbIFwiVG9wXCIsIFwiQm90dG9tXCIgXSxcblx0XHRcdHR5cGUgPSBuYW1lLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRvcmlnID0ge1xuXHRcdFx0XHRpbm5lcldpZHRoOiAkLmZuLmlubmVyV2lkdGgsXG5cdFx0XHRcdGlubmVySGVpZ2h0OiAkLmZuLmlubmVySGVpZ2h0LFxuXHRcdFx0XHRvdXRlcldpZHRoOiAkLmZuLm91dGVyV2lkdGgsXG5cdFx0XHRcdG91dGVySGVpZ2h0OiAkLmZuLm91dGVySGVpZ2h0XG5cdFx0XHR9O1xuXG5cdFx0ZnVuY3Rpb24gcmVkdWNlKCBlbGVtLCBzaXplLCBib3JkZXIsIG1hcmdpbiApIHtcblx0XHRcdCQuZWFjaCggc2lkZSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHNpemUgLT0gcGFyc2VGbG9hdCggJC5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgdGhpcyApICkgfHwgMDtcblx0XHRcdFx0aWYgKCBib3JkZXIgKSB7XG5cdFx0XHRcdFx0c2l6ZSAtPSBwYXJzZUZsb2F0KCAkLmNzcyggZWxlbSwgXCJib3JkZXJcIiArIHRoaXMgKyBcIldpZHRoXCIgKSApIHx8IDA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBtYXJnaW4gKSB7XG5cdFx0XHRcdFx0c2l6ZSAtPSBwYXJzZUZsb2F0KCAkLmNzcyggZWxlbSwgXCJtYXJnaW5cIiArIHRoaXMgKSApIHx8IDA7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIHNpemU7XG5cdFx0fVxuXG5cdFx0JC5mblsgXCJpbm5lclwiICsgbmFtZSBdID0gZnVuY3Rpb24oIHNpemUgKSB7XG5cdFx0XHRpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIG9yaWdbIFwiaW5uZXJcIiArIG5hbWUgXS5jYWxsKCB0aGlzICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdCQoIHRoaXMgKS5jc3MoIHR5cGUsIHJlZHVjZSggdGhpcywgc2l6ZSApICsgXCJweFwiICk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0JC5mblsgXCJvdXRlclwiICsgbmFtZV0gPSBmdW5jdGlvbiggc2l6ZSwgbWFyZ2luICkge1xuXHRcdFx0aWYgKCB0eXBlb2Ygc2l6ZSAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0cmV0dXJuIG9yaWdbIFwib3V0ZXJcIiArIG5hbWUgXS5jYWxsKCB0aGlzLCBzaXplICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdCQoIHRoaXMpLmNzcyggdHlwZSwgcmVkdWNlKCB0aGlzLCBzaXplLCB0cnVlLCBtYXJnaW4gKSArIFwicHhcIiApO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0fSk7XG59XG5cbi8vIHN1cHBvcnQ6IGpRdWVyeSAxLjYuMSwgMS42LjIgKGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0Lzk0MTMpXG5pZiAoICQoIFwiPGE+XCIgKS5kYXRhKCBcImEtYlwiLCBcImFcIiApLnJlbW92ZURhdGEoIFwiYS1iXCIgKS5kYXRhKCBcImEtYlwiICkgKSB7XG5cdCQuZm4ucmVtb3ZlRGF0YSA9IChmdW5jdGlvbiggcmVtb3ZlRGF0YSApIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24oIGtleSApIHtcblx0XHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0cmV0dXJuIHJlbW92ZURhdGEuY2FsbCggdGhpcywgJC5jYW1lbENhc2UoIGtleSApICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gcmVtb3ZlRGF0YS5jYWxsKCB0aGlzICk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fSkoICQuZm4ucmVtb3ZlRGF0YSApO1xufVxuXG5cblxuXG5cbi8vIGRlcHJlY2F0ZWRcblxuKGZ1bmN0aW9uKCkge1xuXHR2YXIgdWFNYXRjaCA9IC9tc2llIChbXFx3Ll0rKS8uZXhlYyggbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpICkgfHwgW107XG5cdCQudWkuaWUgPSB1YU1hdGNoLmxlbmd0aCA/IHRydWUgOiBmYWxzZTtcblx0JC51aS5pZTYgPSBwYXJzZUZsb2F0KCB1YU1hdGNoWyAxIF0sIDEwICkgPT09IDY7XG59KSgpO1xuXG4kLmZuLmV4dGVuZCh7XG5cdGRpc2FibGVTZWxlY3Rpb246IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmJpbmQoICggJC5zdXBwb3J0LnNlbGVjdHN0YXJ0ID8gXCJzZWxlY3RzdGFydFwiIDogXCJtb3VzZWRvd25cIiApICtcblx0XHRcdFwiLnVpLWRpc2FibGVTZWxlY3Rpb25cIiwgZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0ZW5hYmxlU2VsZWN0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy51bmJpbmQoIFwiLnVpLWRpc2FibGVTZWxlY3Rpb25cIiApO1xuXHR9XG59KTtcblxuJC5leHRlbmQoICQudWksIHtcblx0Ly8gJC51aS5wbHVnaW4gaXMgZGVwcmVjYXRlZC4gIFVzZSB0aGUgcHJveHkgcGF0dGVybiBpbnN0ZWFkLlxuXHRwbHVnaW46IHtcblx0XHRhZGQ6IGZ1bmN0aW9uKCBtb2R1bGUsIG9wdGlvbiwgc2V0ICkge1xuXHRcdFx0dmFyIGksXG5cdFx0XHRcdHByb3RvID0gJC51aVsgbW9kdWxlIF0ucHJvdG90eXBlO1xuXHRcdFx0Zm9yICggaSBpbiBzZXQgKSB7XG5cdFx0XHRcdHByb3RvLnBsdWdpbnNbIGkgXSA9IHByb3RvLnBsdWdpbnNbIGkgXSB8fCBbXTtcblx0XHRcdFx0cHJvdG8ucGx1Z2luc1sgaSBdLnB1c2goIFsgb3B0aW9uLCBzZXRbIGkgXSBdICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRjYWxsOiBmdW5jdGlvbiggaW5zdGFuY2UsIG5hbWUsIGFyZ3MgKSB7XG5cdFx0XHR2YXIgaSxcblx0XHRcdFx0c2V0ID0gaW5zdGFuY2UucGx1Z2luc1sgbmFtZSBdO1xuXHRcdFx0aWYgKCAhc2V0IHx8ICFpbnN0YW5jZS5lbGVtZW50WyAwIF0ucGFyZW50Tm9kZSB8fCBpbnN0YW5jZS5lbGVtZW50WyAwIF0ucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMTEgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggaW5zdGFuY2Uub3B0aW9uc1sgc2V0WyBpIF1bIDAgXSBdICkge1xuXHRcdFx0XHRcdHNldFsgaSBdWyAxIF0uYXBwbHkoIGluc3RhbmNlLmVsZW1lbnQsIGFyZ3MgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRjb250YWluczogJC5jb250YWlucyxcblxuXHQvLyBvbmx5IHVzZWQgYnkgcmVzaXphYmxlXG5cdGhhc1Njcm9sbDogZnVuY3Rpb24oIGVsLCBhICkge1xuXG5cdFx0Ly9JZiBvdmVyZmxvdyBpcyBoaWRkZW4sIHRoZSBlbGVtZW50IG1pZ2h0IGhhdmUgZXh0cmEgY29udGVudCwgYnV0IHRoZSB1c2VyIHdhbnRzIHRvIGhpZGUgaXRcblx0XHRpZiAoICQoIGVsICkuY3NzKCBcIm92ZXJmbG93XCIgKSA9PT0gXCJoaWRkZW5cIikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHZhciBzY3JvbGwgPSAoIGEgJiYgYSA9PT0gXCJsZWZ0XCIgKSA/IFwic2Nyb2xsTGVmdFwiIDogXCJzY3JvbGxUb3BcIixcblx0XHRcdGhhcyA9IGZhbHNlO1xuXG5cdFx0aWYgKCBlbFsgc2Nyb2xsIF0gPiAwICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gVE9ETzogZGV0ZXJtaW5lIHdoaWNoIGNhc2VzIGFjdHVhbGx5IGNhdXNlIHRoaXMgdG8gaGFwcGVuXG5cdFx0Ly8gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIHRoZSBzY3JvbGwgc2V0LCBzZWUgaWYgaXQncyBwb3NzaWJsZSB0b1xuXHRcdC8vIHNldCB0aGUgc2Nyb2xsXG5cdFx0ZWxbIHNjcm9sbCBdID0gMTtcblx0XHRoYXMgPSAoIGVsWyBzY3JvbGwgXSA+IDAgKTtcblx0XHRlbFsgc2Nyb2xsIF0gPSAwO1xuXHRcdHJldHVybiBoYXM7XG5cdH0sXG5cblx0Ly8gdGhlc2UgYXJlIG9kZCBmdW5jdGlvbnMsIGZpeCB0aGUgQVBJIG9yIG1vdmUgaW50byBpbmRpdmlkdWFsIHBsdWdpbnNcblx0aXNPdmVyQXhpczogZnVuY3Rpb24oIHgsIHJlZmVyZW5jZSwgc2l6ZSApIHtcblx0XHQvL0RldGVybWluZXMgd2hlbiB4IGNvb3JkaW5hdGUgaXMgb3ZlciBcImJcIiBlbGVtZW50IGF4aXNcblx0XHRyZXR1cm4gKCB4ID4gcmVmZXJlbmNlICkgJiYgKCB4IDwgKCByZWZlcmVuY2UgKyBzaXplICkgKTtcblx0fSxcblx0aXNPdmVyOiBmdW5jdGlvbiggeSwgeCwgdG9wLCBsZWZ0LCBoZWlnaHQsIHdpZHRoICkge1xuXHRcdC8vRGV0ZXJtaW5lcyB3aGVuIHgsIHkgY29vcmRpbmF0ZXMgaXMgb3ZlciBcImJcIiBlbGVtZW50XG5cdFx0cmV0dXJuICQudWkuaXNPdmVyQXhpcyggeSwgdG9wLCBoZWlnaHQgKSAmJiAkLnVpLmlzT3ZlckF4aXMoIHgsIGxlZnQsIHdpZHRoICk7XG5cdH1cbn0pO1xuXG59KSggalF1ZXJ5ICk7XG4iXSwiZmlsZSI6ImpxdWVyeXVpL2pxdWVyeS51aS5jb3JlLmpzIn0=
- /*!
- * jQuery UI Datepicker 1.9.2
- * http://jqueryui.com
- *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/datepicker/
- *
- * Depends:
- * jquery.ui.core.js
- */
- (function( $, undefined ) {
- $.extend($.ui, { datepicker: { version: "1.9.2" } });
- var PROP_NAME = 'datepicker';
- var dpuuid = new Date().getTime();
- var instActive;
- /* Date picker manager.
- Use the singleton instance of this class, $.datepicker, to interact with the date picker.
- Settings for (groups of) date pickers are maintained in an instance object,
- allowing multiple different settings on the same page. */
- function Datepicker() {
- this.debug = false; // Change this to true to start debugging
- this._curInst = null; // The current instance in use
- this._keyEvent = false; // If the last event was a key event
- this._disabledInputs = []; // List of date picker inputs that have been disabled
- this._datepickerShowing = false; // True if the popup picker is showing , false if not
- this._inDialog = false; // True if showing within a "dialog", false if not
- this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
- this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
- this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
- this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
- this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
- this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
- this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
- this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
- this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
- this.regional = []; // Available regional settings, indexed by language code
- this.regional[''] = { // Default regional settings
- closeText: 'Done', // Display text for close link
- prevText: 'Prev', // Display text for previous month link
- nextText: 'Next', // Display text for next month link
- currentText: 'Today', // Display text for current month link
- monthNames: ['January','February','March','April','May','June',
- 'July','August','September','October','November','December'], // Names of months for drop-down and formatting
- monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
- dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
- dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
- dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
- weekHeader: 'Wk', // Column header for week of the year
- dateFormat: 'mm/dd/yy', // See format options on parseDate
- firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
- isRTL: false, // True if right-to-left language, false if left-to-right
- showMonthAfterYear: false, // True if the year select precedes month, false for month then year
- yearSuffix: '' // Additional text to append to the year in the month headers
- };
- this._defaults = { // Global defaults for all the date picker instances
- showOn: 'focus', // 'focus' for popup on focus,
- // 'button' for trigger button, or 'both' for either
- showAnim: 'fadeIn', // Name of jQuery animation for popup
- showOptions: {}, // Options for enhanced animations
- defaultDate: null, // Used when field is blank: actual date,
- // +/-number for offset from today, null for today
- appendText: '', // Display text following the input box, e.g. showing the format
- buttonText: '...', // Text for trigger button
- buttonImage: '', // URL for trigger button image
- buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
- hideIfNoPrevNext: false, // True to hide next/previous month links
- // if not applicable, false to just disable them
- navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
- gotoCurrent: false, // True if today link goes back to current selection instead
- changeMonth: false, // True if month can be selected directly, false if only prev/next
- changeYear: false, // True if year can be selected directly, false if only prev/next
- yearRange: 'c-10:c+10', // Range of years to display in drop-down,
- // either relative to today's year (-nn:+nn), relative to currently displayed year
- // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
- showOtherMonths: false, // True to show dates in other months, false to leave blank
- selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
- showWeek: false, // True to show week of the year, false to not show it
- calculateWeek: this.iso8601Week, // How to calculate the week of the year,
- // takes a Date and returns the number of the week for it
- shortYearCutoff: '+10', // Short year values < this are in the current century,
- // > this are in the previous century,
- // string value starting with '+' for current year + value
- minDate: null, // The earliest selectable date, or null for no limit
- maxDate: null, // The latest selectable date, or null for no limit
- duration: 'fast', // Duration of display/closure
- beforeShowDay: null, // Function that takes a date and returns an array with
- // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
- // [2] = cell title (optional), e.g. $.datepicker.noWeekends
- beforeShow: null, // Function that takes an input field and
- // returns a set of custom settings for the date picker
- onSelect: null, // Define a callback function when a date is selected
- onChangeMonthYear: null, // Define a callback function when the month or year is changed
- onClose: null, // Define a callback function when the datepicker is closed
- numberOfMonths: 1, // Number of months to show at a time
- showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
- stepMonths: 1, // Number of months to step back/forward
- stepBigMonths: 12, // Number of months to step back/forward for the big links
- altField: '', // Selector for an alternate field to store selected dates into
- altFormat: '', // The date format to use for the alternate field
- constrainInput: true, // The input is constrained by the current date format
- showButtonPanel: false, // True to show button panel, false to not show it
- autoSize: false, // True to size the input for the date format, false to leave as is
- disabled: false // The initial disabled state
- };
- $.extend(this._defaults, this.regional['']);
- this.dpDiv = bindHover($('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'));
- }
- $.extend(Datepicker.prototype, {
- /* Class name added to elements to indicate already configured with a date picker. */
- markerClassName: 'hasDatepicker',
- //Keep track of the maximum number of rows displayed (see #7043)
- maxRows: 4,
- /* Debug logging (if enabled). */
- log: function () {
- if (this.debug)
- console.log.apply('', arguments);
- },
- // TODO rename to "widget" when switching to widget factory
- _widgetDatepicker: function() {
- return this.dpDiv;
- },
- /* Override the default settings for all instances of the date picker.
- @param settings object - the new settings to use as defaults (anonymous object)
- @return the manager object */
- setDefaults: function(settings) {
- extendRemove(this._defaults, settings || {});
- return this;
- },
- /* Attach the date picker to a jQuery selection.
- @param target element - the target input field or division or span
- @param settings object - the new settings to use for this date picker instance (anonymous) */
- _attachDatepicker: function(target, settings) {
- // check for settings on the control itself - in namespace 'date:'
- var inlineSettings = null;
- for (var attrName in this._defaults) {
- var attrValue = target.getAttribute('date:' + attrName);
- if (attrValue) {
- inlineSettings = inlineSettings || {};
- try {
- inlineSettings[attrName] = eval(attrValue);
- } catch (err) {
- inlineSettings[attrName] = attrValue;
- }
- }
- }
- var nodeName = target.nodeName.toLowerCase();
- var inline = (nodeName == 'div' || nodeName == 'span');
- if (!target.id) {
- this.uuid += 1;
- target.id = 'dp' + this.uuid;
- }
- var inst = this._newInst($(target), inline);
- inst.settings = $.extend({}, settings || {}, inlineSettings || {});
- if (nodeName == 'input') {
- this._connectDatepicker(target, inst);
- } else if (inline) {
- this._inlineDatepicker(target, inst);
- }
- },
- /* Create a new instance object. */
- _newInst: function(target, inline) {
- var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
- return {id: id, input: target, // associated target
- selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
- drawMonth: 0, drawYear: 0, // month being drawn
- inline: inline, // is datepicker inline or not
- dpDiv: (!inline ? this.dpDiv : // presentation div
- bindHover($('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')))};
- },
- /* Attach the date picker to an input field. */
- _connectDatepicker: function(target, inst) {
- var input = $(target);
- inst.append = $([]);
- inst.trigger = $([]);
- if (input.hasClass(this.markerClassName))
- return;
- this._attachments(input, inst);
- input.addClass(this.markerClassName).keydown(this._doKeyDown).
- keypress(this._doKeyPress).keyup(this._doKeyUp).
- bind("setData.datepicker", function(event, key, value) {
- inst.settings[key] = value;
- }).bind("getData.datepicker", function(event, key) {
- return this._get(inst, key);
- });
- this._autoSize(inst);
- $.data(target, PROP_NAME, inst);
- //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
- if( inst.settings.disabled ) {
- this._disableDatepicker( target );
- }
- },
- /* Make attachments based on settings. */
- _attachments: function(input, inst) {
- var appendText = this._get(inst, 'appendText');
- var isRTL = this._get(inst, 'isRTL');
- if (inst.append)
- inst.append.remove();
- if (appendText) {
- inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
- input[isRTL ? 'before' : 'after'](inst.append);
- }
- input.unbind('focus', this._showDatepicker);
- if (inst.trigger)
- inst.trigger.remove();
- var showOn = this._get(inst, 'showOn');
- if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
- input.focus(this._showDatepicker);
- if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
- var buttonText = this._get(inst, 'buttonText');
- var buttonImage = this._get(inst, 'buttonImage');
- inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
- $('<img/>').addClass(this._triggerClass).
- attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
- $('<button type="button"></button>').addClass(this._triggerClass).
- html(buttonImage == '' ? buttonText : $('<img/>').attr(
- { src:buttonImage, alt:buttonText, title:buttonText })));
- input[isRTL ? 'before' : 'after'](inst.trigger);
- inst.trigger.click(function() {
- if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
- $.datepicker._hideDatepicker();
- else if ($.datepicker._datepickerShowing && $.datepicker._lastInput != input[0]) {
- $.datepicker._hideDatepicker();
- $.datepicker._showDatepicker(input[0]);
- } else
- $.datepicker._showDatepicker(input[0]);
- return false;
- });
- }
- },
- /* Apply the maximum length for the date format. */
- _autoSize: function(inst) {
- if (this._get(inst, 'autoSize') && !inst.inline) {
- var date = new Date(2009, 12 - 1, 20); // Ensure double digits
- var dateFormat = this._get(inst, 'dateFormat');
- if (dateFormat.match(/[DM]/)) {
- var findMax = function(names) {
- var max = 0;
- var maxI = 0;
- for (var i = 0; i < names.length; i++) {
- if (names[i].length > max) {
- max = names[i].length;
- maxI = i;
- }
- }
- return maxI;
- };
- date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
- 'monthNames' : 'monthNamesShort'))));
- date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
- 'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
- }
- inst.input.attr('size', this._formatDate(inst, date).length);
- }
- },
- /* Attach an inline date picker to a div. */
- _inlineDatepicker: function(target, inst) {
- var divSpan = $(target);
- if (divSpan.hasClass(this.markerClassName))
- return;
- divSpan.addClass(this.markerClassName).append(inst.dpDiv).
- bind("setData.datepicker", function(event, key, value){
- inst.settings[key] = value;
- }).bind("getData.datepicker", function(event, key){
- return this._get(inst, key);
- });
- $.data(target, PROP_NAME, inst);
- this._setDate(inst, this._getDefaultDate(inst), true);
- this._updateDatepicker(inst);
- this._updateAlternate(inst);
- //If disabled option is true, disable the datepicker before showing it (see ticket #5665)
- if( inst.settings.disabled ) {
- this._disableDatepicker( target );
- }
- // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
- // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
- inst.dpDiv.css( "display", "block" );
- },
- /* Pop-up the date picker in a "dialog" box.
- @param input element - ignored
- @param date string or Date - the initial date to display
- @param onSelect function - the function to call when a date is selected
- @param settings object - update the dialog date picker instance's settings (anonymous object)
- @param pos int[2] - coordinates for the dialog's position within the screen or
- event - with x/y coordinates or
- leave empty for default (screen centre)
- @return the manager object */
- _dialogDatepicker: function(input, date, onSelect, settings, pos) {
- var inst = this._dialogInst; // internal instance
- if (!inst) {
- this.uuid += 1;
- var id = 'dp' + this.uuid;
- this._dialogInput = $('<input type="text" id="' + id +
- '" style="position: absolute; top: -100px; width: 0px;"/>');
- this._dialogInput.keydown(this._doKeyDown);
- $('body').append(this._dialogInput);
- inst = this._dialogInst = this._newInst(this._dialogInput, false);
- inst.settings = {};
- $.data(this._dialogInput[0], PROP_NAME, inst);
- }
- extendRemove(inst.settings, settings || {});
- date = (date && date.constructor == Date ? this._formatDate(inst, date) : date);
- this._dialogInput.val(date);
- this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
- if (!this._pos) {
- var browserWidth = document.documentElement.clientWidth;
- var browserHeight = document.documentElement.clientHeight;
- var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
- var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
- this._pos = // should use actual width/height below
- [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
- }
- // move input on screen for focus, but hidden behind dialog
- this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px');
- inst.settings.onSelect = onSelect;
- this._inDialog = true;
- this.dpDiv.addClass(this._dialogClass);
- this._showDatepicker(this._dialogInput[0]);
- if ($.blockUI)
- $.blockUI(this.dpDiv);
- $.data(this._dialogInput[0], PROP_NAME, inst);
- return this;
- },
- /* Detach a datepicker from its control.
- @param target element - the target input field or division or span */
- _destroyDatepicker: function(target) {
- var $target = $(target);
- var inst = $.data(target, PROP_NAME);
- if (!$target.hasClass(this.markerClassName)) {
- return;
- }
- var nodeName = target.nodeName.toLowerCase();
- $.removeData(target, PROP_NAME);
- if (nodeName == 'input') {
- inst.append.remove();
- inst.trigger.remove();
- $target.removeClass(this.markerClassName).
- unbind('focus', this._showDatepicker).
- unbind('keydown', this._doKeyDown).
- unbind('keypress', this._doKeyPress).
- unbind('keyup', this._doKeyUp);
- } else if (nodeName == 'div' || nodeName == 'span')
- $target.removeClass(this.markerClassName).empty();
- },
- /* Enable the date picker to a jQuery selection.
- @param target element - the target input field or division or span */
- _enableDatepicker: function(target) {
- var $target = $(target);
- var inst = $.data(target, PROP_NAME);
- if (!$target.hasClass(this.markerClassName)) {
- return;
- }
- var nodeName = target.nodeName.toLowerCase();
- if (nodeName == 'input') {
- target.disabled = false;
- inst.trigger.filter('button').
- each(function() { this.disabled = false; }).end().
- filter('img').css({opacity: '1.0', cursor: ''});
- }
- else if (nodeName == 'div' || nodeName == 'span') {
- var inline = $target.children('.' + this._inlineClass);
- inline.children().removeClass('ui-state-disabled');
- inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
- prop("disabled", false);
- }
- this._disabledInputs = $.map(this._disabledInputs,
- function(value) { return (value == target ? null : value); }); // delete entry
- },
- /* Disable the date picker to a jQuery selection.
- @param target element - the target input field or division or span */
- _disableDatepicker: function(target) {
- var $target = $(target);
- var inst = $.data(target, PROP_NAME);
- if (!$target.hasClass(this.markerClassName)) {
- return;
- }
- var nodeName = target.nodeName.toLowerCase();
- if (nodeName == 'input') {
- target.disabled = true;
- inst.trigger.filter('button').
- each(function() { this.disabled = true; }).end().
- filter('img').css({opacity: '0.5', cursor: 'default'});
- }
- else if (nodeName == 'div' || nodeName == 'span') {
- var inline = $target.children('.' + this._inlineClass);
- inline.children().addClass('ui-state-disabled');
- inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
- prop("disabled", true);
- }
- this._disabledInputs = $.map(this._disabledInputs,
- function(value) { return (value == target ? null : value); }); // delete entry
- this._disabledInputs[this._disabledInputs.length] = target;
- },
- /* Is the first field in a jQuery collection disabled as a datepicker?
- @param target element - the target input field or division or span
- @return boolean - true if disabled, false if enabled */
- _isDisabledDatepicker: function(target) {
- if (!target) {
- return false;
- }
- for (var i = 0; i < this._disabledInputs.length; i++) {
- if (this._disabledInputs[i] == target)
- return true;
- }
- return false;
- },
- /* Retrieve the instance data for the target control.
- @param target element - the target input field or division or span
- @return object - the associated instance data
- @throws error if a jQuery problem getting data */
- _getInst: function(target) {
- try {
- return $.data(target, PROP_NAME);
- }
- catch (err) {
- throw 'Missing instance data for this datepicker';
- }
- },
- /* Update or retrieve the settings for a date picker attached to an input field or division.
- @param target element - the target input field or division or span
- @param name object - the new settings to update or
- string - the name of the setting to change or retrieve,
- when retrieving also 'all' for all instance settings or
- 'defaults' for all global defaults
- @param value any - the new value for the setting
- (omit if above is an object or to retrieve a value) */
- _optionDatepicker: function(target, name, value) {
- var inst = this._getInst(target);
- if (arguments.length == 2 && typeof name == 'string') {
- return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
- (inst ? (name == 'all' ? $.extend({}, inst.settings) :
- this._get(inst, name)) : null));
- }
- var settings = name || {};
- if (typeof name == 'string') {
- settings = {};
- settings[name] = value;
- }
- if (inst) {
- if (this._curInst == inst) {
- this._hideDatepicker();
- }
- var date = this._getDateDatepicker(target, true);
- var minDate = this._getMinMaxDate(inst, 'min');
- var maxDate = this._getMinMaxDate(inst, 'max');
- extendRemove(inst.settings, settings);
- // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
- if (minDate !== null && settings['dateFormat'] !== undefined && settings['minDate'] === undefined)
- inst.settings.minDate = this._formatDate(inst, minDate);
- if (maxDate !== null && settings['dateFormat'] !== undefined && settings['maxDate'] === undefined)
- inst.settings.maxDate = this._formatDate(inst, maxDate);
- this._attachments($(target), inst);
- this._autoSize(inst);
- this._setDate(inst, date);
- this._updateAlternate(inst);
- this._updateDatepicker(inst);
- }
- },
- // change method deprecated
- _changeDatepicker: function(target, name, value) {
- this._optionDatepicker(target, name, value);
- },
- /* Redraw the date picker attached to an input field or division.
- @param target element - the target input field or division or span */
- _refreshDatepicker: function(target) {
- var inst = this._getInst(target);
- if (inst) {
- this._updateDatepicker(inst);
- }
- },
- /* Set the dates for a jQuery selection.
- @param target element - the target input field or division or span
- @param date Date - the new date */
- _setDateDatepicker: function(target, date) {
- var inst = this._getInst(target);
- if (inst) {
- this._setDate(inst, date);
- this._updateDatepicker(inst);
- this._updateAlternate(inst);
- }
- },
- /* Get the date(s) for the first entry in a jQuery selection.
- @param target element - the target input field or division or span
- @param noDefault boolean - true if no default date is to be used
- @return Date - the current date */
- _getDateDatepicker: function(target, noDefault) {
- var inst = this._getInst(target);
- if (inst && !inst.inline)
- this._setDateFromField(inst, noDefault);
- return (inst ? this._getDate(inst) : null);
- },
- /* Handle keystrokes. */
- _doKeyDown: function(event) {
- var inst = $.datepicker._getInst(event.target);
- var handled = true;
- var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
- inst._keyEvent = true;
- if ($.datepicker._datepickerShowing)
- switch (event.keyCode) {
- case 9: $.datepicker._hideDatepicker();
- handled = false;
- break; // hide on tab out
- case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' +
- $.datepicker._currentClass + ')', inst.dpDiv);
- if (sel[0])
- $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
- var onSelect = $.datepicker._get(inst, 'onSelect');
- if (onSelect) {
- var dateStr = $.datepicker._formatDate(inst);
- // trigger custom callback
- onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
- }
- else
- $.datepicker._hideDatepicker();
- return false; // don't submit the form
- break; // select the value on enter
- case 27: $.datepicker._hideDatepicker();
- break; // hide on escape
- case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
- -$.datepicker._get(inst, 'stepBigMonths') :
- -$.datepicker._get(inst, 'stepMonths')), 'M');
- break; // previous month/year on page up/+ ctrl
- case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
- +$.datepicker._get(inst, 'stepBigMonths') :
- +$.datepicker._get(inst, 'stepMonths')), 'M');
- break; // next month/year on page down/+ ctrl
- case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
- handled = event.ctrlKey || event.metaKey;
- break; // clear on ctrl or command +end
- case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
- handled = event.ctrlKey || event.metaKey;
- break; // current on ctrl or command +home
- case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
- handled = event.ctrlKey || event.metaKey;
- // -1 day on ctrl or command +left
- if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
- -$.datepicker._get(inst, 'stepBigMonths') :
- -$.datepicker._get(inst, 'stepMonths')), 'M');
- // next month/year on alt +left on Mac
- break;
- case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
- handled = event.ctrlKey || event.metaKey;
- break; // -1 week on ctrl or command +up
- case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
- handled = event.ctrlKey || event.metaKey;
- // +1 day on ctrl or command +right
- if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
- +$.datepicker._get(inst, 'stepBigMonths') :
- +$.datepicker._get(inst, 'stepMonths')), 'M');
- // next month/year on alt +right
- break;
- case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
- handled = event.ctrlKey || event.metaKey;
- break; // +1 week on ctrl or command +down
- default: handled = false;
- }
- else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
- $.datepicker._showDatepicker(this);
- else {
- handled = false;
- }
- if (handled) {
- event.preventDefault();
- event.stopPropagation();
- }
- },
- /* Filter entered characters - based on date format. */
- _doKeyPress: function(event) {
- var inst = $.datepicker._getInst(event.target);
- if ($.datepicker._get(inst, 'constrainInput')) {
- var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
- var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
- return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
- }
- },
- /* Synchronise manual entry and field/alternate field. */
- _doKeyUp: function(event) {
- var inst = $.datepicker._getInst(event.target);
- if (inst.input.val() != inst.lastVal) {
- try {
- var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
- (inst.input ? inst.input.val() : null),
- $.datepicker._getFormatConfig(inst));
- if (date) { // only if valid
- $.datepicker._setDateFromField(inst);
- $.datepicker._updateAlternate(inst);
- $.datepicker._updateDatepicker(inst);
- }
- }
- catch (err) {
- $.datepicker.log(err);
- }
- }
- return true;
- },
- /* Pop-up the date picker for a given input field.
- If false returned from beforeShow event handler do not show.
- @param input element - the input field attached to the date picker or
- event - if triggered by focus */
- _showDatepicker: function(input) {
- input = input.target || input;
- if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
- input = $('input', input.parentNode)[0];
- if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
- return;
- var inst = $.datepicker._getInst(input);
- if ($.datepicker._curInst && $.datepicker._curInst != inst) {
- $.datepicker._curInst.dpDiv.stop(true, true);
- if ( inst && $.datepicker._datepickerShowing ) {
- $.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
- }
- }
- var beforeShow = $.datepicker._get(inst, 'beforeShow');
- var beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
- if(beforeShowSettings === false){
- //false
- return;
- }
- extendRemove(inst.settings, beforeShowSettings);
- inst.lastVal = null;
- $.datepicker._lastInput = input;
- $.datepicker._setDateFromField(inst);
- if ($.datepicker._inDialog) // hide cursor
- input.value = '';
- if (!$.datepicker._pos) { // position below input
- $.datepicker._pos = $.datepicker._findPos(input);
- $.datepicker._pos[1] += input.offsetHeight; // add the height
- }
- var isFixed = false;
- $(input).parents().each(function() {
- isFixed |= $(this).css('position') == 'fixed';
- return !isFixed;
- });
- var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
- $.datepicker._pos = null;
- //to avoid flashes on Firefox
- inst.dpDiv.empty();
- // determine sizing offscreen
- inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
- $.datepicker._updateDatepicker(inst);
- // fix width for dynamic number of date pickers
- // and adjust position before showing
- offset = $.datepicker._checkOffset(inst, offset, isFixed);
- inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
- 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
- left: offset.left + 'px', top: offset.top + 'px'});
- if (!inst.inline) {
- var showAnim = $.datepicker._get(inst, 'showAnim');
- var duration = $.datepicker._get(inst, 'duration');
- var postProcess = function() {
- var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
- if( !! cover.length ){
- var borders = $.datepicker._getBorders(inst.dpDiv);
- cover.css({left: -borders[0], top: -borders[1],
- width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
- }
- };
- inst.dpDiv.zIndex($(input).zIndex()+1);
- $.datepicker._datepickerShowing = true;
- // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
- if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) )
- inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
- else
- inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
- if (!showAnim || !duration)
- postProcess();
- if (inst.input.is(':visible') && !inst.input.is(':disabled'))
- inst.input.focus();
- $.datepicker._curInst = inst;
- }
- },
- /* Generate the date picker content. */
- _updateDatepicker: function(inst) {
- this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
- var borders = $.datepicker._getBorders(inst.dpDiv);
- instActive = inst; // for delegate hover events
- inst.dpDiv.empty().append(this._generateHTML(inst));
- this._attachHandlers(inst);
- var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
- if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6
- cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
- }
- inst.dpDiv.find('.' + this._dayOverClass + ' a').mouseover();
- var numMonths = this._getNumberOfMonths(inst);
- var cols = numMonths[1];
- var width = 17;
- inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
- if (cols > 1)
- inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
- inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
- 'Class']('ui-datepicker-multi');
- inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
- 'Class']('ui-datepicker-rtl');
- if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
- // #6694 - don't focus the input if it's already focused
- // this breaks the change event in IE
- inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
- inst.input.focus();
- // deffered render of the years select (to avoid flashes on Firefox)
- if( inst.yearshtml ){
- var origyearshtml = inst.yearshtml;
- setTimeout(function(){
- //assure that inst.yearshtml didn't change.
- if( origyearshtml === inst.yearshtml && inst.yearshtml ){
- inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml);
- }
- origyearshtml = inst.yearshtml = null;
- }, 0);
- }
- },
- /* Retrieve the size of left and top borders for an element.
- @param elem (jQuery object) the element of interest
- @return (number[2]) the left and top borders */
- _getBorders: function(elem) {
- var convert = function(value) {
- return {thin: 1, medium: 2, thick: 3}[value] || value;
- };
- return [parseFloat(convert(elem.css('border-left-width'))),
- parseFloat(convert(elem.css('border-top-width')))];
- },
- /* Check positioning to remain on screen. */
- _checkOffset: function(inst, offset, isFixed) {
- var dpWidth = inst.dpDiv.outerWidth();
- var dpHeight = inst.dpDiv.outerHeight();
- var inputWidth = inst.input ? inst.input.outerWidth() : 0;
- var inputHeight = inst.input ? inst.input.outerHeight() : 0;
- var viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft());
- var viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
- offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
- offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
- offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
- // now check if datepicker is showing outside window viewport - move to a better place if so.
- offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
- Math.abs(offset.left + dpWidth - viewWidth) : 0);
- offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
- Math.abs(dpHeight + inputHeight) : 0);
- return offset;
- },
- /* Find an object's position on the screen. */
- _findPos: function(obj) {
- var inst = this._getInst(obj);
- var isRTL = this._get(inst, 'isRTL');
- while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
- obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
- }
- var position = $(obj).offset();
- return [position.left, position.top];
- },
- /* Hide the date picker from view.
- @param input element - the input field attached to the date picker */
- _hideDatepicker: function(input) {
- var inst = this._curInst;
- if (!inst || (input && inst != $.data(input, PROP_NAME)))
- return;
- if (this._datepickerShowing) {
- var showAnim = this._get(inst, 'showAnim');
- var duration = this._get(inst, 'duration');
- var postProcess = function() {
- $.datepicker._tidyDialog(inst);
- };
- // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
- if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) )
- inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
- else
- inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
- (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
- if (!showAnim)
- postProcess();
- this._datepickerShowing = false;
- var onClose = this._get(inst, 'onClose');
- if (onClose)
- onClose.apply((inst.input ? inst.input[0] : null),
- [(inst.input ? inst.input.val() : ''), inst]);
- this._lastInput = null;
- if (this._inDialog) {
- this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
- if ($.blockUI) {
- $.unblockUI();
- $('body').append(this.dpDiv);
- }
- }
- this._inDialog = false;
- }
- },
- /* Tidy up after a dialog display. */
- _tidyDialog: function(inst) {
- inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
- },
- /* Close date picker if clicked elsewhere. */
- _checkExternalClick: function(event) {
- if (!$.datepicker._curInst)
- return;
- var $target = $(event.target),
- inst = $.datepicker._getInst($target[0]);
- if ( ( ( $target[0].id != $.datepicker._mainDivId &&
- $target.parents('#' + $.datepicker._mainDivId).length == 0 &&
- !$target.hasClass($.datepicker.markerClassName) &&
- !$target.closest("." + $.datepicker._triggerClass).length &&
- $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
- ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst != inst ) )
- $.datepicker._hideDatepicker();
- },
- /* Adjust one of the date sub-fields. */
- _adjustDate: function(id, offset, period) {
- var target = $(id);
- var inst = this._getInst(target[0]);
- if (this._isDisabledDatepicker(target[0])) {
- return;
- }
- this._adjustInstDate(inst, offset +
- (period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
- period);
- this._updateDatepicker(inst);
- },
- /* Action for current link. */
- _gotoToday: function(id) {
- var target = $(id);
- var inst = this._getInst(target[0]);
- if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
- inst.selectedDay = inst.currentDay;
- inst.drawMonth = inst.selectedMonth = inst.currentMonth;
- inst.drawYear = inst.selectedYear = inst.currentYear;
- }
- else {
- var date = new Date();
- inst.selectedDay = date.getDate();
- inst.drawMonth = inst.selectedMonth = date.getMonth();
- inst.drawYear = inst.selectedYear = date.getFullYear();
- }
- this._notifyChange(inst);
- this._adjustDate(target);
- },
- /* Action for selecting a new month/year. */
- _selectMonthYear: function(id, select, period) {
- var target = $(id);
- var inst = this._getInst(target[0]);
- inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
- inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
- parseInt(select.options[select.selectedIndex].value,10);
- this._notifyChange(inst);
- this._adjustDate(target);
- },
- /* Action for selecting a day. */
- _selectDay: function(id, month, year, td) {
- var target = $(id);
- if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
- return;
- }
- var inst = this._getInst(target[0]);
- inst.selectedDay = inst.currentDay = $('a', td).html();
- inst.selectedMonth = inst.currentMonth = month;
- inst.selectedYear = inst.currentYear = year;
- this._selectDate(id, this._formatDate(inst,
- inst.currentDay, inst.currentMonth, inst.currentYear));
- },
- /* Erase the input field and hide the date picker. */
- _clearDate: function(id) {
- var target = $(id);
- var inst = this._getInst(target[0]);
- this._selectDate(target, '');
- },
- /* Update the input field with the selected date. */
- _selectDate: function(id, dateStr) {
- var target = $(id);
- var inst = this._getInst(target[0]);
- dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
- if (inst.input)
- inst.input.val(dateStr);
- this._updateAlternate(inst);
- var onSelect = this._get(inst, 'onSelect');
- if (onSelect)
- onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback
- else if (inst.input)
- inst.input.trigger('change'); // fire the change event
- if (inst.inline)
- this._updateDatepicker(inst);
- else {
- this._hideDatepicker();
- this._lastInput = inst.input[0];
- if (typeof(inst.input[0]) != 'object')
- inst.input.focus(); // restore focus
- this._lastInput = null;
- }
- },
- /* Update any alternate field to synchronise with the main field. */
- _updateAlternate: function(inst) {
- var altField = this._get(inst, 'altField');
- if (altField) { // update alternate field too
- var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
- var date = this._getDate(inst);
- var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
- $(altField).each(function() { $(this).val(dateStr); });
- }
- },
- /* Set as beforeShowDay function to prevent selection of weekends.
- @param date Date - the date to customise
- @return [boolean, string] - is this date selectable?, what is its CSS class? */
- noWeekends: function(date) {
- var day = date.getDay();
- return [(day > 0 && day < 6), ''];
- },
- /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
- @param date Date - the date to get the week for
- @return number - the number of the week within the year that contains this date */
- iso8601Week: function(date) {
- var checkDate = new Date(date.getTime());
- // Find Thursday of this week starting on Monday
- checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
- var time = checkDate.getTime();
- checkDate.setMonth(0); // Compare with Jan 1
- checkDate.setDate(1);
- return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
- },
- /* Parse a string value into a date object.
- See formatDate below for the possible formats.
- @param format string - the expected format of the date
- @param value string - the date in the above format
- @param settings Object - attributes include:
- shortYearCutoff number - the cutoff year for determining the century (optional)
- dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
- dayNames string[7] - names of the days from Sunday (optional)
- monthNamesShort string[12] - abbreviated names of the months (optional)
- monthNames string[12] - names of the months (optional)
- @return Date - the extracted date value or null if value is blank */
- parseDate: function (format, value, settings) {
- if (format == null || value == null)
- throw 'Invalid arguments';
- value = (typeof value == 'object' ? value.toString() : value + '');
- if (value == '')
- return null;
- var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
- shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
- new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
- var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
- var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
- var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
- var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
- var year = -1;
- var month = -1;
- var day = -1;
- var doy = -1;
- var literal = false;
- // Check whether a format character is doubled
- var lookAhead = function(match) {
- var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
- if (matches)
- iFormat++;
- return matches;
- };
- // Extract a number from the string value
- var getNumber = function(match) {
- var isDoubled = lookAhead(match);
- var size = (match == '@' ? 14 : (match == '!' ? 20 :
- (match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2))));
- var digits = new RegExp('^\\d{1,' + size + '}');
- var num = value.substring(iValue).match(digits);
- if (!num)
- throw 'Missing number at position ' + iValue;
- iValue += num[0].length;
- return parseInt(num[0], 10);
- };
- // Extract a name from the string value and convert to an index
- var getName = function(match, shortNames, longNames) {
- var names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
- return [ [k, v] ];
- }).sort(function (a, b) {
- return -(a[1].length - b[1].length);
- });
- var index = -1;
- $.each(names, function (i, pair) {
- var name = pair[1];
- if (value.substr(iValue, name.length).toLowerCase() == name.toLowerCase()) {
- index = pair[0];
- iValue += name.length;
- return false;
- }
- });
- if (index != -1)
- return index + 1;
- else
- throw 'Unknown name at position ' + iValue;
- };
- // Confirm that a literal character matches the string value
- var checkLiteral = function() {
- if (value.charAt(iValue) != format.charAt(iFormat))
- throw 'Unexpected literal at position ' + iValue;
- iValue++;
- };
- var iValue = 0;
- for (var iFormat = 0; iFormat < format.length; iFormat++) {
- if (literal)
- if (format.charAt(iFormat) == "'" && !lookAhead("'"))
- literal = false;
- else
- checkLiteral();
- else
- switch (format.charAt(iFormat)) {
- case 'd':
- day = getNumber('d');
- break;
- case 'D':
- getName('D', dayNamesShort, dayNames);
- break;
- case 'o':
- doy = getNumber('o');
- break;
- case 'm':
- month = getNumber('m');
- break;
- case 'M':
- month = getName('M', monthNamesShort, monthNames);
- break;
- case 'y':
- year = getNumber('y');
- break;
- case '@':
- var date = new Date(getNumber('@'));
- year = date.getFullYear();
- month = date.getMonth() + 1;
- day = date.getDate();
- break;
- case '!':
- var date = new Date((getNumber('!') - this._ticksTo1970) / 10000);
- year = date.getFullYear();
- month = date.getMonth() + 1;
- day = date.getDate();
- break;
- case "'":
- if (lookAhead("'"))
- checkLiteral();
- else
- literal = true;
- break;
- default:
- checkLiteral();
- }
- }
- if (iValue < value.length){
- var extra = value.substr(iValue);
- if (!/^\s+/.test(extra)) {
- throw "Extra/unparsed characters found in date: " + extra;
- }
- }
- if (year == -1)
- year = new Date().getFullYear();
- else if (year < 100)
- year += new Date().getFullYear() - new Date().getFullYear() % 100 +
- (year <= shortYearCutoff ? 0 : -100);
- if (doy > -1) {
- month = 1;
- day = doy;
- do {
- var dim = this._getDaysInMonth(year, month - 1);
- if (day <= dim)
- break;
- month++;
- day -= dim;
- } while (true);
- }
- var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
- if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
- throw 'Invalid date'; // E.g. 31/02/00
- return date;
- },
- /* Standard date formats. */
- ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
- COOKIE: 'D, dd M yy',
- ISO_8601: 'yy-mm-dd',
- RFC_822: 'D, d M y',
- RFC_850: 'DD, dd-M-y',
- RFC_1036: 'D, d M y',
- RFC_1123: 'D, d M yy',
- RFC_2822: 'D, d M yy',
- RSS: 'D, d M y', // RFC 822
- TICKS: '!',
- TIMESTAMP: '@',
- W3C: 'yy-mm-dd', // ISO 8601
- _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
- Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
- /* Format a date object into a string value.
- The format can be combinations of the following:
- d - day of month (no leading zero)
- dd - day of month (two digit)
- o - day of year (no leading zeros)
- oo - day of year (three digit)
- D - day name short
- DD - day name long
- m - month of year (no leading zero)
- mm - month of year (two digit)
- M - month name short
- MM - month name long
- y - year (two digit)
- yy - year (four digit)
- @ - Unix timestamp (ms since 01/01/1970)
- ! - Windows ticks (100ns since 01/01/0001)
- '...' - literal text
- '' - single quote
- @param format string - the desired format of the date
- @param date Date - the date value to format
- @param settings Object - attributes include:
- dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
- dayNames string[7] - names of the days from Sunday (optional)
- monthNamesShort string[12] - abbreviated names of the months (optional)
- monthNames string[12] - names of the months (optional)
- @return string - the date in the above format */
- formatDate: function (format, date, settings) {
- if (!date)
- return '';
- var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
- var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
- var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
- var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
- // Check whether a format character is doubled
- var lookAhead = function(match) {
- var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
- if (matches)
- iFormat++;
- return matches;
- };
- // Format a number, with leading zero if necessary
- var formatNumber = function(match, value, len) {
- var num = '' + value;
- if (lookAhead(match))
- while (num.length < len)
- num = '0' + num;
- return num;
- };
- // Format a name, short or long as requested
- var formatName = function(match, value, shortNames, longNames) {
- return (lookAhead(match) ? longNames[value] : shortNames[value]);
- };
- var output = '';
- var literal = false;
- if (date)
- for (var iFormat = 0; iFormat < format.length; iFormat++) {
- if (literal)
- if (format.charAt(iFormat) == "'" && !lookAhead("'"))
- literal = false;
- else
- output += format.charAt(iFormat);
- else
- switch (format.charAt(iFormat)) {
- case 'd':
- output += formatNumber('d', date.getDate(), 2);
- break;
- case 'D':
- output += formatName('D', date.getDay(), dayNamesShort, dayNames);
- break;
- case 'o':
- output += formatNumber('o',
- Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
- break;
- case 'm':
- output += formatNumber('m', date.getMonth() + 1, 2);
- break;
- case 'M':
- output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
- break;
- case 'y':
- output += (lookAhead('y') ? date.getFullYear() :
- (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
- break;
- case '@':
- output += date.getTime();
- break;
- case '!':
- output += date.getTime() * 10000 + this._ticksTo1970;
- break;
- case "'":
- if (lookAhead("'"))
- output += "'";
- else
- literal = true;
- break;
- default:
- output += format.charAt(iFormat);
- }
- }
- return output;
- },
- /* Extract all possible characters from the date format. */
- _possibleChars: function (format) {
- var chars = '';
- var literal = false;
- // Check whether a format character is doubled
- var lookAhead = function(match) {
- var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
- if (matches)
- iFormat++;
- return matches;
- };
- for (var iFormat = 0; iFormat < format.length; iFormat++)
- if (literal)
- if (format.charAt(iFormat) == "'" && !lookAhead("'"))
- literal = false;
- else
- chars += format.charAt(iFormat);
- else
- switch (format.charAt(iFormat)) {
- case 'd': case 'm': case 'y': case '@':
- chars += '0123456789';
- break;
- case 'D': case 'M':
- return null; // Accept anything
- case "'":
- if (lookAhead("'"))
- chars += "'";
- else
- literal = true;
- break;
- default:
- chars += format.charAt(iFormat);
- }
- return chars;
- },
- /* Get a setting value, defaulting if necessary. */
- _get: function(inst, name) {
- return inst.settings[name] !== undefined ?
- inst.settings[name] : this._defaults[name];
- },
- /* Parse existing date and initialise date picker. */
- _setDateFromField: function(inst, noDefault) {
- if (inst.input.val() == inst.lastVal) {
- return;
- }
- var dateFormat = this._get(inst, 'dateFormat');
- var dates = inst.lastVal = inst.input ? inst.input.val() : null;
- var date, defaultDate;
- date = defaultDate = this._getDefaultDate(inst);
- var settings = this._getFormatConfig(inst);
- try {
- date = this.parseDate(dateFormat, dates, settings) || defaultDate;
- } catch (event) {
- this.log(event);
- dates = (noDefault ? '' : dates);
- }
- inst.selectedDay = date.getDate();
- inst.drawMonth = inst.selectedMonth = date.getMonth();
- inst.drawYear = inst.selectedYear = date.getFullYear();
- inst.currentDay = (dates ? date.getDate() : 0);
- inst.currentMonth = (dates ? date.getMonth() : 0);
- inst.currentYear = (dates ? date.getFullYear() : 0);
- this._adjustInstDate(inst);
- },
- /* Retrieve the default date shown on opening. */
- _getDefaultDate: function(inst) {
- return this._restrictMinMax(inst,
- this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
- },
- /* A date may be specified as an exact value or a relative one. */
- _determineDate: function(inst, date, defaultDate) {
- var offsetNumeric = function(offset) {
- var date = new Date();
- date.setDate(date.getDate() + offset);
- return date;
- };
- var offsetString = function(offset) {
- try {
- return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
- offset, $.datepicker._getFormatConfig(inst));
- }
- catch (e) {
- // Ignore
- }
- var date = (offset.toLowerCase().match(/^c/) ?
- $.datepicker._getDate(inst) : null) || new Date();
- var year = date.getFullYear();
- var month = date.getMonth();
- var day = date.getDate();
- var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
- var matches = pattern.exec(offset);
- while (matches) {
- switch (matches[2] || 'd') {
- case 'd' : case 'D' :
- day += parseInt(matches[1],10); break;
- case 'w' : case 'W' :
- day += parseInt(matches[1],10) * 7; break;
- case 'm' : case 'M' :
- month += parseInt(matches[1],10);
- day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
- break;
- case 'y': case 'Y' :
- year += parseInt(matches[1],10);
- day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
- break;
- }
- matches = pattern.exec(offset);
- }
- return new Date(year, month, day);
- };
- var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) :
- (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
- newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate);
- if (newDate) {
- newDate.setHours(0);
- newDate.setMinutes(0);
- newDate.setSeconds(0);
- newDate.setMilliseconds(0);
- }
- return this._daylightSavingAdjust(newDate);
- },
- /* Handle switch to/from daylight saving.
- Hours may be non-zero on daylight saving cut-over:
- > 12 when midnight changeover, but then cannot generate
- midnight datetime, so jump to 1AM, otherwise reset.
- @param date (Date) the date to check
- @return (Date) the corrected date */
- _daylightSavingAdjust: function(date) {
- if (!date) return null;
- date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
- return date;
- },
- /* Set the date(s) directly. */
- _setDate: function(inst, date, noChange) {
- var clear = !date;
- var origMonth = inst.selectedMonth;
- var origYear = inst.selectedYear;
- var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
- inst.selectedDay = inst.currentDay = newDate.getDate();
- inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
- inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
- if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
- this._notifyChange(inst);
- this._adjustInstDate(inst);
- if (inst.input) {
- inst.input.val(clear ? '' : this._formatDate(inst));
- }
- },
- /* Retrieve the date(s) directly. */
- _getDate: function(inst) {
- var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
- this._daylightSavingAdjust(new Date(
- inst.currentYear, inst.currentMonth, inst.currentDay)));
- return startDate;
- },
- /* Attach the onxxx handlers. These are declared statically so
- * they work with static code transformers like Caja.
- */
- _attachHandlers: function(inst) {
- var stepMonths = this._get(inst, 'stepMonths');
- var id = '#' + inst.id.replace( /\\\\/g, "\\" );
- inst.dpDiv.find('[data-handler]').map(function () {
- var handler = {
- prev: function () {
- window['DP_jQuery_' + dpuuid].datepicker._adjustDate(id, -stepMonths, 'M');
- },
- next: function () {
- window['DP_jQuery_' + dpuuid].datepicker._adjustDate(id, +stepMonths, 'M');
- },
- hide: function () {
- window['DP_jQuery_' + dpuuid].datepicker._hideDatepicker();
- },
- today: function () {
- window['DP_jQuery_' + dpuuid].datepicker._gotoToday(id);
- },
- selectDay: function () {
- window['DP_jQuery_' + dpuuid].datepicker._selectDay(id, +this.getAttribute('data-month'), +this.getAttribute('data-year'), this);
- return false;
- },
- selectMonth: function () {
- window['DP_jQuery_' + dpuuid].datepicker._selectMonthYear(id, this, 'M');
- return false;
- },
- selectYear: function () {
- window['DP_jQuery_' + dpuuid].datepicker._selectMonthYear(id, this, 'Y');
- return false;
- }
- };
- $(this).bind(this.getAttribute('data-event'), handler[this.getAttribute('data-handler')]);
- });
- },
- /* Generate the HTML for the current state of the date picker. */
- _generateHTML: function(inst) {
- var today = new Date();
- today = this._daylightSavingAdjust(
- new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
- var isRTL = this._get(inst, 'isRTL');
- var showButtonPanel = this._get(inst, 'showButtonPanel');
- var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
- var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
- var numMonths = this._getNumberOfMonths(inst);
- var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
- var stepMonths = this._get(inst, 'stepMonths');
- var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
- var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
- new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
- var minDate = this._getMinMaxDate(inst, 'min');
- var maxDate = this._getMinMaxDate(inst, 'max');
- var drawMonth = inst.drawMonth - showCurrentAtPos;
- var drawYear = inst.drawYear;
- if (drawMonth < 0) {
- drawMonth += 12;
- drawYear--;
- }
- if (maxDate) {
- var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
- maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
- maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
- while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
- drawMonth--;
- if (drawMonth < 0) {
- drawMonth = 11;
- drawYear--;
- }
- }
- }
- inst.drawMonth = drawMonth;
- inst.drawYear = drawYear;
- var prevText = this._get(inst, 'prevText');
- prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
- this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
- this._getFormatConfig(inst)));
- var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
- '<a class="ui-datepicker-prev ui-corner-all" data-handler="prev" data-event="click"' +
- ' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
- (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
- var nextText = this._get(inst, 'nextText');
- nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
- this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
- this._getFormatConfig(inst)));
- var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
- '<a class="ui-datepicker-next ui-corner-all" data-handler="next" data-event="click"' +
- ' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
- (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
- var currentText = this._get(inst, 'currentText');
- var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
- currentText = (!navigationAsDateFormat ? currentText :
- this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
- var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" data-handler="hide" data-event="click">' +
- this._get(inst, 'closeText') + '</button>' : '');
- var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
- (this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" data-handler="today" data-event="click"' +
- '>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
- var firstDay = parseInt(this._get(inst, 'firstDay'),10);
- firstDay = (isNaN(firstDay) ? 0 : firstDay);
- var showWeek = this._get(inst, 'showWeek');
- var dayNames = this._get(inst, 'dayNames');
- var dayNamesShort = this._get(inst, 'dayNamesShort');
- var dayNamesMin = this._get(inst, 'dayNamesMin');
- var monthNames = this._get(inst, 'monthNames');
- var monthNamesShort = this._get(inst, 'monthNamesShort');
- var beforeShowDay = this._get(inst, 'beforeShowDay');
- var showOtherMonths = this._get(inst, 'showOtherMonths');
- var selectOtherMonths = this._get(inst, 'selectOtherMonths');
- var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
- var defaultDate = this._getDefaultDate(inst);
- var html = '';
- for (var row = 0; row < numMonths[0]; row++) {
- var group = '';
- this.maxRows = 4;
- for (var col = 0; col < numMonths[1]; col++) {
- var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
- var cornerClass = ' ui-corner-all';
- var calender = '';
- if (isMultiMonth) {
- calender += '<div class="ui-datepicker-group';
- if (numMonths[1] > 1)
- switch (col) {
- case 0: calender += ' ui-datepicker-group-first';
- cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
- case numMonths[1]-1: calender += ' ui-datepicker-group-last';
- cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
- default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break;
- }
- calender += '">';
- }
- calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
- (/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
- (/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
- this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
- row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
- '</div><table class="ui-datepicker-calendar"><thead>' +
- '<tr>';
- var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : '');
- for (var dow = 0; dow < 7; dow++) { // days of the week
- var day = (dow + firstDay) % 7;
- thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
- '<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
- }
- calender += thead + '</tr></thead><tbody>';
- var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
- if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
- inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
- var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
- var curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
- var numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
- this.maxRows = numRows;
- var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
- for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
- calender += '<tr>';
- var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' +
- this._get(inst, 'calculateWeek')(printDate) + '</td>');
- for (var dow = 0; dow < 7; dow++) { // create date picker days
- var daySettings = (beforeShowDay ?
- beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
- var otherMonth = (printDate.getMonth() != drawMonth);
- var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
- (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
- tbody += '<td class="' +
- ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
- (otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
- ((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
- (defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
- // or defaultDate is current printedDate and defaultDate is selectedDate
- ' ' + this._dayOverClass : '') + // highlight selected day
- (unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') + // highlight unselectable days
- (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
- (printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
- (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
- ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
- (unselectable ? '' : ' data-handler="selectDay" data-event="click" data-month="' + printDate.getMonth() + '" data-year="' + printDate.getFullYear() + '"') + '>' + // actions
- (otherMonth && !showOtherMonths ? ' ' : // display for other months
- (unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
- (printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
- (printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day
- (otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months
- '" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date
- printDate.setDate(printDate.getDate() + 1);
- printDate = this._daylightSavingAdjust(printDate);
- }
- calender += tbody + '</tr>';
- }
- drawMonth++;
- if (drawMonth > 11) {
- drawMonth = 0;
- drawYear++;
- }
- calender += '</tbody></table>' + (isMultiMonth ? '</div>' +
- ((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
- group += calender;
- }
- html += group;
- }
- html += buttonPanel + ($.ui.ie6 && !inst.inline ?
- '<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
- inst._keyEvent = false;
- return html;
- },
- /* Generate the month and year header. */
- _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
- secondary, monthNames, monthNamesShort) {
- var changeMonth = this._get(inst, 'changeMonth');
- var changeYear = this._get(inst, 'changeYear');
- var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
- var html = '<div class="ui-datepicker-title">';
- var monthHtml = '';
- // month selection
- if (secondary || !changeMonth)
- monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>';
- else {
- var inMinYear = (minDate && minDate.getFullYear() == drawYear);
- var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
- monthHtml += '<select class="ui-datepicker-month" data-handler="selectMonth" data-event="change">';
- for (var month = 0; month < 12; month++) {
- if ((!inMinYear || month >= minDate.getMonth()) &&
- (!inMaxYear || month <= maxDate.getMonth()))
- monthHtml += '<option value="' + month + '"' +
- (month == drawMonth ? ' selected="selected"' : '') +
- '>' + monthNamesShort[month] + '</option>';
- }
- monthHtml += '</select>';
- }
- if (!showMonthAfterYear)
- html += monthHtml + (secondary || !(changeMonth && changeYear) ? ' ' : '');
- // year selection
- if ( !inst.yearshtml ) {
- inst.yearshtml = '';
- if (secondary || !changeYear)
- html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
- else {
- // determine range of years to display
- var years = this._get(inst, 'yearRange').split(':');
- var thisYear = new Date().getFullYear();
- var determineYear = function(value) {
- var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
- (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
- parseInt(value, 10)));
- return (isNaN(year) ? thisYear : year);
- };
- var year = determineYear(years[0]);
- var endYear = Math.max(year, determineYear(years[1] || ''));
- year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
- endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
- inst.yearshtml += '<select class="ui-datepicker-year" data-handler="selectYear" data-event="change">';
- for (; year <= endYear; year++) {
- inst.yearshtml += '<option value="' + year + '"' +
- (year == drawYear ? ' selected="selected"' : '') +
- '>' + year + '</option>';
- }
- inst.yearshtml += '</select>';
- html += inst.yearshtml;
- inst.yearshtml = null;
- }
- }
- html += this._get(inst, 'yearSuffix');
- if (showMonthAfterYear)
- html += (secondary || !(changeMonth && changeYear) ? ' ' : '') + monthHtml;
- html += '</div>'; // Close datepicker_header
- return html;
- },
- /* Adjust one of the date sub-fields. */
- _adjustInstDate: function(inst, offset, period) {
- var year = inst.drawYear + (period == 'Y' ? offset : 0);
- var month = inst.drawMonth + (period == 'M' ? offset : 0);
- var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
- (period == 'D' ? offset : 0);
- var date = this._restrictMinMax(inst,
- this._daylightSavingAdjust(new Date(year, month, day)));
- inst.selectedDay = date.getDate();
- inst.drawMonth = inst.selectedMonth = date.getMonth();
- inst.drawYear = inst.selectedYear = date.getFullYear();
- if (period == 'M' || period == 'Y')
- this._notifyChange(inst);
- },
- /* Ensure a date is within any min/max bounds. */
- _restrictMinMax: function(inst, date) {
- var minDate = this._getMinMaxDate(inst, 'min');
- var maxDate = this._getMinMaxDate(inst, 'max');
- var newDate = (minDate && date < minDate ? minDate : date);
- newDate = (maxDate && newDate > maxDate ? maxDate : newDate);
- return newDate;
- },
- /* Notify change of month/year. */
- _notifyChange: function(inst) {
- var onChange = this._get(inst, 'onChangeMonthYear');
- if (onChange)
- onChange.apply((inst.input ? inst.input[0] : null),
- [inst.selectedYear, inst.selectedMonth + 1, inst]);
- },
- /* Determine the number of months to show. */
- _getNumberOfMonths: function(inst) {
- var numMonths = this._get(inst, 'numberOfMonths');
- return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
- },
- /* Determine the current maximum date - ensure no time components are set. */
- _getMinMaxDate: function(inst, minMax) {
- return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
- },
- /* Find the number of days in a given month. */
- _getDaysInMonth: function(year, month) {
- return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
- },
- /* Find the day of the week of the first of a month. */
- _getFirstDayOfMonth: function(year, month) {
- return new Date(year, month, 1).getDay();
- },
- /* Determines if we should allow a "next/prev" month display change. */
- _canAdjustMonth: function(inst, offset, curYear, curMonth) {
- var numMonths = this._getNumberOfMonths(inst);
- var date = this._daylightSavingAdjust(new Date(curYear,
- curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
- if (offset < 0)
- date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
- return this._isInRange(inst, date);
- },
- /* Is the given date in the accepted range? */
- _isInRange: function(inst, date) {
- var minDate = this._getMinMaxDate(inst, 'min');
- var maxDate = this._getMinMaxDate(inst, 'max');
- return ((!minDate || date.getTime() >= minDate.getTime()) &&
- (!maxDate || date.getTime() <= maxDate.getTime()));
- },
- /* Provide the configuration settings for formatting/parsing. */
- _getFormatConfig: function(inst) {
- var shortYearCutoff = this._get(inst, 'shortYearCutoff');
- shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
- new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
- return {shortYearCutoff: shortYearCutoff,
- dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
- monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
- },
- /* Format the given date for display. */
- _formatDate: function(inst, day, month, year) {
- if (!day) {
- inst.currentDay = inst.selectedDay;
- inst.currentMonth = inst.selectedMonth;
- inst.currentYear = inst.selectedYear;
- }
- var date = (day ? (typeof day == 'object' ? day :
- this._daylightSavingAdjust(new Date(year, month, day))) :
- this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
- return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
- }
- });
- /*
- * Bind hover events for datepicker elements.
- * Done via delegate so the binding only occurs once in the lifetime of the parent div.
- * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
- */
- function bindHover(dpDiv) {
- var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a';
- return dpDiv.delegate(selector, 'mouseout', function() {
- $(this).removeClass('ui-state-hover');
- if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover');
- if (this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover');
- })
- .delegate(selector, 'mouseover', function(){
- if (!$.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0])) {
- $(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
- $(this).addClass('ui-state-hover');
- if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover');
- if (this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover');
- }
- });
- }
- /* jQuery extend now ignores nulls! */
- function extendRemove(target, props) {
- $.extend(target, props);
- for (var name in props)
- if (props[name] == null || props[name] == undefined)
- target[name] = props[name];
- return target;
- };
- /* Invoke the datepicker functionality.
- @param options string - a command, optionally followed by additional parameters or
- Object - settings for attaching new datepicker functionality
- @return jQuery object */
- $.fn.datepicker = function(options){
- /* Verify an empty collection wasn't passed - Fixes #6976 */
- if ( !this.length ) {
- return this;
- }
- /* Initialise the date picker. */
- if (!$.datepicker.initialized) {
- $(document).mousedown($.datepicker._checkExternalClick).
- find(document.body).append($.datepicker.dpDiv);
- $.datepicker.initialized = true;
- }
- var otherArgs = Array.prototype.slice.call(arguments, 1);
- if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget'))
- return $.datepicker['_' + options + 'Datepicker'].
- apply($.datepicker, [this[0]].concat(otherArgs));
- if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
- return $.datepicker['_' + options + 'Datepicker'].
- apply($.datepicker, [this[0]].concat(otherArgs));
- return this.each(function() {
- typeof options == 'string' ?
- $.datepicker['_' + options + 'Datepicker'].
- apply($.datepicker, [this].concat(otherArgs)) :
- $.datepicker._attachDatepicker(this, options);
- });
- };
- $.datepicker = new Datepicker(); // singleton instance
- $.datepicker.initialized = false;
- $.datepicker.uuid = new Date().getTime();
- $.datepicker.version = "1.9.2";
- // Workaround for #4055
- // Add another global to avoid noConflict issues with inline event handlers
- window['DP_jQuery_' + dpuuid] = $;
- })(jQuery);
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJqcXVlcnl1aS9qcXVlcnkudWkuZGF0ZXBpY2tlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGpRdWVyeSBVSSBEYXRlcGlja2VyIDEuOS4yXG4gKiBodHRwOi8vanF1ZXJ5dWkuY29tXG4gKlxuICogQ29weXJpZ2h0IDIwMTIgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZVxuICpcbiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2RhdGVwaWNrZXIvXG4gKlxuICogRGVwZW5kczpcbiAqXHRqcXVlcnkudWkuY29yZS5qc1xuICovXG4oZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHtcblxuJC5leHRlbmQoJC51aSwgeyBkYXRlcGlja2VyOiB7IHZlcnNpb246IFwiMS45LjJcIiB9IH0pO1xuXG52YXIgUFJPUF9OQU1FID0gJ2RhdGVwaWNrZXInO1xudmFyIGRwdXVpZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xudmFyIGluc3RBY3RpdmU7XG5cbi8qIERhdGUgcGlja2VyIG1hbmFnZXIuXG4gICBVc2UgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCAkLmRhdGVwaWNrZXIsIHRvIGludGVyYWN0IHdpdGggdGhlIGRhdGUgcGlja2VyLlxuICAgU2V0dGluZ3MgZm9yIChncm91cHMgb2YpIGRhdGUgcGlja2VycyBhcmUgbWFpbnRhaW5lZCBpbiBhbiBpbnN0YW5jZSBvYmplY3QsXG4gICBhbGxvd2luZyBtdWx0aXBsZSBkaWZmZXJlbnQgc2V0dGluZ3Mgb24gdGhlIHNhbWUgcGFnZS4gKi9cblxuZnVuY3Rpb24gRGF0ZXBpY2tlcigpIHtcblx0dGhpcy5kZWJ1ZyA9IGZhbHNlOyAvLyBDaGFuZ2UgdGhpcyB0byB0cnVlIHRvIHN0YXJ0IGRlYnVnZ2luZ1xuXHR0aGlzLl9jdXJJbnN0ID0gbnVsbDsgLy8gVGhlIGN1cnJlbnQgaW5zdGFuY2UgaW4gdXNlXG5cdHRoaXMuX2tleUV2ZW50ID0gZmFsc2U7IC8vIElmIHRoZSBsYXN0IGV2ZW50IHdhcyBhIGtleSBldmVudFxuXHR0aGlzLl9kaXNhYmxlZElucHV0cyA9IFtdOyAvLyBMaXN0IG9mIGRhdGUgcGlja2VyIGlucHV0cyB0aGF0IGhhdmUgYmVlbiBkaXNhYmxlZFxuXHR0aGlzLl9kYXRlcGlja2VyU2hvd2luZyA9IGZhbHNlOyAvLyBUcnVlIGlmIHRoZSBwb3B1cCBwaWNrZXIgaXMgc2hvd2luZyAsIGZhbHNlIGlmIG5vdFxuXHR0aGlzLl9pbkRpYWxvZyA9IGZhbHNlOyAvLyBUcnVlIGlmIHNob3dpbmcgd2l0aGluIGEgXCJkaWFsb2dcIiwgZmFsc2UgaWYgbm90XG5cdHRoaXMuX21haW5EaXZJZCA9ICd1aS1kYXRlcGlja2VyLWRpdic7IC8vIFRoZSBJRCBvZiB0aGUgbWFpbiBkYXRlcGlja2VyIGRpdmlzaW9uXG5cdHRoaXMuX2lubGluZUNsYXNzID0gJ3VpLWRhdGVwaWNrZXItaW5saW5lJzsgLy8gVGhlIG5hbWUgb2YgdGhlIGlubGluZSBtYXJrZXIgY2xhc3Ncblx0dGhpcy5fYXBwZW5kQ2xhc3MgPSAndWktZGF0ZXBpY2tlci1hcHBlbmQnOyAvLyBUaGUgbmFtZSBvZiB0aGUgYXBwZW5kIG1hcmtlciBjbGFzc1xuXHR0aGlzLl90cmlnZ2VyQ2xhc3MgPSAndWktZGF0ZXBpY2tlci10cmlnZ2VyJzsgLy8gVGhlIG5hbWUgb2YgdGhlIHRyaWdnZXIgbWFya2VyIGNsYXNzXG5cdHRoaXMuX2RpYWxvZ0NsYXNzID0gJ3VpLWRhdGVwaWNrZXItZGlhbG9nJzsgLy8gVGhlIG5hbWUgb2YgdGhlIGRpYWxvZyBtYXJrZXIgY2xhc3Ncblx0dGhpcy5fZGlzYWJsZUNsYXNzID0gJ3VpLWRhdGVwaWNrZXItZGlzYWJsZWQnOyAvLyBUaGUgbmFtZSBvZiB0aGUgZGlzYWJsZWQgY292ZXJpbmcgbWFya2VyIGNsYXNzXG5cdHRoaXMuX3Vuc2VsZWN0YWJsZUNsYXNzID0gJ3VpLWRhdGVwaWNrZXItdW5zZWxlY3RhYmxlJzsgLy8gVGhlIG5hbWUgb2YgdGhlIHVuc2VsZWN0YWJsZSBjZWxsIG1hcmtlciBjbGFzc1xuXHR0aGlzLl9jdXJyZW50Q2xhc3MgPSAndWktZGF0ZXBpY2tlci1jdXJyZW50LWRheSc7IC8vIFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGRheSBtYXJrZXIgY2xhc3Ncblx0dGhpcy5fZGF5T3ZlckNsYXNzID0gJ3VpLWRhdGVwaWNrZXItZGF5cy1jZWxsLW92ZXInOyAvLyBUaGUgbmFtZSBvZiB0aGUgZGF5IGhvdmVyIG1hcmtlciBjbGFzc1xuXHR0aGlzLnJlZ2lvbmFsID0gW107IC8vIEF2YWlsYWJsZSByZWdpb25hbCBzZXR0aW5ncywgaW5kZXhlZCBieSBsYW5ndWFnZSBjb2RlXG5cdHRoaXMucmVnaW9uYWxbJyddID0geyAvLyBEZWZhdWx0IHJlZ2lvbmFsIHNldHRpbmdzXG5cdFx0Y2xvc2VUZXh0OiAnRG9uZScsIC8vIERpc3BsYXkgdGV4dCBmb3IgY2xvc2UgbGlua1xuXHRcdHByZXZUZXh0OiAnUHJldicsIC8vIERpc3BsYXkgdGV4dCBmb3IgcHJldmlvdXMgbW9udGggbGlua1xuXHRcdG5leHRUZXh0OiAnTmV4dCcsIC8vIERpc3BsYXkgdGV4dCBmb3IgbmV4dCBtb250aCBsaW5rXG5cdFx0Y3VycmVudFRleHQ6ICdUb2RheScsIC8vIERpc3BsYXkgdGV4dCBmb3IgY3VycmVudCBtb250aCBsaW5rXG5cdFx0bW9udGhOYW1lczogWydKYW51YXJ5JywnRmVicnVhcnknLCdNYXJjaCcsJ0FwcmlsJywnTWF5JywnSnVuZScsXG5cdFx0XHQnSnVseScsJ0F1Z3VzdCcsJ1NlcHRlbWJlcicsJ09jdG9iZXInLCdOb3ZlbWJlcicsJ0RlY2VtYmVyJ10sIC8vIE5hbWVzIG9mIG1vbnRocyBmb3IgZHJvcC1kb3duIGFuZCBmb3JtYXR0aW5nXG5cdFx0bW9udGhOYW1lc1Nob3J0OiBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ10sIC8vIEZvciBmb3JtYXR0aW5nXG5cdFx0ZGF5TmFtZXM6IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXSwgLy8gRm9yIGZvcm1hdHRpbmdcblx0XHRkYXlOYW1lc1Nob3J0OiBbJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddLCAvLyBGb3IgZm9ybWF0dGluZ1xuXHRcdGRheU5hbWVzTWluOiBbJ1N1JywnTW8nLCdUdScsJ1dlJywnVGgnLCdGcicsJ1NhJ10sIC8vIENvbHVtbiBoZWFkaW5ncyBmb3IgZGF5cyBzdGFydGluZyBhdCBTdW5kYXlcblx0XHR3ZWVrSGVhZGVyOiAnV2snLCAvLyBDb2x1bW4gaGVhZGVyIGZvciB3ZWVrIG9mIHRoZSB5ZWFyXG5cdFx0ZGF0ZUZvcm1hdDogJ21tL2RkL3l5JywgLy8gU2VlIGZvcm1hdCBvcHRpb25zIG9uIHBhcnNlRGF0ZVxuXHRcdGZpcnN0RGF5OiAwLCAvLyBUaGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLCBTdW4gPSAwLCBNb24gPSAxLCAuLi5cblx0XHRpc1JUTDogZmFsc2UsIC8vIFRydWUgaWYgcmlnaHQtdG8tbGVmdCBsYW5ndWFnZSwgZmFsc2UgaWYgbGVmdC10by1yaWdodFxuXHRcdHNob3dNb250aEFmdGVyWWVhcjogZmFsc2UsIC8vIFRydWUgaWYgdGhlIHllYXIgc2VsZWN0IHByZWNlZGVzIG1vbnRoLCBmYWxzZSBmb3IgbW9udGggdGhlbiB5ZWFyXG5cdFx0eWVhclN1ZmZpeDogJycgLy8gQWRkaXRpb25hbCB0ZXh0IHRvIGFwcGVuZCB0byB0aGUgeWVhciBpbiB0aGUgbW9udGggaGVhZGVyc1xuXHR9O1xuXHR0aGlzLl9kZWZhdWx0cyA9IHsgLy8gR2xvYmFsIGRlZmF1bHRzIGZvciBhbGwgdGhlIGRhdGUgcGlja2VyIGluc3RhbmNlc1xuXHRcdHNob3dPbjogJ2ZvY3VzJywgLy8gJ2ZvY3VzJyBmb3IgcG9wdXAgb24gZm9jdXMsXG5cdFx0XHQvLyAnYnV0dG9uJyBmb3IgdHJpZ2dlciBidXR0b24sIG9yICdib3RoJyBmb3IgZWl0aGVyXG5cdFx0c2hvd0FuaW06ICdmYWRlSW4nLCAvLyBOYW1lIG9mIGpRdWVyeSBhbmltYXRpb24gZm9yIHBvcHVwXG5cdFx0c2hvd09wdGlvbnM6IHt9LCAvLyBPcHRpb25zIGZvciBlbmhhbmNlZCBhbmltYXRpb25zXG5cdFx0ZGVmYXVsdERhdGU6IG51bGwsIC8vIFVzZWQgd2hlbiBmaWVsZCBpcyBibGFuazogYWN0dWFsIGRhdGUsXG5cdFx0XHQvLyArLy1udW1iZXIgZm9yIG9mZnNldCBmcm9tIHRvZGF5LCBudWxsIGZvciB0b2RheVxuXHRcdGFwcGVuZFRleHQ6ICcnLCAvLyBEaXNwbGF5IHRleHQgZm9sbG93aW5nIHRoZSBpbnB1dCBib3gsIGUuZy4gc2hvd2luZyB0aGUgZm9ybWF0XG5cdFx0YnV0dG9uVGV4dDogJy4uLicsIC8vIFRleHQgZm9yIHRyaWdnZXIgYnV0dG9uXG5cdFx0YnV0dG9uSW1hZ2U6ICcnLCAvLyBVUkwgZm9yIHRyaWdnZXIgYnV0dG9uIGltYWdlXG5cdFx0YnV0dG9uSW1hZ2VPbmx5OiBmYWxzZSwgLy8gVHJ1ZSBpZiB0aGUgaW1hZ2UgYXBwZWFycyBhbG9uZSwgZmFsc2UgaWYgaXQgYXBwZWFycyBvbiBhIGJ1dHRvblxuXHRcdGhpZGVJZk5vUHJldk5leHQ6IGZhbHNlLCAvLyBUcnVlIHRvIGhpZGUgbmV4dC9wcmV2aW91cyBtb250aCBsaW5rc1xuXHRcdFx0Ly8gaWYgbm90IGFwcGxpY2FibGUsIGZhbHNlIHRvIGp1c3QgZGlzYWJsZSB0aGVtXG5cdFx0bmF2aWdhdGlvbkFzRGF0ZUZvcm1hdDogZmFsc2UsIC8vIFRydWUgaWYgZGF0ZSBmb3JtYXR0aW5nIGFwcGxpZWQgdG8gcHJldi90b2RheS9uZXh0IGxpbmtzXG5cdFx0Z290b0N1cnJlbnQ6IGZhbHNlLCAvLyBUcnVlIGlmIHRvZGF5IGxpbmsgZ29lcyBiYWNrIHRvIGN1cnJlbnQgc2VsZWN0aW9uIGluc3RlYWRcblx0XHRjaGFuZ2VNb250aDogZmFsc2UsIC8vIFRydWUgaWYgbW9udGggY2FuIGJlIHNlbGVjdGVkIGRpcmVjdGx5LCBmYWxzZSBpZiBvbmx5IHByZXYvbmV4dFxuXHRcdGNoYW5nZVllYXI6IGZhbHNlLCAvLyBUcnVlIGlmIHllYXIgY2FuIGJlIHNlbGVjdGVkIGRpcmVjdGx5LCBmYWxzZSBpZiBvbmx5IHByZXYvbmV4dFxuXHRcdHllYXJSYW5nZTogJ2MtMTA6YysxMCcsIC8vIFJhbmdlIG9mIHllYXJzIHRvIGRpc3BsYXkgaW4gZHJvcC1kb3duLFxuXHRcdFx0Ly8gZWl0aGVyIHJlbGF0aXZlIHRvIHRvZGF5J3MgeWVhciAoLW5uOitubiksIHJlbGF0aXZlIHRvIGN1cnJlbnRseSBkaXNwbGF5ZWQgeWVhclxuXHRcdFx0Ly8gKGMtbm46YytubiksIGFic29sdXRlIChubm5uOm5ubm4pLCBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSAobm5ubjotbilcblx0XHRzaG93T3RoZXJNb250aHM6IGZhbHNlLCAvLyBUcnVlIHRvIHNob3cgZGF0ZXMgaW4gb3RoZXIgbW9udGhzLCBmYWxzZSB0byBsZWF2ZSBibGFua1xuXHRcdHNlbGVjdE90aGVyTW9udGhzOiBmYWxzZSwgLy8gVHJ1ZSB0byBhbGxvdyBzZWxlY3Rpb24gb2YgZGF0ZXMgaW4gb3RoZXIgbW9udGhzLCBmYWxzZSBmb3IgdW5zZWxlY3RhYmxlXG5cdFx0c2hvd1dlZWs6IGZhbHNlLCAvLyBUcnVlIHRvIHNob3cgd2VlayBvZiB0aGUgeWVhciwgZmFsc2UgdG8gbm90IHNob3cgaXRcblx0XHRjYWxjdWxhdGVXZWVrOiB0aGlzLmlzbzg2MDFXZWVrLCAvLyBIb3cgdG8gY2FsY3VsYXRlIHRoZSB3ZWVrIG9mIHRoZSB5ZWFyLFxuXHRcdFx0Ly8gdGFrZXMgYSBEYXRlIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHdlZWsgZm9yIGl0XG5cdFx0c2hvcnRZZWFyQ3V0b2ZmOiAnKzEwJywgLy8gU2hvcnQgeWVhciB2YWx1ZXMgPCB0aGlzIGFyZSBpbiB0aGUgY3VycmVudCBjZW50dXJ5LFxuXHRcdFx0Ly8gPiB0aGlzIGFyZSBpbiB0aGUgcHJldmlvdXMgY2VudHVyeSxcblx0XHRcdC8vIHN0cmluZyB2YWx1ZSBzdGFydGluZyB3aXRoICcrJyBmb3IgY3VycmVudCB5ZWFyICsgdmFsdWVcblx0XHRtaW5EYXRlOiBudWxsLCAvLyBUaGUgZWFybGllc3Qgc2VsZWN0YWJsZSBkYXRlLCBvciBudWxsIGZvciBubyBsaW1pdFxuXHRcdG1heERhdGU6IG51bGwsIC8vIFRoZSBsYXRlc3Qgc2VsZWN0YWJsZSBkYXRlLCBvciBudWxsIGZvciBubyBsaW1pdFxuXHRcdGR1cmF0aW9uOiAnZmFzdCcsIC8vIER1cmF0aW9uIG9mIGRpc3BsYXkvY2xvc3VyZVxuXHRcdGJlZm9yZVNob3dEYXk6IG51bGwsIC8vIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBkYXRlIGFuZCByZXR1cm5zIGFuIGFycmF5IHdpdGhcblx0XHRcdC8vIFswXSA9IHRydWUgaWYgc2VsZWN0YWJsZSwgZmFsc2UgaWYgbm90LCBbMV0gPSBjdXN0b20gQ1NTIGNsYXNzIG5hbWUocykgb3IgJycsXG5cdFx0XHQvLyBbMl0gPSBjZWxsIHRpdGxlIChvcHRpb25hbCksIGUuZy4gJC5kYXRlcGlja2VyLm5vV2Vla2VuZHNcblx0XHRiZWZvcmVTaG93OiBudWxsLCAvLyBGdW5jdGlvbiB0aGF0IHRha2VzIGFuIGlucHV0IGZpZWxkIGFuZFxuXHRcdFx0Ly8gcmV0dXJucyBhIHNldCBvZiBjdXN0b20gc2V0dGluZ3MgZm9yIHRoZSBkYXRlIHBpY2tlclxuXHRcdG9uU2VsZWN0OiBudWxsLCAvLyBEZWZpbmUgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIGEgZGF0ZSBpcyBzZWxlY3RlZFxuXHRcdG9uQ2hhbmdlTW9udGhZZWFyOiBudWxsLCAvLyBEZWZpbmUgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSBtb250aCBvciB5ZWFyIGlzIGNoYW5nZWRcblx0XHRvbkNsb3NlOiBudWxsLCAvLyBEZWZpbmUgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSBkYXRlcGlja2VyIGlzIGNsb3NlZFxuXHRcdG51bWJlck9mTW9udGhzOiAxLCAvLyBOdW1iZXIgb2YgbW9udGhzIHRvIHNob3cgYXQgYSB0aW1lXG5cdFx0c2hvd0N1cnJlbnRBdFBvczogMCwgLy8gVGhlIHBvc2l0aW9uIGluIG11bHRpcGUgbW9udGhzIGF0IHdoaWNoIHRvIHNob3cgdGhlIGN1cnJlbnQgbW9udGggKHN0YXJ0aW5nIGF0IDApXG5cdFx0c3RlcE1vbnRoczogMSwgLy8gTnVtYmVyIG9mIG1vbnRocyB0byBzdGVwIGJhY2svZm9yd2FyZFxuXHRcdHN0ZXBCaWdNb250aHM6IDEyLCAvLyBOdW1iZXIgb2YgbW9udGhzIHRvIHN0ZXAgYmFjay9mb3J3YXJkIGZvciB0aGUgYmlnIGxpbmtzXG5cdFx0YWx0RmllbGQ6ICcnLCAvLyBTZWxlY3RvciBmb3IgYW4gYWx0ZXJuYXRlIGZpZWxkIHRvIHN0b3JlIHNlbGVjdGVkIGRhdGVzIGludG9cblx0XHRhbHRGb3JtYXQ6ICcnLCAvLyBUaGUgZGF0ZSBmb3JtYXQgdG8gdXNlIGZvciB0aGUgYWx0ZXJuYXRlIGZpZWxkXG5cdFx0Y29uc3RyYWluSW5wdXQ6IHRydWUsIC8vIFRoZSBpbnB1dCBpcyBjb25zdHJhaW5lZCBieSB0aGUgY3VycmVudCBkYXRlIGZvcm1hdFxuXHRcdHNob3dCdXR0b25QYW5lbDogZmFsc2UsIC8vIFRydWUgdG8gc2hvdyBidXR0b24gcGFuZWwsIGZhbHNlIHRvIG5vdCBzaG93IGl0XG5cdFx0YXV0b1NpemU6IGZhbHNlLCAvLyBUcnVlIHRvIHNpemUgdGhlIGlucHV0IGZvciB0aGUgZGF0ZSBmb3JtYXQsIGZhbHNlIHRvIGxlYXZlIGFzIGlzXG5cdFx0ZGlzYWJsZWQ6IGZhbHNlIC8vIFRoZSBpbml0aWFsIGRpc2FibGVkIHN0YXRlXG5cdH07XG5cdCQuZXh0ZW5kKHRoaXMuX2RlZmF1bHRzLCB0aGlzLnJlZ2lvbmFsWycnXSk7XG5cdHRoaXMuZHBEaXYgPSBiaW5kSG92ZXIoJCgnPGRpdiBpZD1cIicgKyB0aGlzLl9tYWluRGl2SWQgKyAnXCIgY2xhc3M9XCJ1aS1kYXRlcGlja2VyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXggdWktY29ybmVyLWFsbFwiPjwvZGl2PicpKTtcbn1cblxuJC5leHRlbmQoRGF0ZXBpY2tlci5wcm90b3R5cGUsIHtcblx0LyogQ2xhc3MgbmFtZSBhZGRlZCB0byBlbGVtZW50cyB0byBpbmRpY2F0ZSBhbHJlYWR5IGNvbmZpZ3VyZWQgd2l0aCBhIGRhdGUgcGlja2VyLiAqL1xuXHRtYXJrZXJDbGFzc05hbWU6ICdoYXNEYXRlcGlja2VyJyxcblxuXHQvL0tlZXAgdHJhY2sgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgZGlzcGxheWVkIChzZWUgIzcwNDMpXG5cdG1heFJvd3M6IDQsXG5cblx0LyogRGVidWcgbG9nZ2luZyAoaWYgZW5hYmxlZCkuICovXG5cdGxvZzogZnVuY3Rpb24gKCkge1xuXHRcdGlmICh0aGlzLmRlYnVnKVxuXHRcdFx0Y29uc29sZS5sb2cuYXBwbHkoJycsIGFyZ3VtZW50cyk7XG5cdH0sXG5cblx0Ly8gVE9ETyByZW5hbWUgdG8gXCJ3aWRnZXRcIiB3aGVuIHN3aXRjaGluZyB0byB3aWRnZXQgZmFjdG9yeVxuXHRfd2lkZ2V0RGF0ZXBpY2tlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZHBEaXY7XG5cdH0sXG5cblx0LyogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGRhdGUgcGlja2VyLlxuXHQgICBAcGFyYW0gIHNldHRpbmdzICBvYmplY3QgLSB0aGUgbmV3IHNldHRpbmdzIHRvIHVzZSBhcyBkZWZhdWx0cyAoYW5vbnltb3VzIG9iamVjdClcblx0ICAgQHJldHVybiB0aGUgbWFuYWdlciBvYmplY3QgKi9cblx0c2V0RGVmYXVsdHM6IGZ1bmN0aW9uKHNldHRpbmdzKSB7XG5cdFx0ZXh0ZW5kUmVtb3ZlKHRoaXMuX2RlZmF1bHRzLCBzZXR0aW5ncyB8fCB7fSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0LyogQXR0YWNoIHRoZSBkYXRlIHBpY2tlciB0byBhIGpRdWVyeSBzZWxlY3Rpb24uXG5cdCAgIEBwYXJhbSAgdGFyZ2V0ICAgIGVsZW1lbnQgLSB0aGUgdGFyZ2V0IGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW5cblx0ICAgQHBhcmFtICBzZXR0aW5ncyAgb2JqZWN0IC0gdGhlIG5ldyBzZXR0aW5ncyB0byB1c2UgZm9yIHRoaXMgZGF0ZSBwaWNrZXIgaW5zdGFuY2UgKGFub255bW91cykgKi9cblx0X2F0dGFjaERhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCwgc2V0dGluZ3MpIHtcblx0XHQvLyBjaGVjayBmb3Igc2V0dGluZ3Mgb24gdGhlIGNvbnRyb2wgaXRzZWxmIC0gaW4gbmFtZXNwYWNlICdkYXRlOidcblx0XHR2YXIgaW5saW5lU2V0dGluZ3MgPSBudWxsO1xuXHRcdGZvciAodmFyIGF0dHJOYW1lIGluIHRoaXMuX2RlZmF1bHRzKSB7XG5cdFx0XHR2YXIgYXR0clZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0ZTonICsgYXR0ck5hbWUpO1xuXHRcdFx0aWYgKGF0dHJWYWx1ZSkge1xuXHRcdFx0XHRpbmxpbmVTZXR0aW5ncyA9IGlubGluZVNldHRpbmdzIHx8IHt9O1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGlubGluZVNldHRpbmdzW2F0dHJOYW1lXSA9IGV2YWwoYXR0clZhbHVlKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0aW5saW5lU2V0dGluZ3NbYXR0ck5hbWVdID0gYXR0clZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHZhciBub2RlTmFtZSA9IHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHZhciBpbmxpbmUgPSAobm9kZU5hbWUgPT0gJ2RpdicgfHwgbm9kZU5hbWUgPT0gJ3NwYW4nKTtcblx0XHRpZiAoIXRhcmdldC5pZCkge1xuXHRcdFx0dGhpcy51dWlkICs9IDE7XG5cdFx0XHR0YXJnZXQuaWQgPSAnZHAnICsgdGhpcy51dWlkO1xuXHRcdH1cblx0XHR2YXIgaW5zdCA9IHRoaXMuX25ld0luc3QoJCh0YXJnZXQpLCBpbmxpbmUpO1xuXHRcdGluc3Quc2V0dGluZ3MgPSAkLmV4dGVuZCh7fSwgc2V0dGluZ3MgfHwge30sIGlubGluZVNldHRpbmdzIHx8IHt9KTtcblx0XHRpZiAobm9kZU5hbWUgPT0gJ2lucHV0Jykge1xuXHRcdFx0dGhpcy5fY29ubmVjdERhdGVwaWNrZXIodGFyZ2V0LCBpbnN0KTtcblx0XHR9IGVsc2UgaWYgKGlubGluZSkge1xuXHRcdFx0dGhpcy5faW5saW5lRGF0ZXBpY2tlcih0YXJnZXQsIGluc3QpO1xuXHRcdH1cblx0fSxcblxuXHQvKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2JqZWN0LiAqL1xuXHRfbmV3SW5zdDogZnVuY3Rpb24odGFyZ2V0LCBpbmxpbmUpIHtcblx0XHR2YXIgaWQgPSB0YXJnZXRbMF0uaWQucmVwbGFjZSgvKFteQS1aYS16MC05Xy1dKS9nLCAnXFxcXFxcXFwkMScpOyAvLyBlc2NhcGUgalF1ZXJ5IG1ldGEgY2hhcnNcblx0XHRyZXR1cm4ge2lkOiBpZCwgaW5wdXQ6IHRhcmdldCwgLy8gYXNzb2NpYXRlZCB0YXJnZXRcblx0XHRcdHNlbGVjdGVkRGF5OiAwLCBzZWxlY3RlZE1vbnRoOiAwLCBzZWxlY3RlZFllYXI6IDAsIC8vIGN1cnJlbnQgc2VsZWN0aW9uXG5cdFx0XHRkcmF3TW9udGg6IDAsIGRyYXdZZWFyOiAwLCAvLyBtb250aCBiZWluZyBkcmF3blxuXHRcdFx0aW5saW5lOiBpbmxpbmUsIC8vIGlzIGRhdGVwaWNrZXIgaW5saW5lIG9yIG5vdFxuXHRcdFx0ZHBEaXY6ICghaW5saW5lID8gdGhpcy5kcERpdiA6IC8vIHByZXNlbnRhdGlvbiBkaXZcblx0XHRcdGJpbmRIb3ZlcigkKCc8ZGl2IGNsYXNzPVwiJyArIHRoaXMuX2lubGluZUNsYXNzICsgJyB1aS1kYXRlcGlja2VyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXggdWktY29ybmVyLWFsbFwiPjwvZGl2PicpKSl9O1xuXHR9LFxuXG5cdC8qIEF0dGFjaCB0aGUgZGF0ZSBwaWNrZXIgdG8gYW4gaW5wdXQgZmllbGQuICovXG5cdF9jb25uZWN0RGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0LCBpbnN0KSB7XG5cdFx0dmFyIGlucHV0ID0gJCh0YXJnZXQpO1xuXHRcdGluc3QuYXBwZW5kID0gJChbXSk7XG5cdFx0aW5zdC50cmlnZ2VyID0gJChbXSk7XG5cdFx0aWYgKGlucHV0Lmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSlcblx0XHRcdHJldHVybjtcblx0XHR0aGlzLl9hdHRhY2htZW50cyhpbnB1dCwgaW5zdCk7XG5cdFx0aW5wdXQuYWRkQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmtleWRvd24odGhpcy5fZG9LZXlEb3duKS5cblx0XHRcdGtleXByZXNzKHRoaXMuX2RvS2V5UHJlc3MpLmtleXVwKHRoaXMuX2RvS2V5VXApLlxuXHRcdFx0YmluZChcInNldERhdGEuZGF0ZXBpY2tlclwiLCBmdW5jdGlvbihldmVudCwga2V5LCB2YWx1ZSkge1xuXHRcdFx0XHRpbnN0LnNldHRpbmdzW2tleV0gPSB2YWx1ZTtcblx0XHRcdH0pLmJpbmQoXCJnZXREYXRhLmRhdGVwaWNrZXJcIiwgZnVuY3Rpb24oZXZlbnQsIGtleSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fZ2V0KGluc3QsIGtleSk7XG5cdFx0XHR9KTtcblx0XHR0aGlzLl9hdXRvU2l6ZShpbnN0KTtcblx0XHQkLmRhdGEodGFyZ2V0LCBQUk9QX05BTUUsIGluc3QpO1xuXHRcdC8vSWYgZGlzYWJsZWQgb3B0aW9uIGlzIHRydWUsIGRpc2FibGUgdGhlIGRhdGVwaWNrZXIgb25jZSBpdCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgaW5wdXQgKHNlZSB0aWNrZXQgIzU2NjUpXG5cdFx0aWYoIGluc3Quc2V0dGluZ3MuZGlzYWJsZWQgKSB7XG5cdFx0XHR0aGlzLl9kaXNhYmxlRGF0ZXBpY2tlciggdGFyZ2V0ICk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qIE1ha2UgYXR0YWNobWVudHMgYmFzZWQgb24gc2V0dGluZ3MuICovXG5cdF9hdHRhY2htZW50czogZnVuY3Rpb24oaW5wdXQsIGluc3QpIHtcblx0XHR2YXIgYXBwZW5kVGV4dCA9IHRoaXMuX2dldChpbnN0LCAnYXBwZW5kVGV4dCcpO1xuXHRcdHZhciBpc1JUTCA9IHRoaXMuX2dldChpbnN0LCAnaXNSVEwnKTtcblx0XHRpZiAoaW5zdC5hcHBlbmQpXG5cdFx0XHRpbnN0LmFwcGVuZC5yZW1vdmUoKTtcblx0XHRpZiAoYXBwZW5kVGV4dCkge1xuXHRcdFx0aW5zdC5hcHBlbmQgPSAkKCc8c3BhbiBjbGFzcz1cIicgKyB0aGlzLl9hcHBlbmRDbGFzcyArICdcIj4nICsgYXBwZW5kVGV4dCArICc8L3NwYW4+Jyk7XG5cdFx0XHRpbnB1dFtpc1JUTCA/ICdiZWZvcmUnIDogJ2FmdGVyJ10oaW5zdC5hcHBlbmQpO1xuXHRcdH1cblx0XHRpbnB1dC51bmJpbmQoJ2ZvY3VzJywgdGhpcy5fc2hvd0RhdGVwaWNrZXIpO1xuXHRcdGlmIChpbnN0LnRyaWdnZXIpXG5cdFx0XHRpbnN0LnRyaWdnZXIucmVtb3ZlKCk7XG5cdFx0dmFyIHNob3dPbiA9IHRoaXMuX2dldChpbnN0LCAnc2hvd09uJyk7XG5cdFx0aWYgKHNob3dPbiA9PSAnZm9jdXMnIHx8IHNob3dPbiA9PSAnYm90aCcpIC8vIHBvcC11cCBkYXRlIHBpY2tlciB3aGVuIGluIHRoZSBtYXJrZWQgZmllbGRcblx0XHRcdGlucHV0LmZvY3VzKHRoaXMuX3Nob3dEYXRlcGlja2VyKTtcblx0XHRpZiAoc2hvd09uID09ICdidXR0b24nIHx8IHNob3dPbiA9PSAnYm90aCcpIHsgLy8gcG9wLXVwIGRhdGUgcGlja2VyIHdoZW4gYnV0dG9uIGNsaWNrZWRcblx0XHRcdHZhciBidXR0b25UZXh0ID0gdGhpcy5fZ2V0KGluc3QsICdidXR0b25UZXh0Jyk7XG5cdFx0XHR2YXIgYnV0dG9uSW1hZ2UgPSB0aGlzLl9nZXQoaW5zdCwgJ2J1dHRvbkltYWdlJyk7XG5cdFx0XHRpbnN0LnRyaWdnZXIgPSAkKHRoaXMuX2dldChpbnN0LCAnYnV0dG9uSW1hZ2VPbmx5JykgP1xuXHRcdFx0XHQkKCc8aW1nLz4nKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3MpLlxuXHRcdFx0XHRcdGF0dHIoeyBzcmM6IGJ1dHRvbkltYWdlLCBhbHQ6IGJ1dHRvblRleHQsIHRpdGxlOiBidXR0b25UZXh0IH0pIDpcblx0XHRcdFx0JCgnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+PC9idXR0b24+JykuYWRkQ2xhc3ModGhpcy5fdHJpZ2dlckNsYXNzKS5cblx0XHRcdFx0XHRodG1sKGJ1dHRvbkltYWdlID09ICcnID8gYnV0dG9uVGV4dCA6ICQoJzxpbWcvPicpLmF0dHIoXG5cdFx0XHRcdFx0eyBzcmM6YnV0dG9uSW1hZ2UsIGFsdDpidXR0b25UZXh0LCB0aXRsZTpidXR0b25UZXh0IH0pKSk7XG5cdFx0XHRpbnB1dFtpc1JUTCA/ICdiZWZvcmUnIDogJ2FmdGVyJ10oaW5zdC50cmlnZ2VyKTtcblx0XHRcdGluc3QudHJpZ2dlci5jbGljayhmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcgJiYgJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQgPT0gaW5wdXRbMF0pXG5cdFx0XHRcdFx0JC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpO1xuXHRcdFx0XHRlbHNlIGlmICgkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nICYmICQuZGF0ZXBpY2tlci5fbGFzdElucHV0ICE9IGlucHV0WzBdKSB7XG5cdFx0XHRcdFx0JC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpO1xuXHRcdFx0XHRcdCQuZGF0ZXBpY2tlci5fc2hvd0RhdGVwaWNrZXIoaW5wdXRbMF0pO1xuXHRcdFx0XHR9IGVsc2Vcblx0XHRcdFx0XHQkLmRhdGVwaWNrZXIuX3Nob3dEYXRlcGlja2VyKGlucHV0WzBdKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qIEFwcGx5IHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgdGhlIGRhdGUgZm9ybWF0LiAqL1xuXHRfYXV0b1NpemU6IGZ1bmN0aW9uKGluc3QpIHtcblx0XHRpZiAodGhpcy5fZ2V0KGluc3QsICdhdXRvU2l6ZScpICYmICFpbnN0LmlubGluZSkge1xuXHRcdFx0dmFyIGRhdGUgPSBuZXcgRGF0ZSgyMDA5LCAxMiAtIDEsIDIwKTsgLy8gRW5zdXJlIGRvdWJsZSBkaWdpdHNcblx0XHRcdHZhciBkYXRlRm9ybWF0ID0gdGhpcy5fZ2V0KGluc3QsICdkYXRlRm9ybWF0Jyk7XG5cdFx0XHRpZiAoZGF0ZUZvcm1hdC5tYXRjaCgvW0RNXS8pKSB7XG5cdFx0XHRcdHZhciBmaW5kTWF4ID0gZnVuY3Rpb24obmFtZXMpIHtcblx0XHRcdFx0XHR2YXIgbWF4ID0gMDtcblx0XHRcdFx0XHR2YXIgbWF4SSA9IDA7XG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0aWYgKG5hbWVzW2ldLmxlbmd0aCA+IG1heCkge1xuXHRcdFx0XHRcdFx0XHRtYXggPSBuYW1lc1tpXS5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdG1heEkgPSBpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF4STtcblx0XHRcdFx0fTtcblx0XHRcdFx0ZGF0ZS5zZXRNb250aChmaW5kTWF4KHRoaXMuX2dldChpbnN0LCAoZGF0ZUZvcm1hdC5tYXRjaCgvTU0vKSA/XG5cdFx0XHRcdFx0J21vbnRoTmFtZXMnIDogJ21vbnRoTmFtZXNTaG9ydCcpKSkpO1xuXHRcdFx0XHRkYXRlLnNldERhdGUoZmluZE1heCh0aGlzLl9nZXQoaW5zdCwgKGRhdGVGb3JtYXQubWF0Y2goL0RELykgP1xuXHRcdFx0XHRcdCdkYXlOYW1lcycgOiAnZGF5TmFtZXNTaG9ydCcpKSkgKyAyMCAtIGRhdGUuZ2V0RGF5KCkpO1xuXHRcdFx0fVxuXHRcdFx0aW5zdC5pbnB1dC5hdHRyKCdzaXplJywgdGhpcy5fZm9ybWF0RGF0ZShpbnN0LCBkYXRlKS5sZW5ndGgpO1xuXHRcdH1cblx0fSxcblxuXHQvKiBBdHRhY2ggYW4gaW5saW5lIGRhdGUgcGlja2VyIHRvIGEgZGl2LiAqL1xuXHRfaW5saW5lRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0LCBpbnN0KSB7XG5cdFx0dmFyIGRpdlNwYW4gPSAkKHRhcmdldCk7XG5cdFx0aWYgKGRpdlNwYW4uaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKVxuXHRcdFx0cmV0dXJuO1xuXHRcdGRpdlNwYW4uYWRkQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmFwcGVuZChpbnN0LmRwRGl2KS5cblx0XHRcdGJpbmQoXCJzZXREYXRhLmRhdGVwaWNrZXJcIiwgZnVuY3Rpb24oZXZlbnQsIGtleSwgdmFsdWUpe1xuXHRcdFx0XHRpbnN0LnNldHRpbmdzW2tleV0gPSB2YWx1ZTtcblx0XHRcdH0pLmJpbmQoXCJnZXREYXRhLmRhdGVwaWNrZXJcIiwgZnVuY3Rpb24oZXZlbnQsIGtleSl7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9nZXQoaW5zdCwga2V5KTtcblx0XHRcdH0pO1xuXHRcdCQuZGF0YSh0YXJnZXQsIFBST1BfTkFNRSwgaW5zdCk7XG5cdFx0dGhpcy5fc2V0RGF0ZShpbnN0LCB0aGlzLl9nZXREZWZhdWx0RGF0ZShpbnN0KSwgdHJ1ZSk7XG5cdFx0dGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTtcblx0XHR0aGlzLl91cGRhdGVBbHRlcm5hdGUoaW5zdCk7XG5cdFx0Ly9JZiBkaXNhYmxlZCBvcHRpb24gaXMgdHJ1ZSwgZGlzYWJsZSB0aGUgZGF0ZXBpY2tlciBiZWZvcmUgc2hvd2luZyBpdCAoc2VlIHRpY2tldCAjNTY2NSlcblx0XHRpZiggaW5zdC5zZXR0aW5ncy5kaXNhYmxlZCApIHtcblx0XHRcdHRoaXMuX2Rpc2FibGVEYXRlcGlja2VyKCB0YXJnZXQgKTtcblx0XHR9XG5cdFx0Ly8gU2V0IGRpc3BsYXk6YmxvY2sgaW4gcGxhY2Ugb2YgaW5zdC5kcERpdi5zaG93KCkgd2hpY2ggd29uJ3Qgd29yayBvbiBkaXNjb25uZWN0ZWQgZWxlbWVudHNcblx0XHQvLyBodHRwOi8vYnVncy5qcXVlcnl1aS5jb20vdGlja2V0Lzc1NTIgLSBBIERhdGVwaWNrZXIgY3JlYXRlZCBvbiBhIGRldGFjaGVkIGRpdiBoYXMgemVybyBoZWlnaHRcblx0XHRpbnN0LmRwRGl2LmNzcyggXCJkaXNwbGF5XCIsIFwiYmxvY2tcIiApO1xuXHR9LFxuXG5cdC8qIFBvcC11cCB0aGUgZGF0ZSBwaWNrZXIgaW4gYSBcImRpYWxvZ1wiIGJveC5cblx0ICAgQHBhcmFtICBpbnB1dCAgICAgZWxlbWVudCAtIGlnbm9yZWRcblx0ICAgQHBhcmFtICBkYXRlICAgICAgc3RyaW5nIG9yIERhdGUgLSB0aGUgaW5pdGlhbCBkYXRlIHRvIGRpc3BsYXlcblx0ICAgQHBhcmFtICBvblNlbGVjdCAgZnVuY3Rpb24gLSB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgZGF0ZSBpcyBzZWxlY3RlZFxuXHQgICBAcGFyYW0gIHNldHRpbmdzICBvYmplY3QgLSB1cGRhdGUgdGhlIGRpYWxvZyBkYXRlIHBpY2tlciBpbnN0YW5jZSdzIHNldHRpbmdzIChhbm9ueW1vdXMgb2JqZWN0KVxuXHQgICBAcGFyYW0gIHBvcyAgICAgICBpbnRbMl0gLSBjb29yZGluYXRlcyBmb3IgdGhlIGRpYWxvZydzIHBvc2l0aW9uIHdpdGhpbiB0aGUgc2NyZWVuIG9yXG5cdCAgICAgICAgICAgICAgICAgICAgIGV2ZW50IC0gd2l0aCB4L3kgY29vcmRpbmF0ZXMgb3Jcblx0ICAgICAgICAgICAgICAgICAgICAgbGVhdmUgZW1wdHkgZm9yIGRlZmF1bHQgKHNjcmVlbiBjZW50cmUpXG5cdCAgIEByZXR1cm4gdGhlIG1hbmFnZXIgb2JqZWN0ICovXG5cdF9kaWFsb2dEYXRlcGlja2VyOiBmdW5jdGlvbihpbnB1dCwgZGF0ZSwgb25TZWxlY3QsIHNldHRpbmdzLCBwb3MpIHtcblx0XHR2YXIgaW5zdCA9IHRoaXMuX2RpYWxvZ0luc3Q7IC8vIGludGVybmFsIGluc3RhbmNlXG5cdFx0aWYgKCFpbnN0KSB7XG5cdFx0XHR0aGlzLnV1aWQgKz0gMTtcblx0XHRcdHZhciBpZCA9ICdkcCcgKyB0aGlzLnV1aWQ7XG5cdFx0XHR0aGlzLl9kaWFsb2dJbnB1dCA9ICQoJzxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiJyArIGlkICtcblx0XHRcdFx0J1wiIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB0b3A6IC0xMDBweDsgd2lkdGg6IDBweDtcIi8+Jyk7XG5cdFx0XHR0aGlzLl9kaWFsb2dJbnB1dC5rZXlkb3duKHRoaXMuX2RvS2V5RG93bik7XG5cdFx0XHQkKCdib2R5JykuYXBwZW5kKHRoaXMuX2RpYWxvZ0lucHV0KTtcblx0XHRcdGluc3QgPSB0aGlzLl9kaWFsb2dJbnN0ID0gdGhpcy5fbmV3SW5zdCh0aGlzLl9kaWFsb2dJbnB1dCwgZmFsc2UpO1xuXHRcdFx0aW5zdC5zZXR0aW5ncyA9IHt9O1xuXHRcdFx0JC5kYXRhKHRoaXMuX2RpYWxvZ0lucHV0WzBdLCBQUk9QX05BTUUsIGluc3QpO1xuXHRcdH1cblx0XHRleHRlbmRSZW1vdmUoaW5zdC5zZXR0aW5ncywgc2V0dGluZ3MgfHwge30pO1xuXHRcdGRhdGUgPSAoZGF0ZSAmJiBkYXRlLmNvbnN0cnVjdG9yID09IERhdGUgPyB0aGlzLl9mb3JtYXREYXRlKGluc3QsIGRhdGUpIDogZGF0ZSk7XG5cdFx0dGhpcy5fZGlhbG9nSW5wdXQudmFsKGRhdGUpO1xuXG5cdFx0dGhpcy5fcG9zID0gKHBvcyA/IChwb3MubGVuZ3RoID8gcG9zIDogW3Bvcy5wYWdlWCwgcG9zLnBhZ2VZXSkgOiBudWxsKTtcblx0XHRpZiAoIXRoaXMuX3Bvcykge1xuXHRcdFx0dmFyIGJyb3dzZXJXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcblx0XHRcdHZhciBicm93c2VySGVpZ2h0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcblx0XHRcdHZhciBzY3JvbGxYID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0O1xuXHRcdFx0dmFyIHNjcm9sbFkgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xuXHRcdFx0dGhpcy5fcG9zID0gLy8gc2hvdWxkIHVzZSBhY3R1YWwgd2lkdGgvaGVpZ2h0IGJlbG93XG5cdFx0XHRcdFsoYnJvd3NlcldpZHRoIC8gMikgLSAxMDAgKyBzY3JvbGxYLCAoYnJvd3NlckhlaWdodCAvIDIpIC0gMTUwICsgc2Nyb2xsWV07XG5cdFx0fVxuXG5cdFx0Ly8gbW92ZSBpbnB1dCBvbiBzY3JlZW4gZm9yIGZvY3VzLCBidXQgaGlkZGVuIGJlaGluZCBkaWFsb2dcblx0XHR0aGlzLl9kaWFsb2dJbnB1dC5jc3MoJ2xlZnQnLCAodGhpcy5fcG9zWzBdICsgMjApICsgJ3B4JykuY3NzKCd0b3AnLCB0aGlzLl9wb3NbMV0gKyAncHgnKTtcblx0XHRpbnN0LnNldHRpbmdzLm9uU2VsZWN0ID0gb25TZWxlY3Q7XG5cdFx0dGhpcy5faW5EaWFsb2cgPSB0cnVlO1xuXHRcdHRoaXMuZHBEaXYuYWRkQ2xhc3ModGhpcy5fZGlhbG9nQ2xhc3MpO1xuXHRcdHRoaXMuX3Nob3dEYXRlcGlja2VyKHRoaXMuX2RpYWxvZ0lucHV0WzBdKTtcblx0XHRpZiAoJC5ibG9ja1VJKVxuXHRcdFx0JC5ibG9ja1VJKHRoaXMuZHBEaXYpO1xuXHRcdCQuZGF0YSh0aGlzLl9kaWFsb2dJbnB1dFswXSwgUFJPUF9OQU1FLCBpbnN0KTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHQvKiBEZXRhY2ggYSBkYXRlcGlja2VyIGZyb20gaXRzIGNvbnRyb2wuXG5cdCAgIEBwYXJhbSAgdGFyZ2V0ICAgIGVsZW1lbnQgLSB0aGUgdGFyZ2V0IGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW4gKi9cblx0X2Rlc3Ryb3lEYXRlcGlja2VyOiBmdW5jdGlvbih0YXJnZXQpIHtcblx0XHR2YXIgJHRhcmdldCA9ICQodGFyZ2V0KTtcblx0XHR2YXIgaW5zdCA9ICQuZGF0YSh0YXJnZXQsIFBST1BfTkFNRSk7XG5cdFx0aWYgKCEkdGFyZ2V0Lmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR2YXIgbm9kZU5hbWUgPSB0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHQkLnJlbW92ZURhdGEodGFyZ2V0LCBQUk9QX05BTUUpO1xuXHRcdGlmIChub2RlTmFtZSA9PSAnaW5wdXQnKSB7XG5cdFx0XHRpbnN0LmFwcGVuZC5yZW1vdmUoKTtcblx0XHRcdGluc3QudHJpZ2dlci5yZW1vdmUoKTtcblx0XHRcdCR0YXJnZXQucmVtb3ZlQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLlxuXHRcdFx0XHR1bmJpbmQoJ2ZvY3VzJywgdGhpcy5fc2hvd0RhdGVwaWNrZXIpLlxuXHRcdFx0XHR1bmJpbmQoJ2tleWRvd24nLCB0aGlzLl9kb0tleURvd24pLlxuXHRcdFx0XHR1bmJpbmQoJ2tleXByZXNzJywgdGhpcy5fZG9LZXlQcmVzcykuXG5cdFx0XHRcdHVuYmluZCgna2V5dXAnLCB0aGlzLl9kb0tleVVwKTtcblx0XHR9IGVsc2UgaWYgKG5vZGVOYW1lID09ICdkaXYnIHx8IG5vZGVOYW1lID09ICdzcGFuJylcblx0XHRcdCR0YXJnZXQucmVtb3ZlQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmVtcHR5KCk7XG5cdH0sXG5cblx0LyogRW5hYmxlIHRoZSBkYXRlIHBpY2tlciB0byBhIGpRdWVyeSBzZWxlY3Rpb24uXG5cdCAgIEBwYXJhbSAgdGFyZ2V0ICAgIGVsZW1lbnQgLSB0aGUgdGFyZ2V0IGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW4gKi9cblx0X2VuYWJsZURhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCkge1xuXHRcdHZhciAkdGFyZ2V0ID0gJCh0YXJnZXQpO1xuXHRcdHZhciBpbnN0ID0gJC5kYXRhKHRhcmdldCwgUFJPUF9OQU1FKTtcblx0XHRpZiAoISR0YXJnZXQuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHZhciBub2RlTmFtZSA9IHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdGlmIChub2RlTmFtZSA9PSAnaW5wdXQnKSB7XG5cdFx0XHR0YXJnZXQuZGlzYWJsZWQgPSBmYWxzZTtcblx0XHRcdGluc3QudHJpZ2dlci5maWx0ZXIoJ2J1dHRvbicpLlxuXHRcdFx0XHRlYWNoKGZ1bmN0aW9uKCkgeyB0aGlzLmRpc2FibGVkID0gZmFsc2U7IH0pLmVuZCgpLlxuXHRcdFx0XHRmaWx0ZXIoJ2ltZycpLmNzcyh7b3BhY2l0eTogJzEuMCcsIGN1cnNvcjogJyd9KTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAobm9kZU5hbWUgPT0gJ2RpdicgfHwgbm9kZU5hbWUgPT0gJ3NwYW4nKSB7XG5cdFx0XHR2YXIgaW5saW5lID0gJHRhcmdldC5jaGlsZHJlbignLicgKyB0aGlzLl9pbmxpbmVDbGFzcyk7XG5cdFx0XHRpbmxpbmUuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcygndWktc3RhdGUtZGlzYWJsZWQnKTtcblx0XHRcdGlubGluZS5maW5kKFwic2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXJcIikuXG5cdFx0XHRcdHByb3AoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cdFx0fVxuXHRcdHRoaXMuX2Rpc2FibGVkSW5wdXRzID0gJC5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsXG5cdFx0XHRmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gKHZhbHVlID09IHRhcmdldCA/IG51bGwgOiB2YWx1ZSk7IH0pOyAvLyBkZWxldGUgZW50cnlcblx0fSxcblxuXHQvKiBEaXNhYmxlIHRoZSBkYXRlIHBpY2tlciB0byBhIGpRdWVyeSBzZWxlY3Rpb24uXG5cdCAgIEBwYXJhbSAgdGFyZ2V0ICAgIGVsZW1lbnQgLSB0aGUgdGFyZ2V0IGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW4gKi9cblx0X2Rpc2FibGVEYXRlcGlja2VyOiBmdW5jdGlvbih0YXJnZXQpIHtcblx0XHR2YXIgJHRhcmdldCA9ICQodGFyZ2V0KTtcblx0XHR2YXIgaW5zdCA9ICQuZGF0YSh0YXJnZXQsIFBST1BfTkFNRSk7XG5cdFx0aWYgKCEkdGFyZ2V0Lmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR2YXIgbm9kZU5hbWUgPSB0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRpZiAobm9kZU5hbWUgPT0gJ2lucHV0Jykge1xuXHRcdFx0dGFyZ2V0LmRpc2FibGVkID0gdHJ1ZTtcblx0XHRcdGluc3QudHJpZ2dlci5maWx0ZXIoJ2J1dHRvbicpLlxuXHRcdFx0XHRlYWNoKGZ1bmN0aW9uKCkgeyB0aGlzLmRpc2FibGVkID0gdHJ1ZTsgfSkuZW5kKCkuXG5cdFx0XHRcdGZpbHRlcignaW1nJykuY3NzKHtvcGFjaXR5OiAnMC41JywgY3Vyc29yOiAnZGVmYXVsdCd9KTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAobm9kZU5hbWUgPT0gJ2RpdicgfHwgbm9kZU5hbWUgPT0gJ3NwYW4nKSB7XG5cdFx0XHR2YXIgaW5saW5lID0gJHRhcmdldC5jaGlsZHJlbignLicgKyB0aGlzLl9pbmxpbmVDbGFzcyk7XG5cdFx0XHRpbmxpbmUuY2hpbGRyZW4oKS5hZGRDbGFzcygndWktc3RhdGUtZGlzYWJsZWQnKTtcblx0XHRcdGlubGluZS5maW5kKFwic2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsIHNlbGVjdC51aS1kYXRlcGlja2VyLXllYXJcIikuXG5cdFx0XHRcdHByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblx0XHR9XG5cdFx0dGhpcy5fZGlzYWJsZWRJbnB1dHMgPSAkLm1hcCh0aGlzLl9kaXNhYmxlZElucHV0cyxcblx0XHRcdGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiAodmFsdWUgPT0gdGFyZ2V0ID8gbnVsbCA6IHZhbHVlKTsgfSk7IC8vIGRlbGV0ZSBlbnRyeVxuXHRcdHRoaXMuX2Rpc2FibGVkSW5wdXRzW3RoaXMuX2Rpc2FibGVkSW5wdXRzLmxlbmd0aF0gPSB0YXJnZXQ7XG5cdH0sXG5cblx0LyogSXMgdGhlIGZpcnN0IGZpZWxkIGluIGEgalF1ZXJ5IGNvbGxlY3Rpb24gZGlzYWJsZWQgYXMgYSBkYXRlcGlja2VyP1xuXHQgICBAcGFyYW0gIHRhcmdldCAgICBlbGVtZW50IC0gdGhlIHRhcmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuXG5cdCAgIEByZXR1cm4gYm9vbGVhbiAtIHRydWUgaWYgZGlzYWJsZWQsIGZhbHNlIGlmIGVuYWJsZWQgKi9cblx0X2lzRGlzYWJsZWREYXRlcGlja2VyOiBmdW5jdGlvbih0YXJnZXQpIHtcblx0XHRpZiAoIXRhcmdldCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2Rpc2FibGVkSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAodGhpcy5fZGlzYWJsZWRJbnB1dHNbaV0gPT0gdGFyZ2V0KVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qIFJldHJpZXZlIHRoZSBpbnN0YW5jZSBkYXRhIGZvciB0aGUgdGFyZ2V0IGNvbnRyb2wuXG5cdCAgIEBwYXJhbSAgdGFyZ2V0ICBlbGVtZW50IC0gdGhlIHRhcmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuXG5cdCAgIEByZXR1cm4gIG9iamVjdCAtIHRoZSBhc3NvY2lhdGVkIGluc3RhbmNlIGRhdGFcblx0ICAgQHRocm93cyAgZXJyb3IgaWYgYSBqUXVlcnkgcHJvYmxlbSBnZXR0aW5nIGRhdGEgKi9cblx0X2dldEluc3Q6IGZ1bmN0aW9uKHRhcmdldCkge1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gJC5kYXRhKHRhcmdldCwgUFJPUF9OQU1FKTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGVycikge1xuXHRcdFx0dGhyb3cgJ01pc3NpbmcgaW5zdGFuY2UgZGF0YSBmb3IgdGhpcyBkYXRlcGlja2VyJztcblx0XHR9XG5cdH0sXG5cblx0LyogVXBkYXRlIG9yIHJldHJpZXZlIHRoZSBzZXR0aW5ncyBmb3IgYSBkYXRlIHBpY2tlciBhdHRhY2hlZCB0byBhbiBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbi5cblx0ICAgQHBhcmFtICB0YXJnZXQgIGVsZW1lbnQgLSB0aGUgdGFyZ2V0IGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW5cblx0ICAgQHBhcmFtICBuYW1lICAgIG9iamVjdCAtIHRoZSBuZXcgc2V0dGluZ3MgdG8gdXBkYXRlIG9yXG5cdCAgICAgICAgICAgICAgICAgICBzdHJpbmcgLSB0aGUgbmFtZSBvZiB0aGUgc2V0dGluZyB0byBjaGFuZ2Ugb3IgcmV0cmlldmUsXG5cdCAgICAgICAgICAgICAgICAgICB3aGVuIHJldHJpZXZpbmcgYWxzbyAnYWxsJyBmb3IgYWxsIGluc3RhbmNlIHNldHRpbmdzIG9yXG5cdCAgICAgICAgICAgICAgICAgICAnZGVmYXVsdHMnIGZvciBhbGwgZ2xvYmFsIGRlZmF1bHRzXG5cdCAgIEBwYXJhbSAgdmFsdWUgICBhbnkgLSB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc2V0dGluZ1xuXHQgICAgICAgICAgICAgICAgICAgKG9taXQgaWYgYWJvdmUgaXMgYW4gb2JqZWN0IG9yIHRvIHJldHJpZXZlIGEgdmFsdWUpICovXG5cdF9vcHRpb25EYXRlcGlja2VyOiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG5cdFx0dmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMiAmJiB0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIChuYW1lID09ICdkZWZhdWx0cycgPyAkLmV4dGVuZCh7fSwgJC5kYXRlcGlja2VyLl9kZWZhdWx0cykgOlxuXHRcdFx0XHQoaW5zdCA/IChuYW1lID09ICdhbGwnID8gJC5leHRlbmQoe30sIGluc3Quc2V0dGluZ3MpIDpcblx0XHRcdFx0dGhpcy5fZ2V0KGluc3QsIG5hbWUpKSA6IG51bGwpKTtcblx0XHR9XG5cdFx0dmFyIHNldHRpbmdzID0gbmFtZSB8fCB7fTtcblx0XHRpZiAodHlwZW9mIG5hbWUgPT0gJ3N0cmluZycpIHtcblx0XHRcdHNldHRpbmdzID0ge307XG5cdFx0XHRzZXR0aW5nc1tuYW1lXSA9IHZhbHVlO1xuXHRcdH1cblx0XHRpZiAoaW5zdCkge1xuXHRcdFx0aWYgKHRoaXMuX2N1ckluc3QgPT0gaW5zdCkge1xuXHRcdFx0XHR0aGlzLl9oaWRlRGF0ZXBpY2tlcigpO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGRhdGUgPSB0aGlzLl9nZXREYXRlRGF0ZXBpY2tlcih0YXJnZXQsIHRydWUpO1xuXHRcdFx0dmFyIG1pbkRhdGUgPSB0aGlzLl9nZXRNaW5NYXhEYXRlKGluc3QsICdtaW4nKTtcblx0XHRcdHZhciBtYXhEYXRlID0gdGhpcy5fZ2V0TWluTWF4RGF0ZShpbnN0LCAnbWF4Jyk7XG5cdFx0XHRleHRlbmRSZW1vdmUoaW5zdC5zZXR0aW5ncywgc2V0dGluZ3MpO1xuXHRcdFx0Ly8gcmVmb3JtYXQgdGhlIG9sZCBtaW5EYXRlL21heERhdGUgdmFsdWVzIGlmIGRhdGVGb3JtYXQgY2hhbmdlcyBhbmQgYSBuZXcgbWluRGF0ZS9tYXhEYXRlIGlzbid0IHByb3ZpZGVkXG5cdFx0XHRpZiAobWluRGF0ZSAhPT0gbnVsbCAmJiBzZXR0aW5nc1snZGF0ZUZvcm1hdCddICE9PSB1bmRlZmluZWQgJiYgc2V0dGluZ3NbJ21pbkRhdGUnXSA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0XHRpbnN0LnNldHRpbmdzLm1pbkRhdGUgPSB0aGlzLl9mb3JtYXREYXRlKGluc3QsIG1pbkRhdGUpO1xuXHRcdFx0aWYgKG1heERhdGUgIT09IG51bGwgJiYgc2V0dGluZ3NbJ2RhdGVGb3JtYXQnXSAhPT0gdW5kZWZpbmVkICYmIHNldHRpbmdzWydtYXhEYXRlJ10gPT09IHVuZGVmaW5lZClcblx0XHRcdFx0aW5zdC5zZXR0aW5ncy5tYXhEYXRlID0gdGhpcy5fZm9ybWF0RGF0ZShpbnN0LCBtYXhEYXRlKTtcblx0XHRcdHRoaXMuX2F0dGFjaG1lbnRzKCQodGFyZ2V0KSwgaW5zdCk7XG5cdFx0XHR0aGlzLl9hdXRvU2l6ZShpbnN0KTtcblx0XHRcdHRoaXMuX3NldERhdGUoaW5zdCwgZGF0ZSk7XG5cdFx0XHR0aGlzLl91cGRhdGVBbHRlcm5hdGUoaW5zdCk7XG5cdFx0XHR0aGlzLl91cGRhdGVEYXRlcGlja2VyKGluc3QpO1xuXHRcdH1cblx0fSxcblxuXHQvLyBjaGFuZ2UgbWV0aG9kIGRlcHJlY2F0ZWRcblx0X2NoYW5nZURhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcblx0XHR0aGlzLl9vcHRpb25EYXRlcGlja2VyKHRhcmdldCwgbmFtZSwgdmFsdWUpO1xuXHR9LFxuXG5cdC8qIFJlZHJhdyB0aGUgZGF0ZSBwaWNrZXIgYXR0YWNoZWQgdG8gYW4gaW5wdXQgZmllbGQgb3IgZGl2aXNpb24uXG5cdCAgIEBwYXJhbSAgdGFyZ2V0ICBlbGVtZW50IC0gdGhlIHRhcmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuICovXG5cdF9yZWZyZXNoRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0KSB7XG5cdFx0dmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7XG5cdFx0aWYgKGluc3QpIHtcblx0XHRcdHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qIFNldCB0aGUgZGF0ZXMgZm9yIGEgalF1ZXJ5IHNlbGVjdGlvbi5cblx0ICAgQHBhcmFtICB0YXJnZXQgICBlbGVtZW50IC0gdGhlIHRhcmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuXG5cdCAgIEBwYXJhbSAgZGF0ZSAgICAgRGF0ZSAtIHRoZSBuZXcgZGF0ZSAqL1xuXHRfc2V0RGF0ZURhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCwgZGF0ZSkge1xuXHRcdHZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXQpO1xuXHRcdGlmIChpbnN0KSB7XG5cdFx0XHR0aGlzLl9zZXREYXRlKGluc3QsIGRhdGUpO1xuXHRcdFx0dGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTtcblx0XHRcdHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShpbnN0KTtcblx0XHR9XG5cdH0sXG5cblx0LyogR2V0IHRoZSBkYXRlKHMpIGZvciB0aGUgZmlyc3QgZW50cnkgaW4gYSBqUXVlcnkgc2VsZWN0aW9uLlxuXHQgICBAcGFyYW0gIHRhcmdldCAgICAgZWxlbWVudCAtIHRoZSB0YXJnZXQgaW5wdXQgZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhblxuXHQgICBAcGFyYW0gIG5vRGVmYXVsdCAgYm9vbGVhbiAtIHRydWUgaWYgbm8gZGVmYXVsdCBkYXRlIGlzIHRvIGJlIHVzZWRcblx0ICAgQHJldHVybiBEYXRlIC0gdGhlIGN1cnJlbnQgZGF0ZSAqL1xuXHRfZ2V0RGF0ZURhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCwgbm9EZWZhdWx0KSB7XG5cdFx0dmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7XG5cdFx0aWYgKGluc3QgJiYgIWluc3QuaW5saW5lKVxuXHRcdFx0dGhpcy5fc2V0RGF0ZUZyb21GaWVsZChpbnN0LCBub0RlZmF1bHQpO1xuXHRcdHJldHVybiAoaW5zdCA/IHRoaXMuX2dldERhdGUoaW5zdCkgOiBudWxsKTtcblx0fSxcblxuXHQvKiBIYW5kbGUga2V5c3Ryb2tlcy4gKi9cblx0X2RvS2V5RG93bjogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHR2YXIgaW5zdCA9ICQuZGF0ZXBpY2tlci5fZ2V0SW5zdChldmVudC50YXJnZXQpO1xuXHRcdHZhciBoYW5kbGVkID0gdHJ1ZTtcblx0XHR2YXIgaXNSVEwgPSBpbnN0LmRwRGl2LmlzKCcudWktZGF0ZXBpY2tlci1ydGwnKTtcblx0XHRpbnN0Ll9rZXlFdmVudCA9IHRydWU7XG5cdFx0aWYgKCQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcpXG5cdFx0XHRzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcblx0XHRcdFx0Y2FzZSA5OiAkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk7XG5cdFx0XHRcdFx0XHRoYW5kbGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRicmVhazsgLy8gaGlkZSBvbiB0YWIgb3V0XG5cdFx0XHRcdGNhc2UgMTM6IHZhciBzZWwgPSAkKCd0ZC4nICsgJC5kYXRlcGlja2VyLl9kYXlPdmVyQ2xhc3MgKyAnOm5vdCguJyArXG5cdFx0XHRcdFx0XHRcdFx0XHQkLmRhdGVwaWNrZXIuX2N1cnJlbnRDbGFzcyArICcpJywgaW5zdC5kcERpdik7XG5cdFx0XHRcdFx0XHRpZiAoc2VsWzBdKVxuXHRcdFx0XHRcdFx0XHQkLmRhdGVwaWNrZXIuX3NlbGVjdERheShldmVudC50YXJnZXQsIGluc3Quc2VsZWN0ZWRNb250aCwgaW5zdC5zZWxlY3RlZFllYXIsIHNlbFswXSk7XG5cdFx0XHRcdFx0XHRcdHZhciBvblNlbGVjdCA9ICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICdvblNlbGVjdCcpO1xuXHRcdFx0XHRcdFx0XHRpZiAob25TZWxlY3QpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgZGF0ZVN0ciA9ICQuZGF0ZXBpY2tlci5fZm9ybWF0RGF0ZShpbnN0KTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIHRyaWdnZXIgY3VzdG9tIGNhbGxiYWNrXG5cdFx0XHRcdFx0XHRcdFx0b25TZWxlY3QuYXBwbHkoKGluc3QuaW5wdXQgPyBpbnN0LmlucHV0WzBdIDogbnVsbCksIFtkYXRlU3RyLCBpbnN0XSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0JC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlOyAvLyBkb24ndCBzdWJtaXQgdGhlIGZvcm1cblx0XHRcdFx0XHRcdGJyZWFrOyAvLyBzZWxlY3QgdGhlIHZhbHVlIG9uIGVudGVyXG5cdFx0XHRcdGNhc2UgMjc6ICQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTtcblx0XHRcdFx0XHRcdGJyZWFrOyAvLyBoaWRlIG9uIGVzY2FwZVxuXHRcdFx0XHRjYXNlIDMzOiAkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LCAoZXZlbnQuY3RybEtleSA/XG5cdFx0XHRcdFx0XHRcdC0kLmRhdGVwaWNrZXIuX2dldChpbnN0LCAnc3RlcEJpZ01vbnRocycpIDpcblx0XHRcdFx0XHRcdFx0LSQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICdzdGVwTW9udGhzJykpLCAnTScpO1xuXHRcdFx0XHRcdFx0YnJlYWs7IC8vIHByZXZpb3VzIG1vbnRoL3llYXIgb24gcGFnZSB1cC8rIGN0cmxcblx0XHRcdFx0Y2FzZSAzNDogJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGV2ZW50LnRhcmdldCwgKGV2ZW50LmN0cmxLZXkgP1xuXHRcdFx0XHRcdFx0XHQrJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ3N0ZXBCaWdNb250aHMnKSA6XG5cdFx0XHRcdFx0XHRcdCskLmRhdGVwaWNrZXIuX2dldChpbnN0LCAnc3RlcE1vbnRocycpKSwgJ00nKTtcblx0XHRcdFx0XHRcdGJyZWFrOyAvLyBuZXh0IG1vbnRoL3llYXIgb24gcGFnZSBkb3duLysgY3RybFxuXHRcdFx0XHRjYXNlIDM1OiBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAkLmRhdGVwaWNrZXIuX2NsZWFyRGF0ZShldmVudC50YXJnZXQpO1xuXHRcdFx0XHRcdFx0aGFuZGxlZCA9IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleTtcblx0XHRcdFx0XHRcdGJyZWFrOyAvLyBjbGVhciBvbiBjdHJsIG9yIGNvbW1hbmQgK2VuZFxuXHRcdFx0XHRjYXNlIDM2OiBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAkLmRhdGVwaWNrZXIuX2dvdG9Ub2RheShldmVudC50YXJnZXQpO1xuXHRcdFx0XHRcdFx0aGFuZGxlZCA9IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleTtcblx0XHRcdFx0XHRcdGJyZWFrOyAvLyBjdXJyZW50IG9uIGN0cmwgb3IgY29tbWFuZCAraG9tZVxuXHRcdFx0XHRjYXNlIDM3OiBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LCAoaXNSVEwgPyArMSA6IC0xKSwgJ0QnKTtcblx0XHRcdFx0XHRcdGhhbmRsZWQgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXk7XG5cdFx0XHRcdFx0XHQvLyAtMSBkYXkgb24gY3RybCBvciBjb21tYW5kICtsZWZ0XG5cdFx0XHRcdFx0XHRpZiAoZXZlbnQub3JpZ2luYWxFdmVudC5hbHRLZXkpICQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIChldmVudC5jdHJsS2V5ID9cblx0XHRcdFx0XHRcdFx0XHRcdC0kLmRhdGVwaWNrZXIuX2dldChpbnN0LCAnc3RlcEJpZ01vbnRocycpIDpcblx0XHRcdFx0XHRcdFx0XHRcdC0kLmRhdGVwaWNrZXIuX2dldChpbnN0LCAnc3RlcE1vbnRocycpKSwgJ00nKTtcblx0XHRcdFx0XHRcdC8vIG5leHQgbW9udGgveWVhciBvbiBhbHQgK2xlZnQgb24gTWFjXG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAzODogaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGV2ZW50LnRhcmdldCwgLTcsICdEJyk7XG5cdFx0XHRcdFx0XHRoYW5kbGVkID0gZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5O1xuXHRcdFx0XHRcdFx0YnJlYWs7IC8vIC0xIHdlZWsgb24gY3RybCBvciBjb21tYW5kICt1cFxuXHRcdFx0XHRjYXNlIDM5OiBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LCAoaXNSVEwgPyAtMSA6ICsxKSwgJ0QnKTtcblx0XHRcdFx0XHRcdGhhbmRsZWQgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXk7XG5cdFx0XHRcdFx0XHQvLyArMSBkYXkgb24gY3RybCBvciBjb21tYW5kICtyaWdodFxuXHRcdFx0XHRcdFx0aWYgKGV2ZW50Lm9yaWdpbmFsRXZlbnQuYWx0S2V5KSAkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LCAoZXZlbnQuY3RybEtleSA/XG5cdFx0XHRcdFx0XHRcdFx0XHQrJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ3N0ZXBCaWdNb250aHMnKSA6XG5cdFx0XHRcdFx0XHRcdFx0XHQrJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ3N0ZXBNb250aHMnKSksICdNJyk7XG5cdFx0XHRcdFx0XHQvLyBuZXh0IG1vbnRoL3llYXIgb24gYWx0ICtyaWdodFxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgNDA6IGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsICs3LCAnRCcpO1xuXHRcdFx0XHRcdFx0aGFuZGxlZCA9IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleTtcblx0XHRcdFx0XHRcdGJyZWFrOyAvLyArMSB3ZWVrIG9uIGN0cmwgb3IgY29tbWFuZCArZG93blxuXHRcdFx0XHRkZWZhdWx0OiBoYW5kbGVkID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0ZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PSAzNiAmJiBldmVudC5jdHJsS2V5KSAvLyBkaXNwbGF5IHRoZSBkYXRlIHBpY2tlciBvbiBjdHJsK2hvbWVcblx0XHRcdCQuZGF0ZXBpY2tlci5fc2hvd0RhdGVwaWNrZXIodGhpcyk7XG5cdFx0ZWxzZSB7XG5cdFx0XHRoYW5kbGVkID0gZmFsc2U7XG5cdFx0fVxuXHRcdGlmIChoYW5kbGVkKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qIEZpbHRlciBlbnRlcmVkIGNoYXJhY3RlcnMgLSBiYXNlZCBvbiBkYXRlIGZvcm1hdC4gKi9cblx0X2RvS2V5UHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0dmFyIGluc3QgPSAkLmRhdGVwaWNrZXIuX2dldEluc3QoZXZlbnQudGFyZ2V0KTtcblx0XHRpZiAoJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ2NvbnN0cmFpbklucHV0JykpIHtcblx0XHRcdHZhciBjaGFycyA9ICQuZGF0ZXBpY2tlci5fcG9zc2libGVDaGFycygkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAnZGF0ZUZvcm1hdCcpKTtcblx0XHRcdHZhciBjaHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlID09IHVuZGVmaW5lZCA/IGV2ZW50LmtleUNvZGUgOiBldmVudC5jaGFyQ29kZSk7XG5cdFx0XHRyZXR1cm4gZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IChjaHIgPCAnICcgfHwgIWNoYXJzIHx8IGNoYXJzLmluZGV4T2YoY2hyKSA+IC0xKTtcblx0XHR9XG5cdH0sXG5cblx0LyogU3luY2hyb25pc2UgbWFudWFsIGVudHJ5IGFuZCBmaWVsZC9hbHRlcm5hdGUgZmllbGQuICovXG5cdF9kb0tleVVwOiBmdW5jdGlvbihldmVudCkge1xuXHRcdHZhciBpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGV2ZW50LnRhcmdldCk7XG5cdFx0aWYgKGluc3QuaW5wdXQudmFsKCkgIT0gaW5zdC5sYXN0VmFsKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR2YXIgZGF0ZSA9ICQuZGF0ZXBpY2tlci5wYXJzZURhdGUoJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgJ2RhdGVGb3JtYXQnKSxcblx0XHRcdFx0XHQoaW5zdC5pbnB1dCA/IGluc3QuaW5wdXQudmFsKCkgOiBudWxsKSxcblx0XHRcdFx0XHQkLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyhpbnN0KSk7XG5cdFx0XHRcdGlmIChkYXRlKSB7IC8vIG9ubHkgaWYgdmFsaWRcblx0XHRcdFx0XHQkLmRhdGVwaWNrZXIuX3NldERhdGVGcm9tRmllbGQoaW5zdCk7XG5cdFx0XHRcdFx0JC5kYXRlcGlja2VyLl91cGRhdGVBbHRlcm5hdGUoaW5zdCk7XG5cdFx0XHRcdFx0JC5kYXRlcGlja2VyLl91cGRhdGVEYXRlcGlja2VyKGluc3QpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdCQuZGF0ZXBpY2tlci5sb2coZXJyKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0LyogUG9wLXVwIHRoZSBkYXRlIHBpY2tlciBmb3IgYSBnaXZlbiBpbnB1dCBmaWVsZC5cblx0ICAgSWYgZmFsc2UgcmV0dXJuZWQgZnJvbSBiZWZvcmVTaG93IGV2ZW50IGhhbmRsZXIgZG8gbm90IHNob3cuXG5cdCAgIEBwYXJhbSAgaW5wdXQgIGVsZW1lbnQgLSB0aGUgaW5wdXQgZmllbGQgYXR0YWNoZWQgdG8gdGhlIGRhdGUgcGlja2VyIG9yXG5cdCAgICAgICAgICAgICAgICAgIGV2ZW50IC0gaWYgdHJpZ2dlcmVkIGJ5IGZvY3VzICovXG5cdF9zaG93RGF0ZXBpY2tlcjogZnVuY3Rpb24oaW5wdXQpIHtcblx0XHRpbnB1dCA9IGlucHV0LnRhcmdldCB8fCBpbnB1dDtcblx0XHRpZiAoaW5wdXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAnaW5wdXQnKSAvLyBmaW5kIGZyb20gYnV0dG9uL2ltYWdlIHRyaWdnZXJcblx0XHRcdGlucHV0ID0gJCgnaW5wdXQnLCBpbnB1dC5wYXJlbnROb2RlKVswXTtcblx0XHRpZiAoJC5kYXRlcGlja2VyLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihpbnB1dCkgfHwgJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQgPT0gaW5wdXQpIC8vIGFscmVhZHkgaGVyZVxuXHRcdFx0cmV0dXJuO1xuXHRcdHZhciBpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGlucHV0KTtcblx0XHRpZiAoJC5kYXRlcGlja2VyLl9jdXJJbnN0ICYmICQuZGF0ZXBpY2tlci5fY3VySW5zdCAhPSBpbnN0KSB7XG5cdFx0XHQkLmRhdGVwaWNrZXIuX2N1ckluc3QuZHBEaXYuc3RvcCh0cnVlLCB0cnVlKTtcblx0XHRcdGlmICggaW5zdCAmJiAkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nICkge1xuXHRcdFx0XHQkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCAkLmRhdGVwaWNrZXIuX2N1ckluc3QuaW5wdXRbMF0gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dmFyIGJlZm9yZVNob3cgPSAkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAnYmVmb3JlU2hvdycpO1xuXHRcdHZhciBiZWZvcmVTaG93U2V0dGluZ3MgPSBiZWZvcmVTaG93ID8gYmVmb3JlU2hvdy5hcHBseShpbnB1dCwgW2lucHV0LCBpbnN0XSkgOiB7fTtcblx0XHRpZihiZWZvcmVTaG93U2V0dGluZ3MgPT09IGZhbHNlKXtcblx0XHRcdC8vZmFsc2Vcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0ZXh0ZW5kUmVtb3ZlKGluc3Quc2V0dGluZ3MsIGJlZm9yZVNob3dTZXR0aW5ncyk7XG5cdFx0aW5zdC5sYXN0VmFsID0gbnVsbDtcblx0XHQkLmRhdGVwaWNrZXIuX2xhc3RJbnB1dCA9IGlucHV0O1xuXHRcdCQuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZChpbnN0KTtcblx0XHRpZiAoJC5kYXRlcGlja2VyLl9pbkRpYWxvZykgLy8gaGlkZSBjdXJzb3Jcblx0XHRcdGlucHV0LnZhbHVlID0gJyc7XG5cdFx0aWYgKCEkLmRhdGVwaWNrZXIuX3BvcykgeyAvLyBwb3NpdGlvbiBiZWxvdyBpbnB1dFxuXHRcdFx0JC5kYXRlcGlja2VyLl9wb3MgPSAkLmRhdGVwaWNrZXIuX2ZpbmRQb3MoaW5wdXQpO1xuXHRcdFx0JC5kYXRlcGlja2VyLl9wb3NbMV0gKz0gaW5wdXQub2Zmc2V0SGVpZ2h0OyAvLyBhZGQgdGhlIGhlaWdodFxuXHRcdH1cblx0XHR2YXIgaXNGaXhlZCA9IGZhbHNlO1xuXHRcdCQoaW5wdXQpLnBhcmVudHMoKS5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0aXNGaXhlZCB8PSAkKHRoaXMpLmNzcygncG9zaXRpb24nKSA9PSAnZml4ZWQnO1xuXHRcdFx0cmV0dXJuICFpc0ZpeGVkO1xuXHRcdH0pO1xuXHRcdHZhciBvZmZzZXQgPSB7bGVmdDogJC5kYXRlcGlja2VyLl9wb3NbMF0sIHRvcDogJC5kYXRlcGlja2VyLl9wb3NbMV19O1xuXHRcdCQuZGF0ZXBpY2tlci5fcG9zID0gbnVsbDtcblx0XHQvL3RvIGF2b2lkIGZsYXNoZXMgb24gRmlyZWZveFxuXHRcdGluc3QuZHBEaXYuZW1wdHkoKTtcblx0XHQvLyBkZXRlcm1pbmUgc2l6aW5nIG9mZnNjcmVlblxuXHRcdGluc3QuZHBEaXYuY3NzKHtwb3NpdGlvbjogJ2Fic29sdXRlJywgZGlzcGxheTogJ2Jsb2NrJywgdG9wOiAnLTEwMDBweCd9KTtcblx0XHQkLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7XG5cdFx0Ly8gZml4IHdpZHRoIGZvciBkeW5hbWljIG51bWJlciBvZiBkYXRlIHBpY2tlcnNcblx0XHQvLyBhbmQgYWRqdXN0IHBvc2l0aW9uIGJlZm9yZSBzaG93aW5nXG5cdFx0b2Zmc2V0ID0gJC5kYXRlcGlja2VyLl9jaGVja09mZnNldChpbnN0LCBvZmZzZXQsIGlzRml4ZWQpO1xuXHRcdGluc3QuZHBEaXYuY3NzKHtwb3NpdGlvbjogKCQuZGF0ZXBpY2tlci5faW5EaWFsb2cgJiYgJC5ibG9ja1VJID9cblx0XHRcdCdzdGF0aWMnIDogKGlzRml4ZWQgPyAnZml4ZWQnIDogJ2Fic29sdXRlJykpLCBkaXNwbGF5OiAnbm9uZScsXG5cdFx0XHRsZWZ0OiBvZmZzZXQubGVmdCArICdweCcsIHRvcDogb2Zmc2V0LnRvcCArICdweCd9KTtcblx0XHRpZiAoIWluc3QuaW5saW5lKSB7XG5cdFx0XHR2YXIgc2hvd0FuaW0gPSAkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAnc2hvd0FuaW0nKTtcblx0XHRcdHZhciBkdXJhdGlvbiA9ICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICdkdXJhdGlvbicpO1xuXHRcdFx0dmFyIHBvc3RQcm9jZXNzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBjb3ZlciA9IGluc3QuZHBEaXYuZmluZCgnaWZyYW1lLnVpLWRhdGVwaWNrZXItY292ZXInKTsgLy8gSUU2LSBvbmx5XG5cdFx0XHRcdGlmKCAhISBjb3Zlci5sZW5ndGggKXtcblx0XHRcdFx0XHR2YXIgYm9yZGVycyA9ICQuZGF0ZXBpY2tlci5fZ2V0Qm9yZGVycyhpbnN0LmRwRGl2KTtcblx0XHRcdFx0XHRjb3Zlci5jc3Moe2xlZnQ6IC1ib3JkZXJzWzBdLCB0b3A6IC1ib3JkZXJzWzFdLFxuXHRcdFx0XHRcdFx0d2lkdGg6IGluc3QuZHBEaXYub3V0ZXJXaWR0aCgpLCBoZWlnaHQ6IGluc3QuZHBEaXYub3V0ZXJIZWlnaHQoKX0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0aW5zdC5kcERpdi56SW5kZXgoJChpbnB1dCkuekluZGV4KCkrMSk7XG5cdFx0XHQkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nID0gdHJ1ZTtcblxuXHRcdFx0Ly8gREVQUkVDQVRFRDogYWZ0ZXIgQkMgZm9yIDEuOC54ICQuZWZmZWN0c1sgc2hvd0FuaW0gXSBpcyBub3QgbmVlZGVkXG5cdFx0XHRpZiAoICQuZWZmZWN0cyAmJiAoICQuZWZmZWN0cy5lZmZlY3RbIHNob3dBbmltIF0gfHwgJC5lZmZlY3RzWyBzaG93QW5pbSBdICkgKVxuXHRcdFx0XHRpbnN0LmRwRGl2LnNob3coc2hvd0FuaW0sICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICdzaG93T3B0aW9ucycpLCBkdXJhdGlvbiwgcG9zdFByb2Nlc3MpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRpbnN0LmRwRGl2W3Nob3dBbmltIHx8ICdzaG93J10oKHNob3dBbmltID8gZHVyYXRpb24gOiBudWxsKSwgcG9zdFByb2Nlc3MpO1xuXHRcdFx0aWYgKCFzaG93QW5pbSB8fCAhZHVyYXRpb24pXG5cdFx0XHRcdHBvc3RQcm9jZXNzKCk7XG5cdFx0XHRpZiAoaW5zdC5pbnB1dC5pcygnOnZpc2libGUnKSAmJiAhaW5zdC5pbnB1dC5pcygnOmRpc2FibGVkJykpXG5cdFx0XHRcdGluc3QuaW5wdXQuZm9jdXMoKTtcblx0XHRcdCQuZGF0ZXBpY2tlci5fY3VySW5zdCA9IGluc3Q7XG5cdFx0fVxuXHR9LFxuXG5cdC8qIEdlbmVyYXRlIHRoZSBkYXRlIHBpY2tlciBjb250ZW50LiAqL1xuXHRfdXBkYXRlRGF0ZXBpY2tlcjogZnVuY3Rpb24oaW5zdCkge1xuXHRcdHRoaXMubWF4Um93cyA9IDQ7IC8vUmVzZXQgdGhlIG1heCBudW1iZXIgb2Ygcm93cyBiZWluZyBkaXNwbGF5ZWQgKHNlZSAjNzA0Mylcblx0XHR2YXIgYm9yZGVycyA9ICQuZGF0ZXBpY2tlci5fZ2V0Qm9yZGVycyhpbnN0LmRwRGl2KTtcblx0XHRpbnN0QWN0aXZlID0gaW5zdDsgLy8gZm9yIGRlbGVnYXRlIGhvdmVyIGV2ZW50c1xuXHRcdGluc3QuZHBEaXYuZW1wdHkoKS5hcHBlbmQodGhpcy5fZ2VuZXJhdGVIVE1MKGluc3QpKTtcblx0XHR0aGlzLl9hdHRhY2hIYW5kbGVycyhpbnN0KTtcblx0XHR2YXIgY292ZXIgPSBpbnN0LmRwRGl2LmZpbmQoJ2lmcmFtZS51aS1kYXRlcGlja2VyLWNvdmVyJyk7IC8vIElFNi0gb25seVxuXHRcdGlmKCAhIWNvdmVyLmxlbmd0aCApeyAvL2F2b2lkIGNhbGwgdG8gb3V0ZXJYWFhYKCkgd2hlbiBub3QgaW4gSUU2XG5cdFx0XHRjb3Zlci5jc3Moe2xlZnQ6IC1ib3JkZXJzWzBdLCB0b3A6IC1ib3JkZXJzWzFdLCB3aWR0aDogaW5zdC5kcERpdi5vdXRlcldpZHRoKCksIGhlaWdodDogaW5zdC5kcERpdi5vdXRlckhlaWdodCgpfSlcblx0XHR9XG5cdFx0aW5zdC5kcERpdi5maW5kKCcuJyArIHRoaXMuX2RheU92ZXJDbGFzcyArICcgYScpLm1vdXNlb3ZlcigpO1xuXHRcdHZhciBudW1Nb250aHMgPSB0aGlzLl9nZXROdW1iZXJPZk1vbnRocyhpbnN0KTtcblx0XHR2YXIgY29scyA9IG51bU1vbnRoc1sxXTtcblx0XHR2YXIgd2lkdGggPSAxNztcblx0XHRpbnN0LmRwRGl2LnJlbW92ZUNsYXNzKCd1aS1kYXRlcGlja2VyLW11bHRpLTIgdWktZGF0ZXBpY2tlci1tdWx0aS0zIHVpLWRhdGVwaWNrZXItbXVsdGktNCcpLndpZHRoKCcnKTtcblx0XHRpZiAoY29scyA+IDEpXG5cdFx0XHRpbnN0LmRwRGl2LmFkZENsYXNzKCd1aS1kYXRlcGlja2VyLW11bHRpLScgKyBjb2xzKS5jc3MoJ3dpZHRoJywgKHdpZHRoICogY29scykgKyAnZW0nKTtcblx0XHRpbnN0LmRwRGl2WyhudW1Nb250aHNbMF0gIT0gMSB8fCBudW1Nb250aHNbMV0gIT0gMSA/ICdhZGQnIDogJ3JlbW92ZScpICtcblx0XHRcdCdDbGFzcyddKCd1aS1kYXRlcGlja2VyLW11bHRpJyk7XG5cdFx0aW5zdC5kcERpdlsodGhpcy5fZ2V0KGluc3QsICdpc1JUTCcpID8gJ2FkZCcgOiAncmVtb3ZlJykgK1xuXHRcdFx0J0NsYXNzJ10oJ3VpLWRhdGVwaWNrZXItcnRsJyk7XG5cdFx0aWYgKGluc3QgPT0gJC5kYXRlcGlja2VyLl9jdXJJbnN0ICYmICQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcgJiYgaW5zdC5pbnB1dCAmJlxuXHRcdFx0XHQvLyAjNjY5NCAtIGRvbid0IGZvY3VzIHRoZSBpbnB1dCBpZiBpdCdzIGFscmVhZHkgZm9jdXNlZFxuXHRcdFx0XHQvLyB0aGlzIGJyZWFrcyB0aGUgY2hhbmdlIGV2ZW50IGluIElFXG5cdFx0XHRcdGluc3QuaW5wdXQuaXMoJzp2aXNpYmxlJykgJiYgIWluc3QuaW5wdXQuaXMoJzpkaXNhYmxlZCcpICYmIGluc3QuaW5wdXRbMF0gIT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudClcblx0XHRcdGluc3QuaW5wdXQuZm9jdXMoKTtcblx0XHQvLyBkZWZmZXJlZCByZW5kZXIgb2YgdGhlIHllYXJzIHNlbGVjdCAodG8gYXZvaWQgZmxhc2hlcyBvbiBGaXJlZm94KVxuXHRcdGlmKCBpbnN0LnllYXJzaHRtbCApe1xuXHRcdFx0dmFyIG9yaWd5ZWFyc2h0bWwgPSBpbnN0LnllYXJzaHRtbDtcblx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcblx0XHRcdFx0Ly9hc3N1cmUgdGhhdCBpbnN0LnllYXJzaHRtbCBkaWRuJ3QgY2hhbmdlLlxuXHRcdFx0XHRpZiggb3JpZ3llYXJzaHRtbCA9PT0gaW5zdC55ZWFyc2h0bWwgJiYgaW5zdC55ZWFyc2h0bWwgKXtcblx0XHRcdFx0XHRpbnN0LmRwRGl2LmZpbmQoJ3NlbGVjdC51aS1kYXRlcGlja2VyLXllYXI6Zmlyc3QnKS5yZXBsYWNlV2l0aChpbnN0LnllYXJzaHRtbCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b3JpZ3llYXJzaHRtbCA9IGluc3QueWVhcnNodG1sID0gbnVsbDtcblx0XHRcdH0sIDApO1xuXHRcdH1cblx0fSxcblxuXHQvKiBSZXRyaWV2ZSB0aGUgc2l6ZSBvZiBsZWZ0IGFuZCB0b3AgYm9yZGVycyBmb3IgYW4gZWxlbWVudC5cblx0ICAgQHBhcmFtICBlbGVtICAoalF1ZXJ5IG9iamVjdCkgdGhlIGVsZW1lbnQgb2YgaW50ZXJlc3Rcblx0ICAgQHJldHVybiAgKG51bWJlclsyXSkgdGhlIGxlZnQgYW5kIHRvcCBib3JkZXJzICovXG5cdF9nZXRCb3JkZXJzOiBmdW5jdGlvbihlbGVtKSB7XG5cdFx0dmFyIGNvbnZlcnQgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIHt0aGluOiAxLCBtZWRpdW06IDIsIHRoaWNrOiAzfVt2YWx1ZV0gfHwgdmFsdWU7XG5cdFx0fTtcblx0XHRyZXR1cm4gW3BhcnNlRmxvYXQoY29udmVydChlbGVtLmNzcygnYm9yZGVyLWxlZnQtd2lkdGgnKSkpLFxuXHRcdFx0cGFyc2VGbG9hdChjb252ZXJ0KGVsZW0uY3NzKCdib3JkZXItdG9wLXdpZHRoJykpKV07XG5cdH0sXG5cblx0LyogQ2hlY2sgcG9zaXRpb25pbmcgdG8gcmVtYWluIG9uIHNjcmVlbi4gKi9cblx0X2NoZWNrT2Zmc2V0OiBmdW5jdGlvbihpbnN0LCBvZmZzZXQsIGlzRml4ZWQpIHtcblx0XHR2YXIgZHBXaWR0aCA9IGluc3QuZHBEaXYub3V0ZXJXaWR0aCgpO1xuXHRcdHZhciBkcEhlaWdodCA9IGluc3QuZHBEaXYub3V0ZXJIZWlnaHQoKTtcblx0XHR2YXIgaW5wdXRXaWR0aCA9IGluc3QuaW5wdXQgPyBpbnN0LmlucHV0Lm91dGVyV2lkdGgoKSA6IDA7XG5cdFx0dmFyIGlucHV0SGVpZ2h0ID0gaW5zdC5pbnB1dCA/IGluc3QuaW5wdXQub3V0ZXJIZWlnaHQoKSA6IDA7XG5cdFx0dmFyIHZpZXdXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCArIChpc0ZpeGVkID8gMCA6ICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSk7XG5cdFx0dmFyIHZpZXdIZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0ICsgKGlzRml4ZWQgPyAwIDogJChkb2N1bWVudCkuc2Nyb2xsVG9wKCkpO1xuXG5cdFx0b2Zmc2V0LmxlZnQgLT0gKHRoaXMuX2dldChpbnN0LCAnaXNSVEwnKSA/IChkcFdpZHRoIC0gaW5wdXRXaWR0aCkgOiAwKTtcblx0XHRvZmZzZXQubGVmdCAtPSAoaXNGaXhlZCAmJiBvZmZzZXQubGVmdCA9PSBpbnN0LmlucHV0Lm9mZnNldCgpLmxlZnQpID8gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpIDogMDtcblx0XHRvZmZzZXQudG9wIC09IChpc0ZpeGVkICYmIG9mZnNldC50b3AgPT0gKGluc3QuaW5wdXQub2Zmc2V0KCkudG9wICsgaW5wdXRIZWlnaHQpKSA/ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpIDogMDtcblxuXHRcdC8vIG5vdyBjaGVjayBpZiBkYXRlcGlja2VyIGlzIHNob3dpbmcgb3V0c2lkZSB3aW5kb3cgdmlld3BvcnQgLSBtb3ZlIHRvIGEgYmV0dGVyIHBsYWNlIGlmIHNvLlxuXHRcdG9mZnNldC5sZWZ0IC09IE1hdGgubWluKG9mZnNldC5sZWZ0LCAob2Zmc2V0LmxlZnQgKyBkcFdpZHRoID4gdmlld1dpZHRoICYmIHZpZXdXaWR0aCA+IGRwV2lkdGgpID9cblx0XHRcdE1hdGguYWJzKG9mZnNldC5sZWZ0ICsgZHBXaWR0aCAtIHZpZXdXaWR0aCkgOiAwKTtcblx0XHRvZmZzZXQudG9wIC09IE1hdGgubWluKG9mZnNldC50b3AsIChvZmZzZXQudG9wICsgZHBIZWlnaHQgPiB2aWV3SGVpZ2h0ICYmIHZpZXdIZWlnaHQgPiBkcEhlaWdodCkgP1xuXHRcdFx0TWF0aC5hYnMoZHBIZWlnaHQgKyBpbnB1dEhlaWdodCkgOiAwKTtcblxuXHRcdHJldHVybiBvZmZzZXQ7XG5cdH0sXG5cblx0LyogRmluZCBhbiBvYmplY3QncyBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuLiAqL1xuXHRfZmluZFBvczogZnVuY3Rpb24ob2JqKSB7XG5cdFx0dmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KG9iaik7XG5cdFx0dmFyIGlzUlRMID0gdGhpcy5fZ2V0KGluc3QsICdpc1JUTCcpO1xuXHRcdHdoaWxlIChvYmogJiYgKG9iai50eXBlID09ICdoaWRkZW4nIHx8IG9iai5ub2RlVHlwZSAhPSAxIHx8ICQuZXhwci5maWx0ZXJzLmhpZGRlbihvYmopKSkge1xuXHRcdFx0b2JqID0gb2JqW2lzUlRMID8gJ3ByZXZpb3VzU2libGluZycgOiAnbmV4dFNpYmxpbmcnXTtcblx0XHR9XG5cdFx0dmFyIHBvc2l0aW9uID0gJChvYmopLm9mZnNldCgpO1xuXHRcdHJldHVybiBbcG9zaXRpb24ubGVmdCwgcG9zaXRpb24udG9wXTtcblx0fSxcblxuXHQvKiBIaWRlIHRoZSBkYXRlIHBpY2tlciBmcm9tIHZpZXcuXG5cdCAgIEBwYXJhbSAgaW5wdXQgIGVsZW1lbnQgLSB0aGUgaW5wdXQgZmllbGQgYXR0YWNoZWQgdG8gdGhlIGRhdGUgcGlja2VyICovXG5cdF9oaWRlRGF0ZXBpY2tlcjogZnVuY3Rpb24oaW5wdXQpIHtcblx0XHR2YXIgaW5zdCA9IHRoaXMuX2N1ckluc3Q7XG5cdFx0aWYgKCFpbnN0IHx8IChpbnB1dCAmJiBpbnN0ICE9ICQuZGF0YShpbnB1dCwgUFJPUF9OQU1FKSkpXG5cdFx0XHRyZXR1cm47XG5cdFx0aWYgKHRoaXMuX2RhdGVwaWNrZXJTaG93aW5nKSB7XG5cdFx0XHR2YXIgc2hvd0FuaW0gPSB0aGlzLl9nZXQoaW5zdCwgJ3Nob3dBbmltJyk7XG5cdFx0XHR2YXIgZHVyYXRpb24gPSB0aGlzLl9nZXQoaW5zdCwgJ2R1cmF0aW9uJyk7XG5cdFx0XHR2YXIgcG9zdFByb2Nlc3MgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0JC5kYXRlcGlja2VyLl90aWR5RGlhbG9nKGluc3QpO1xuXHRcdFx0fTtcblxuXHRcdFx0Ly8gREVQUkVDQVRFRDogYWZ0ZXIgQkMgZm9yIDEuOC54ICQuZWZmZWN0c1sgc2hvd0FuaW0gXSBpcyBub3QgbmVlZGVkXG5cdFx0XHRpZiAoICQuZWZmZWN0cyAmJiAoICQuZWZmZWN0cy5lZmZlY3RbIHNob3dBbmltIF0gfHwgJC5lZmZlY3RzWyBzaG93QW5pbSBdICkgKVxuXHRcdFx0XHRpbnN0LmRwRGl2LmhpZGUoc2hvd0FuaW0sICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICdzaG93T3B0aW9ucycpLCBkdXJhdGlvbiwgcG9zdFByb2Nlc3MpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRpbnN0LmRwRGl2WyhzaG93QW5pbSA9PSAnc2xpZGVEb3duJyA/ICdzbGlkZVVwJyA6XG5cdFx0XHRcdFx0KHNob3dBbmltID09ICdmYWRlSW4nID8gJ2ZhZGVPdXQnIDogJ2hpZGUnKSldKChzaG93QW5pbSA/IGR1cmF0aW9uIDogbnVsbCksIHBvc3RQcm9jZXNzKTtcblx0XHRcdGlmICghc2hvd0FuaW0pXG5cdFx0XHRcdHBvc3RQcm9jZXNzKCk7XG5cdFx0XHR0aGlzLl9kYXRlcGlja2VyU2hvd2luZyA9IGZhbHNlO1xuXHRcdFx0dmFyIG9uQ2xvc2UgPSB0aGlzLl9nZXQoaW5zdCwgJ29uQ2xvc2UnKTtcblx0XHRcdGlmIChvbkNsb3NlKVxuXHRcdFx0XHRvbkNsb3NlLmFwcGx5KChpbnN0LmlucHV0ID8gaW5zdC5pbnB1dFswXSA6IG51bGwpLFxuXHRcdFx0XHRcdFsoaW5zdC5pbnB1dCA/IGluc3QuaW5wdXQudmFsKCkgOiAnJyksIGluc3RdKTtcblx0XHRcdHRoaXMuX2xhc3RJbnB1dCA9IG51bGw7XG5cdFx0XHRpZiAodGhpcy5faW5EaWFsb2cpIHtcblx0XHRcdFx0dGhpcy5fZGlhbG9nSW5wdXQuY3NzKHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIGxlZnQ6ICcwJywgdG9wOiAnLTEwMHB4JyB9KTtcblx0XHRcdFx0aWYgKCQuYmxvY2tVSSkge1xuXHRcdFx0XHRcdCQudW5ibG9ja1VJKCk7XG5cdFx0XHRcdFx0JCgnYm9keScpLmFwcGVuZCh0aGlzLmRwRGl2KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5faW5EaWFsb2cgPSBmYWxzZTtcblx0XHR9XG5cdH0sXG5cblx0LyogVGlkeSB1cCBhZnRlciBhIGRpYWxvZyBkaXNwbGF5LiAqL1xuXHRfdGlkeURpYWxvZzogZnVuY3Rpb24oaW5zdCkge1xuXHRcdGluc3QuZHBEaXYucmVtb3ZlQ2xhc3ModGhpcy5fZGlhbG9nQ2xhc3MpLnVuYmluZCgnLnVpLWRhdGVwaWNrZXItY2FsZW5kYXInKTtcblx0fSxcblxuXHQvKiBDbG9zZSBkYXRlIHBpY2tlciBpZiBjbGlja2VkIGVsc2V3aGVyZS4gKi9cblx0X2NoZWNrRXh0ZXJuYWxDbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRpZiAoISQuZGF0ZXBpY2tlci5fY3VySW5zdClcblx0XHRcdHJldHVybjtcblxuXHRcdHZhciAkdGFyZ2V0ID0gJChldmVudC50YXJnZXQpLFxuXHRcdFx0aW5zdCA9ICQuZGF0ZXBpY2tlci5fZ2V0SW5zdCgkdGFyZ2V0WzBdKTtcblxuXHRcdGlmICggKCAoICR0YXJnZXRbMF0uaWQgIT0gJC5kYXRlcGlja2VyLl9tYWluRGl2SWQgJiZcblx0XHRcdFx0JHRhcmdldC5wYXJlbnRzKCcjJyArICQuZGF0ZXBpY2tlci5fbWFpbkRpdklkKS5sZW5ndGggPT0gMCAmJlxuXHRcdFx0XHQhJHRhcmdldC5oYXNDbGFzcygkLmRhdGVwaWNrZXIubWFya2VyQ2xhc3NOYW1lKSAmJlxuXHRcdFx0XHQhJHRhcmdldC5jbG9zZXN0KFwiLlwiICsgJC5kYXRlcGlja2VyLl90cmlnZ2VyQ2xhc3MpLmxlbmd0aCAmJlxuXHRcdFx0XHQkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nICYmICEoJC5kYXRlcGlja2VyLl9pbkRpYWxvZyAmJiAkLmJsb2NrVUkpICkgKSB8fFxuXHRcdFx0KCAkdGFyZ2V0Lmhhc0NsYXNzKCQuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpICYmICQuZGF0ZXBpY2tlci5fY3VySW5zdCAhPSBpbnN0ICkgKVxuXHRcdFx0JC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpO1xuXHR9LFxuXG5cdC8qIEFkanVzdCBvbmUgb2YgdGhlIGRhdGUgc3ViLWZpZWxkcy4gKi9cblx0X2FkanVzdERhdGU6IGZ1bmN0aW9uKGlkLCBvZmZzZXQsIHBlcmlvZCkge1xuXHRcdHZhciB0YXJnZXQgPSAkKGlkKTtcblx0XHR2YXIgaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0WzBdKTtcblx0XHRpZiAodGhpcy5faXNEaXNhYmxlZERhdGVwaWNrZXIodGFyZ2V0WzBdKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLl9hZGp1c3RJbnN0RGF0ZShpbnN0LCBvZmZzZXQgK1xuXHRcdFx0KHBlcmlvZCA9PSAnTScgPyB0aGlzLl9nZXQoaW5zdCwgJ3Nob3dDdXJyZW50QXRQb3MnKSA6IDApLCAvLyB1bmRvIHBvc2l0aW9uaW5nXG5cdFx0XHRwZXJpb2QpO1xuXHRcdHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7XG5cdH0sXG5cblx0LyogQWN0aW9uIGZvciBjdXJyZW50IGxpbmsuICovXG5cdF9nb3RvVG9kYXk6IGZ1bmN0aW9uKGlkKSB7XG5cdFx0dmFyIHRhcmdldCA9ICQoaWQpO1xuXHRcdHZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0pO1xuXHRcdGlmICh0aGlzLl9nZXQoaW5zdCwgJ2dvdG9DdXJyZW50JykgJiYgaW5zdC5jdXJyZW50RGF5KSB7XG5cdFx0XHRpbnN0LnNlbGVjdGVkRGF5ID0gaW5zdC5jdXJyZW50RGF5O1xuXHRcdFx0aW5zdC5kcmF3TW9udGggPSBpbnN0LnNlbGVjdGVkTW9udGggPSBpbnN0LmN1cnJlbnRNb250aDtcblx0XHRcdGluc3QuZHJhd1llYXIgPSBpbnN0LnNlbGVjdGVkWWVhciA9IGluc3QuY3VycmVudFllYXI7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xuXHRcdFx0aW5zdC5zZWxlY3RlZERheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuXHRcdFx0aW5zdC5kcmF3TW9udGggPSBpbnN0LnNlbGVjdGVkTW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG5cdFx0XHRpbnN0LmRyYXdZZWFyID0gaW5zdC5zZWxlY3RlZFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cdFx0fVxuXHRcdHRoaXMuX25vdGlmeUNoYW5nZShpbnN0KTtcblx0XHR0aGlzLl9hZGp1c3REYXRlKHRhcmdldCk7XG5cdH0sXG5cblx0LyogQWN0aW9uIGZvciBzZWxlY3RpbmcgYSBuZXcgbW9udGgveWVhci4gKi9cblx0X3NlbGVjdE1vbnRoWWVhcjogZnVuY3Rpb24oaWQsIHNlbGVjdCwgcGVyaW9kKSB7XG5cdFx0dmFyIHRhcmdldCA9ICQoaWQpO1xuXHRcdHZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0pO1xuXHRcdGluc3RbJ3NlbGVjdGVkJyArIChwZXJpb2QgPT0gJ00nID8gJ01vbnRoJyA6ICdZZWFyJyldID1cblx0XHRpbnN0WydkcmF3JyArIChwZXJpb2QgPT0gJ00nID8gJ01vbnRoJyA6ICdZZWFyJyldID1cblx0XHRcdHBhcnNlSW50KHNlbGVjdC5vcHRpb25zW3NlbGVjdC5zZWxlY3RlZEluZGV4XS52YWx1ZSwxMCk7XG5cdFx0dGhpcy5fbm90aWZ5Q2hhbmdlKGluc3QpO1xuXHRcdHRoaXMuX2FkanVzdERhdGUodGFyZ2V0KTtcblx0fSxcblxuXHQvKiBBY3Rpb24gZm9yIHNlbGVjdGluZyBhIGRheS4gKi9cblx0X3NlbGVjdERheTogZnVuY3Rpb24oaWQsIG1vbnRoLCB5ZWFyLCB0ZCkge1xuXHRcdHZhciB0YXJnZXQgPSAkKGlkKTtcblx0XHRpZiAoJCh0ZCkuaGFzQ2xhc3ModGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MpIHx8IHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKHRhcmdldFswXSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldFswXSk7XG5cdFx0aW5zdC5zZWxlY3RlZERheSA9IGluc3QuY3VycmVudERheSA9ICQoJ2EnLCB0ZCkuaHRtbCgpO1xuXHRcdGluc3Quc2VsZWN0ZWRNb250aCA9IGluc3QuY3VycmVudE1vbnRoID0gbW9udGg7XG5cdFx0aW5zdC5zZWxlY3RlZFllYXIgPSBpbnN0LmN1cnJlbnRZZWFyID0geWVhcjtcblx0XHR0aGlzLl9zZWxlY3REYXRlKGlkLCB0aGlzLl9mb3JtYXREYXRlKGluc3QsXG5cdFx0XHRpbnN0LmN1cnJlbnREYXksIGluc3QuY3VycmVudE1vbnRoLCBpbnN0LmN1cnJlbnRZZWFyKSk7XG5cdH0sXG5cblx0LyogRXJhc2UgdGhlIGlucHV0IGZpZWxkIGFuZCBoaWRlIHRoZSBkYXRlIHBpY2tlci4gKi9cblx0X2NsZWFyRGF0ZTogZnVuY3Rpb24oaWQpIHtcblx0XHR2YXIgdGFyZ2V0ID0gJChpZCk7XG5cdFx0dmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldFswXSk7XG5cdFx0dGhpcy5fc2VsZWN0RGF0ZSh0YXJnZXQsICcnKTtcblx0fSxcblxuXHQvKiBVcGRhdGUgdGhlIGlucHV0IGZpZWxkIHdpdGggdGhlIHNlbGVjdGVkIGRhdGUuICovXG5cdF9zZWxlY3REYXRlOiBmdW5jdGlvbihpZCwgZGF0ZVN0cikge1xuXHRcdHZhciB0YXJnZXQgPSAkKGlkKTtcblx0XHR2YXIgaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0WzBdKTtcblx0XHRkYXRlU3RyID0gKGRhdGVTdHIgIT0gbnVsbCA/IGRhdGVTdHIgOiB0aGlzLl9mb3JtYXREYXRlKGluc3QpKTtcblx0XHRpZiAoaW5zdC5pbnB1dClcblx0XHRcdGluc3QuaW5wdXQudmFsKGRhdGVTdHIpO1xuXHRcdHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShpbnN0KTtcblx0XHR2YXIgb25TZWxlY3QgPSB0aGlzLl9nZXQoaW5zdCwgJ29uU2VsZWN0Jyk7XG5cdFx0aWYgKG9uU2VsZWN0KVxuXHRcdFx0b25TZWxlY3QuYXBwbHkoKGluc3QuaW5wdXQgPyBpbnN0LmlucHV0WzBdIDogbnVsbCksIFtkYXRlU3RyLCBpbnN0XSk7ICAvLyB0cmlnZ2VyIGN1c3RvbSBjYWxsYmFja1xuXHRcdGVsc2UgaWYgKGluc3QuaW5wdXQpXG5cdFx0XHRpbnN0LmlucHV0LnRyaWdnZXIoJ2NoYW5nZScpOyAvLyBmaXJlIHRoZSBjaGFuZ2UgZXZlbnRcblx0XHRpZiAoaW5zdC5pbmxpbmUpXG5cdFx0XHR0aGlzLl91cGRhdGVEYXRlcGlja2VyKGluc3QpO1xuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5faGlkZURhdGVwaWNrZXIoKTtcblx0XHRcdHRoaXMuX2xhc3RJbnB1dCA9IGluc3QuaW5wdXRbMF07XG5cdFx0XHRpZiAodHlwZW9mKGluc3QuaW5wdXRbMF0pICE9ICdvYmplY3QnKVxuXHRcdFx0XHRpbnN0LmlucHV0LmZvY3VzKCk7IC8vIHJlc3RvcmUgZm9jdXNcblx0XHRcdHRoaXMuX2xhc3RJbnB1dCA9IG51bGw7XG5cdFx0fVxuXHR9LFxuXG5cdC8qIFVwZGF0ZSBhbnkgYWx0ZXJuYXRlIGZpZWxkIHRvIHN5bmNocm9uaXNlIHdpdGggdGhlIG1haW4gZmllbGQuICovXG5cdF91cGRhdGVBbHRlcm5hdGU6IGZ1bmN0aW9uKGluc3QpIHtcblx0XHR2YXIgYWx0RmllbGQgPSB0aGlzLl9nZXQoaW5zdCwgJ2FsdEZpZWxkJyk7XG5cdFx0aWYgKGFsdEZpZWxkKSB7IC8vIHVwZGF0ZSBhbHRlcm5hdGUgZmllbGQgdG9vXG5cdFx0XHR2YXIgYWx0Rm9ybWF0ID0gdGhpcy5fZ2V0KGluc3QsICdhbHRGb3JtYXQnKSB8fCB0aGlzLl9nZXQoaW5zdCwgJ2RhdGVGb3JtYXQnKTtcblx0XHRcdHZhciBkYXRlID0gdGhpcy5fZ2V0RGF0ZShpbnN0KTtcblx0XHRcdHZhciBkYXRlU3RyID0gdGhpcy5mb3JtYXREYXRlKGFsdEZvcm1hdCwgZGF0ZSwgdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGluc3QpKTtcblx0XHRcdCQoYWx0RmllbGQpLmVhY2goZnVuY3Rpb24oKSB7ICQodGhpcykudmFsKGRhdGVTdHIpOyB9KTtcblx0XHR9XG5cdH0sXG5cblx0LyogU2V0IGFzIGJlZm9yZVNob3dEYXkgZnVuY3Rpb24gdG8gcHJldmVudCBzZWxlY3Rpb24gb2Ygd2Vla2VuZHMuXG5cdCAgIEBwYXJhbSAgZGF0ZSAgRGF0ZSAtIHRoZSBkYXRlIHRvIGN1c3RvbWlzZVxuXHQgICBAcmV0dXJuIFtib29sZWFuLCBzdHJpbmddIC0gaXMgdGhpcyBkYXRlIHNlbGVjdGFibGU/LCB3aGF0IGlzIGl0cyBDU1MgY2xhc3M/ICovXG5cdG5vV2Vla2VuZHM6IGZ1bmN0aW9uKGRhdGUpIHtcblx0XHR2YXIgZGF5ID0gZGF0ZS5nZXREYXkoKTtcblx0XHRyZXR1cm4gWyhkYXkgPiAwICYmIGRheSA8IDYpLCAnJ107XG5cdH0sXG5cblx0LyogU2V0IGFzIGNhbGN1bGF0ZVdlZWsgdG8gZGV0ZXJtaW5lIHRoZSB3ZWVrIG9mIHRoZSB5ZWFyIGJhc2VkIG9uIHRoZSBJU08gODYwMSBkZWZpbml0aW9uLlxuXHQgICBAcGFyYW0gIGRhdGUgIERhdGUgLSB0aGUgZGF0ZSB0byBnZXQgdGhlIHdlZWsgZm9yXG5cdCAgIEByZXR1cm4gIG51bWJlciAtIHRoZSBudW1iZXIgb2YgdGhlIHdlZWsgd2l0aGluIHRoZSB5ZWFyIHRoYXQgY29udGFpbnMgdGhpcyBkYXRlICovXG5cdGlzbzg2MDFXZWVrOiBmdW5jdGlvbihkYXRlKSB7XG5cdFx0dmFyIGNoZWNrRGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTtcblx0XHQvLyBGaW5kIFRodXJzZGF5IG9mIHRoaXMgd2VlayBzdGFydGluZyBvbiBNb25kYXlcblx0XHRjaGVja0RhdGUuc2V0RGF0ZShjaGVja0RhdGUuZ2V0RGF0ZSgpICsgNCAtIChjaGVja0RhdGUuZ2V0RGF5KCkgfHwgNykpO1xuXHRcdHZhciB0aW1lID0gY2hlY2tEYXRlLmdldFRpbWUoKTtcblx0XHRjaGVja0RhdGUuc2V0TW9udGgoMCk7IC8vIENvbXBhcmUgd2l0aCBKYW4gMVxuXHRcdGNoZWNrRGF0ZS5zZXREYXRlKDEpO1xuXHRcdHJldHVybiBNYXRoLmZsb29yKE1hdGgucm91bmQoKHRpbWUgLSBjaGVja0RhdGUpIC8gODY0MDAwMDApIC8gNykgKyAxO1xuXHR9LFxuXG5cdC8qIFBhcnNlIGEgc3RyaW5nIHZhbHVlIGludG8gYSBkYXRlIG9iamVjdC5cblx0ICAgU2VlIGZvcm1hdERhdGUgYmVsb3cgZm9yIHRoZSBwb3NzaWJsZSBmb3JtYXRzLlxuXG5cdCAgIEBwYXJhbSAgZm9ybWF0ICAgIHN0cmluZyAtIHRoZSBleHBlY3RlZCBmb3JtYXQgb2YgdGhlIGRhdGVcblx0ICAgQHBhcmFtICB2YWx1ZSAgICAgc3RyaW5nIC0gdGhlIGRhdGUgaW4gdGhlIGFib3ZlIGZvcm1hdFxuXHQgICBAcGFyYW0gIHNldHRpbmdzICBPYmplY3QgLSBhdHRyaWJ1dGVzIGluY2x1ZGU6XG5cdCAgICAgICAgICAgICAgICAgICAgIHNob3J0WWVhckN1dG9mZiAgbnVtYmVyIC0gdGhlIGN1dG9mZiB5ZWFyIGZvciBkZXRlcm1pbmluZyB0aGUgY2VudHVyeSAob3B0aW9uYWwpXG5cdCAgICAgICAgICAgICAgICAgICAgIGRheU5hbWVzU2hvcnQgICAgc3RyaW5nWzddIC0gYWJicmV2aWF0ZWQgbmFtZXMgb2YgdGhlIGRheXMgZnJvbSBTdW5kYXkgKG9wdGlvbmFsKVxuXHQgICAgICAgICAgICAgICAgICAgICBkYXlOYW1lcyAgICAgICAgIHN0cmluZ1s3XSAtIG5hbWVzIG9mIHRoZSBkYXlzIGZyb20gU3VuZGF5IChvcHRpb25hbClcblx0ICAgICAgICAgICAgICAgICAgICAgbW9udGhOYW1lc1Nob3J0ICBzdHJpbmdbMTJdIC0gYWJicmV2aWF0ZWQgbmFtZXMgb2YgdGhlIG1vbnRocyAob3B0aW9uYWwpXG5cdCAgICAgICAgICAgICAgICAgICAgIG1vbnRoTmFtZXMgICAgICAgc3RyaW5nWzEyXSAtIG5hbWVzIG9mIHRoZSBtb250aHMgKG9wdGlvbmFsKVxuXHQgICBAcmV0dXJuICBEYXRlIC0gdGhlIGV4dHJhY3RlZCBkYXRlIHZhbHVlIG9yIG51bGwgaWYgdmFsdWUgaXMgYmxhbmsgKi9cblx0cGFyc2VEYXRlOiBmdW5jdGlvbiAoZm9ybWF0LCB2YWx1ZSwgc2V0dGluZ3MpIHtcblx0XHRpZiAoZm9ybWF0ID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbClcblx0XHRcdHRocm93ICdJbnZhbGlkIGFyZ3VtZW50cyc7XG5cdFx0dmFsdWUgPSAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnID8gdmFsdWUudG9TdHJpbmcoKSA6IHZhbHVlICsgJycpO1xuXHRcdGlmICh2YWx1ZSA9PSAnJylcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdHZhciBzaG9ydFllYXJDdXRvZmYgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5zaG9ydFllYXJDdXRvZmYgOiBudWxsKSB8fCB0aGlzLl9kZWZhdWx0cy5zaG9ydFllYXJDdXRvZmY7XG5cdFx0c2hvcnRZZWFyQ3V0b2ZmID0gKHR5cGVvZiBzaG9ydFllYXJDdXRvZmYgIT0gJ3N0cmluZycgPyBzaG9ydFllYXJDdXRvZmYgOlxuXHRcdFx0XHRuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgJSAxMDAgKyBwYXJzZUludChzaG9ydFllYXJDdXRvZmYsIDEwKSk7XG5cdFx0dmFyIGRheU5hbWVzU2hvcnQgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5kYXlOYW1lc1Nob3J0IDogbnVsbCkgfHwgdGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydDtcblx0XHR2YXIgZGF5TmFtZXMgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5kYXlOYW1lcyA6IG51bGwpIHx8IHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzO1xuXHRcdHZhciBtb250aE5hbWVzU2hvcnQgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5tb250aE5hbWVzU2hvcnQgOiBudWxsKSB8fCB0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzU2hvcnQ7XG5cdFx0dmFyIG1vbnRoTmFtZXMgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5tb250aE5hbWVzIDogbnVsbCkgfHwgdGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcztcblx0XHR2YXIgeWVhciA9IC0xO1xuXHRcdHZhciBtb250aCA9IC0xO1xuXHRcdHZhciBkYXkgPSAtMTtcblx0XHR2YXIgZG95ID0gLTE7XG5cdFx0dmFyIGxpdGVyYWwgPSBmYWxzZTtcblx0XHQvLyBDaGVjayB3aGV0aGVyIGEgZm9ybWF0IGNoYXJhY3RlciBpcyBkb3VibGVkXG5cdFx0dmFyIGxvb2tBaGVhZCA9IGZ1bmN0aW9uKG1hdGNoKSB7XG5cdFx0XHR2YXIgbWF0Y2hlcyA9IChpRm9ybWF0ICsgMSA8IGZvcm1hdC5sZW5ndGggJiYgZm9ybWF0LmNoYXJBdChpRm9ybWF0ICsgMSkgPT0gbWF0Y2gpO1xuXHRcdFx0aWYgKG1hdGNoZXMpXG5cdFx0XHRcdGlGb3JtYXQrKztcblx0XHRcdHJldHVybiBtYXRjaGVzO1xuXHRcdH07XG5cdFx0Ly8gRXh0cmFjdCBhIG51bWJlciBmcm9tIHRoZSBzdHJpbmcgdmFsdWVcblx0XHR2YXIgZ2V0TnVtYmVyID0gZnVuY3Rpb24obWF0Y2gpIHtcblx0XHRcdHZhciBpc0RvdWJsZWQgPSBsb29rQWhlYWQobWF0Y2gpO1xuXHRcdFx0dmFyIHNpemUgPSAobWF0Y2ggPT0gJ0AnID8gMTQgOiAobWF0Y2ggPT0gJyEnID8gMjAgOlxuXHRcdFx0XHQobWF0Y2ggPT0gJ3knICYmIGlzRG91YmxlZCA/IDQgOiAobWF0Y2ggPT0gJ28nID8gMyA6IDIpKSkpO1xuXHRcdFx0dmFyIGRpZ2l0cyA9IG5ldyBSZWdFeHAoJ15cXFxcZHsxLCcgKyBzaXplICsgJ30nKTtcblx0XHRcdHZhciBudW0gPSB2YWx1ZS5zdWJzdHJpbmcoaVZhbHVlKS5tYXRjaChkaWdpdHMpO1xuXHRcdFx0aWYgKCFudW0pXG5cdFx0XHRcdHRocm93ICdNaXNzaW5nIG51bWJlciBhdCBwb3NpdGlvbiAnICsgaVZhbHVlO1xuXHRcdFx0aVZhbHVlICs9IG51bVswXS5sZW5ndGg7XG5cdFx0XHRyZXR1cm4gcGFyc2VJbnQobnVtWzBdLCAxMCk7XG5cdFx0fTtcblx0XHQvLyBFeHRyYWN0IGEgbmFtZSBmcm9tIHRoZSBzdHJpbmcgdmFsdWUgYW5kIGNvbnZlcnQgdG8gYW4gaW5kZXhcblx0XHR2YXIgZ2V0TmFtZSA9IGZ1bmN0aW9uKG1hdGNoLCBzaG9ydE5hbWVzLCBsb25nTmFtZXMpIHtcblx0XHRcdHZhciBuYW1lcyA9ICQubWFwKGxvb2tBaGVhZChtYXRjaCkgPyBsb25nTmFtZXMgOiBzaG9ydE5hbWVzLCBmdW5jdGlvbiAodiwgaykge1xuXHRcdFx0XHRyZXR1cm4gWyBbaywgdl0gXTtcblx0XHRcdH0pLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcblx0XHRcdFx0cmV0dXJuIC0oYVsxXS5sZW5ndGggLSBiWzFdLmxlbmd0aCk7XG5cdFx0XHR9KTtcblx0XHRcdHZhciBpbmRleCA9IC0xO1xuXHRcdFx0JC5lYWNoKG5hbWVzLCBmdW5jdGlvbiAoaSwgcGFpcikge1xuXHRcdFx0XHR2YXIgbmFtZSA9IHBhaXJbMV07XG5cdFx0XHRcdGlmICh2YWx1ZS5zdWJzdHIoaVZhbHVlLCBuYW1lLmxlbmd0aCkudG9Mb3dlckNhc2UoKSA9PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHtcblx0XHRcdFx0XHRpbmRleCA9IHBhaXJbMF07XG5cdFx0XHRcdFx0aVZhbHVlICs9IG5hbWUubGVuZ3RoO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRpZiAoaW5kZXggIT0gLTEpXG5cdFx0XHRcdHJldHVybiBpbmRleCArIDE7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRocm93ICdVbmtub3duIG5hbWUgYXQgcG9zaXRpb24gJyArIGlWYWx1ZTtcblx0XHR9O1xuXHRcdC8vIENvbmZpcm0gdGhhdCBhIGxpdGVyYWwgY2hhcmFjdGVyIG1hdGNoZXMgdGhlIHN0cmluZyB2YWx1ZVxuXHRcdHZhciBjaGVja0xpdGVyYWwgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICh2YWx1ZS5jaGFyQXQoaVZhbHVlKSAhPSBmb3JtYXQuY2hhckF0KGlGb3JtYXQpKVxuXHRcdFx0XHR0aHJvdyAnVW5leHBlY3RlZCBsaXRlcmFsIGF0IHBvc2l0aW9uICcgKyBpVmFsdWU7XG5cdFx0XHRpVmFsdWUrKztcblx0XHR9O1xuXHRcdHZhciBpVmFsdWUgPSAwO1xuXHRcdGZvciAodmFyIGlGb3JtYXQgPSAwOyBpRm9ybWF0IDwgZm9ybWF0Lmxlbmd0aDsgaUZvcm1hdCsrKSB7XG5cdFx0XHRpZiAobGl0ZXJhbClcblx0XHRcdFx0aWYgKGZvcm1hdC5jaGFyQXQoaUZvcm1hdCkgPT0gXCInXCIgJiYgIWxvb2tBaGVhZChcIidcIikpXG5cdFx0XHRcdFx0bGl0ZXJhbCA9IGZhbHNlO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0Y2hlY2tMaXRlcmFsKCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHN3aXRjaCAoZm9ybWF0LmNoYXJBdChpRm9ybWF0KSkge1xuXHRcdFx0XHRcdGNhc2UgJ2QnOlxuXHRcdFx0XHRcdFx0ZGF5ID0gZ2V0TnVtYmVyKCdkJyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdEJzpcblx0XHRcdFx0XHRcdGdldE5hbWUoJ0QnLCBkYXlOYW1lc1Nob3J0LCBkYXlOYW1lcyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdvJzpcblx0XHRcdFx0XHRcdGRveSA9IGdldE51bWJlcignbycpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbSc6XG5cdFx0XHRcdFx0XHRtb250aCA9IGdldE51bWJlcignbScpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnTSc6XG5cdFx0XHRcdFx0XHRtb250aCA9IGdldE5hbWUoJ00nLCBtb250aE5hbWVzU2hvcnQsIG1vbnRoTmFtZXMpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAneSc6XG5cdFx0XHRcdFx0XHR5ZWFyID0gZ2V0TnVtYmVyKCd5Jyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdAJzpcblx0XHRcdFx0XHRcdHZhciBkYXRlID0gbmV3IERhdGUoZ2V0TnVtYmVyKCdAJykpO1xuXHRcdFx0XHRcdFx0eWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0XHRcdFx0XHRcdG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTtcblx0XHRcdFx0XHRcdGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnISc6XG5cdFx0XHRcdFx0XHR2YXIgZGF0ZSA9IG5ldyBEYXRlKChnZXROdW1iZXIoJyEnKSAtIHRoaXMuX3RpY2tzVG8xOTcwKSAvIDEwMDAwKTtcblx0XHRcdFx0XHRcdHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cdFx0XHRcdFx0XHRtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XG5cdFx0XHRcdFx0XHRkYXkgPSBkYXRlLmdldERhdGUoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCInXCI6XG5cdFx0XHRcdFx0XHRpZiAobG9va0FoZWFkKFwiJ1wiKSlcblx0XHRcdFx0XHRcdFx0Y2hlY2tMaXRlcmFsKCk7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdGxpdGVyYWwgPSB0cnVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGNoZWNrTGl0ZXJhbCgpO1xuXHRcdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChpVmFsdWUgPCB2YWx1ZS5sZW5ndGgpe1xuXHRcdFx0dmFyIGV4dHJhID0gdmFsdWUuc3Vic3RyKGlWYWx1ZSk7XG5cdFx0XHRpZiAoIS9eXFxzKy8udGVzdChleHRyYSkpIHtcblx0XHRcdFx0dGhyb3cgXCJFeHRyYS91bnBhcnNlZCBjaGFyYWN0ZXJzIGZvdW5kIGluIGRhdGU6IFwiICsgZXh0cmE7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICh5ZWFyID09IC0xKVxuXHRcdFx0eWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcblx0XHRlbHNlIGlmICh5ZWFyIDwgMTAwKVxuXHRcdFx0eWVhciArPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgLSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgJSAxMDAgK1xuXHRcdFx0XHQoeWVhciA8PSBzaG9ydFllYXJDdXRvZmYgPyAwIDogLTEwMCk7XG5cdFx0aWYgKGRveSA+IC0xKSB7XG5cdFx0XHRtb250aCA9IDE7XG5cdFx0XHRkYXkgPSBkb3k7XG5cdFx0XHRkbyB7XG5cdFx0XHRcdHZhciBkaW0gPSB0aGlzLl9nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCAtIDEpO1xuXHRcdFx0XHRpZiAoZGF5IDw9IGRpbSlcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0bW9udGgrKztcblx0XHRcdFx0ZGF5IC09IGRpbTtcblx0XHRcdH0gd2hpbGUgKHRydWUpO1xuXHRcdH1cblx0XHR2YXIgZGF0ZSA9IHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KSk7XG5cdFx0aWYgKGRhdGUuZ2V0RnVsbFllYXIoKSAhPSB5ZWFyIHx8IGRhdGUuZ2V0TW9udGgoKSArIDEgIT0gbW9udGggfHwgZGF0ZS5nZXREYXRlKCkgIT0gZGF5KVxuXHRcdFx0dGhyb3cgJ0ludmFsaWQgZGF0ZSc7IC8vIEUuZy4gMzEvMDIvMDBcblx0XHRyZXR1cm4gZGF0ZTtcblx0fSxcblxuXHQvKiBTdGFuZGFyZCBkYXRlIGZvcm1hdHMuICovXG5cdEFUT006ICd5eS1tbS1kZCcsIC8vIFJGQyAzMzM5IChJU08gODYwMSlcblx0Q09PS0lFOiAnRCwgZGQgTSB5eScsXG5cdElTT184NjAxOiAneXktbW0tZGQnLFxuXHRSRkNfODIyOiAnRCwgZCBNIHknLFxuXHRSRkNfODUwOiAnREQsIGRkLU0teScsXG5cdFJGQ18xMDM2OiAnRCwgZCBNIHknLFxuXHRSRkNfMTEyMzogJ0QsIGQgTSB5eScsXG5cdFJGQ18yODIyOiAnRCwgZCBNIHl5Jyxcblx0UlNTOiAnRCwgZCBNIHknLCAvLyBSRkMgODIyXG5cdFRJQ0tTOiAnIScsXG5cdFRJTUVTVEFNUDogJ0AnLFxuXHRXM0M6ICd5eS1tbS1kZCcsIC8vIElTTyA4NjAxXG5cblx0X3RpY2tzVG8xOTcwOiAoKCgxOTcwIC0gMSkgKiAzNjUgKyBNYXRoLmZsb29yKDE5NzAgLyA0KSAtIE1hdGguZmxvb3IoMTk3MCAvIDEwMCkgK1xuXHRcdE1hdGguZmxvb3IoMTk3MCAvIDQwMCkpICogMjQgKiA2MCAqIDYwICogMTAwMDAwMDApLFxuXG5cdC8qIEZvcm1hdCBhIGRhdGUgb2JqZWN0IGludG8gYSBzdHJpbmcgdmFsdWUuXG5cdCAgIFRoZSBmb3JtYXQgY2FuIGJlIGNvbWJpbmF0aW9ucyBvZiB0aGUgZm9sbG93aW5nOlxuXHQgICBkICAtIGRheSBvZiBtb250aCAobm8gbGVhZGluZyB6ZXJvKVxuXHQgICBkZCAtIGRheSBvZiBtb250aCAodHdvIGRpZ2l0KVxuXHQgICBvICAtIGRheSBvZiB5ZWFyIChubyBsZWFkaW5nIHplcm9zKVxuXHQgICBvbyAtIGRheSBvZiB5ZWFyICh0aHJlZSBkaWdpdClcblx0ICAgRCAgLSBkYXkgbmFtZSBzaG9ydFxuXHQgICBERCAtIGRheSBuYW1lIGxvbmdcblx0ICAgbSAgLSBtb250aCBvZiB5ZWFyIChubyBsZWFkaW5nIHplcm8pXG5cdCAgIG1tIC0gbW9udGggb2YgeWVhciAodHdvIGRpZ2l0KVxuXHQgICBNICAtIG1vbnRoIG5hbWUgc2hvcnRcblx0ICAgTU0gLSBtb250aCBuYW1lIGxvbmdcblx0ICAgeSAgLSB5ZWFyICh0d28gZGlnaXQpXG5cdCAgIHl5IC0geWVhciAoZm91ciBkaWdpdClcblx0ICAgQCAtIFVuaXggdGltZXN0YW1wIChtcyBzaW5jZSAwMS8wMS8xOTcwKVxuXHQgICAhIC0gV2luZG93cyB0aWNrcyAoMTAwbnMgc2luY2UgMDEvMDEvMDAwMSlcblx0ICAgJy4uLicgLSBsaXRlcmFsIHRleHRcblx0ICAgJycgLSBzaW5nbGUgcXVvdGVcblxuXHQgICBAcGFyYW0gIGZvcm1hdCAgICBzdHJpbmcgLSB0aGUgZGVzaXJlZCBmb3JtYXQgb2YgdGhlIGRhdGVcblx0ICAgQHBhcmFtICBkYXRlICAgICAgRGF0ZSAtIHRoZSBkYXRlIHZhbHVlIHRvIGZvcm1hdFxuXHQgICBAcGFyYW0gIHNldHRpbmdzICBPYmplY3QgLSBhdHRyaWJ1dGVzIGluY2x1ZGU6XG5cdCAgICAgICAgICAgICAgICAgICAgIGRheU5hbWVzU2hvcnQgICAgc3RyaW5nWzddIC0gYWJicmV2aWF0ZWQgbmFtZXMgb2YgdGhlIGRheXMgZnJvbSBTdW5kYXkgKG9wdGlvbmFsKVxuXHQgICAgICAgICAgICAgICAgICAgICBkYXlOYW1lcyAgICAgICAgIHN0cmluZ1s3XSAtIG5hbWVzIG9mIHRoZSBkYXlzIGZyb20gU3VuZGF5IChvcHRpb25hbClcblx0ICAgICAgICAgICAgICAgICAgICAgbW9udGhOYW1lc1Nob3J0ICBzdHJpbmdbMTJdIC0gYWJicmV2aWF0ZWQgbmFtZXMgb2YgdGhlIG1vbnRocyAob3B0aW9uYWwpXG5cdCAgICAgICAgICAgICAgICAgICAgIG1vbnRoTmFtZXMgICAgICAgc3RyaW5nWzEyXSAtIG5hbWVzIG9mIHRoZSBtb250aHMgKG9wdGlvbmFsKVxuXHQgICBAcmV0dXJuICBzdHJpbmcgLSB0aGUgZGF0ZSBpbiB0aGUgYWJvdmUgZm9ybWF0ICovXG5cdGZvcm1hdERhdGU6IGZ1bmN0aW9uIChmb3JtYXQsIGRhdGUsIHNldHRpbmdzKSB7XG5cdFx0aWYgKCFkYXRlKVxuXHRcdFx0cmV0dXJuICcnO1xuXHRcdHZhciBkYXlOYW1lc1Nob3J0ID0gKHNldHRpbmdzID8gc2V0dGluZ3MuZGF5TmFtZXNTaG9ydCA6IG51bGwpIHx8IHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzU2hvcnQ7XG5cdFx0dmFyIGRheU5hbWVzID0gKHNldHRpbmdzID8gc2V0dGluZ3MuZGF5TmFtZXMgOiBudWxsKSB8fCB0aGlzLl9kZWZhdWx0cy5kYXlOYW1lcztcblx0XHR2YXIgbW9udGhOYW1lc1Nob3J0ID0gKHNldHRpbmdzID8gc2V0dGluZ3MubW9udGhOYW1lc1Nob3J0IDogbnVsbCkgfHwgdGhpcy5fZGVmYXVsdHMubW9udGhOYW1lc1Nob3J0O1xuXHRcdHZhciBtb250aE5hbWVzID0gKHNldHRpbmdzID8gc2V0dGluZ3MubW9udGhOYW1lcyA6IG51bGwpIHx8IHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXM7XG5cdFx0Ly8gQ2hlY2sgd2hldGhlciBhIGZvcm1hdCBjaGFyYWN0ZXIgaXMgZG91YmxlZFxuXHRcdHZhciBsb29rQWhlYWQgPSBmdW5jdGlvbihtYXRjaCkge1xuXHRcdFx0dmFyIG1hdGNoZXMgPSAoaUZvcm1hdCArIDEgPCBmb3JtYXQubGVuZ3RoICYmIGZvcm1hdC5jaGFyQXQoaUZvcm1hdCArIDEpID09IG1hdGNoKTtcblx0XHRcdGlmIChtYXRjaGVzKVxuXHRcdFx0XHRpRm9ybWF0Kys7XG5cdFx0XHRyZXR1cm4gbWF0Y2hlcztcblx0XHR9O1xuXHRcdC8vIEZvcm1hdCBhIG51bWJlciwgd2l0aCBsZWFkaW5nIHplcm8gaWYgbmVjZXNzYXJ5XG5cdFx0dmFyIGZvcm1hdE51bWJlciA9IGZ1bmN0aW9uKG1hdGNoLCB2YWx1ZSwgbGVuKSB7XG5cdFx0XHR2YXIgbnVtID0gJycgKyB2YWx1ZTtcblx0XHRcdGlmIChsb29rQWhlYWQobWF0Y2gpKVxuXHRcdFx0XHR3aGlsZSAobnVtLmxlbmd0aCA8IGxlbilcblx0XHRcdFx0XHRudW0gPSAnMCcgKyBudW07XG5cdFx0XHRyZXR1cm4gbnVtO1xuXHRcdH07XG5cdFx0Ly8gRm9ybWF0IGEgbmFtZSwgc2hvcnQgb3IgbG9uZyBhcyByZXF1ZXN0ZWRcblx0XHR2YXIgZm9ybWF0TmFtZSA9IGZ1bmN0aW9uKG1hdGNoLCB2YWx1ZSwgc2hvcnROYW1lcywgbG9uZ05hbWVzKSB7XG5cdFx0XHRyZXR1cm4gKGxvb2tBaGVhZChtYXRjaCkgPyBsb25nTmFtZXNbdmFsdWVdIDogc2hvcnROYW1lc1t2YWx1ZV0pO1xuXHRcdH07XG5cdFx0dmFyIG91dHB1dCA9ICcnO1xuXHRcdHZhciBsaXRlcmFsID0gZmFsc2U7XG5cdFx0aWYgKGRhdGUpXG5cdFx0XHRmb3IgKHZhciBpRm9ybWF0ID0gMDsgaUZvcm1hdCA8IGZvcm1hdC5sZW5ndGg7IGlGb3JtYXQrKykge1xuXHRcdFx0XHRpZiAobGl0ZXJhbClcblx0XHRcdFx0XHRpZiAoZm9ybWF0LmNoYXJBdChpRm9ybWF0KSA9PSBcIidcIiAmJiAhbG9va0FoZWFkKFwiJ1wiKSlcblx0XHRcdFx0XHRcdGxpdGVyYWwgPSBmYWxzZTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRvdXRwdXQgKz0gZm9ybWF0LmNoYXJBdChpRm9ybWF0KTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHN3aXRjaCAoZm9ybWF0LmNoYXJBdChpRm9ybWF0KSkge1xuXHRcdFx0XHRcdFx0Y2FzZSAnZCc6XG5cdFx0XHRcdFx0XHRcdG91dHB1dCArPSBmb3JtYXROdW1iZXIoJ2QnLCBkYXRlLmdldERhdGUoKSwgMik7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnRCc6XG5cdFx0XHRcdFx0XHRcdG91dHB1dCArPSBmb3JtYXROYW1lKCdEJywgZGF0ZS5nZXREYXkoKSwgZGF5TmFtZXNTaG9ydCwgZGF5TmFtZXMpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ28nOlxuXHRcdFx0XHRcdFx0XHRvdXRwdXQgKz0gZm9ybWF0TnVtYmVyKCdvJyxcblx0XHRcdFx0XHRcdFx0XHRNYXRoLnJvdW5kKChuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgMCwgMCkuZ2V0VGltZSgpKSAvIDg2NDAwMDAwKSwgMyk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnbSc6XG5cdFx0XHRcdFx0XHRcdG91dHB1dCArPSBmb3JtYXROdW1iZXIoJ20nLCBkYXRlLmdldE1vbnRoKCkgKyAxLCAyKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICdNJzpcblx0XHRcdFx0XHRcdFx0b3V0cHV0ICs9IGZvcm1hdE5hbWUoJ00nLCBkYXRlLmdldE1vbnRoKCksIG1vbnRoTmFtZXNTaG9ydCwgbW9udGhOYW1lcyk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAneSc6XG5cdFx0XHRcdFx0XHRcdG91dHB1dCArPSAobG9va0FoZWFkKCd5JykgPyBkYXRlLmdldEZ1bGxZZWFyKCkgOlxuXHRcdFx0XHRcdFx0XHRcdChkYXRlLmdldFllYXIoKSAlIDEwMCA8IDEwID8gJzAnIDogJycpICsgZGF0ZS5nZXRZZWFyKCkgJSAxMDApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ0AnOlxuXHRcdFx0XHRcdFx0XHRvdXRwdXQgKz0gZGF0ZS5nZXRUaW1lKCk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnISc6XG5cdFx0XHRcdFx0XHRcdG91dHB1dCArPSBkYXRlLmdldFRpbWUoKSAqIDEwMDAwICsgdGhpcy5fdGlja3NUbzE5NzA7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcIidcIjpcblx0XHRcdFx0XHRcdFx0aWYgKGxvb2tBaGVhZChcIidcIikpXG5cdFx0XHRcdFx0XHRcdFx0b3V0cHV0ICs9IFwiJ1wiO1xuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0bGl0ZXJhbCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0b3V0cHV0ICs9IGZvcm1hdC5jaGFyQXQoaUZvcm1hdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdHJldHVybiBvdXRwdXQ7XG5cdH0sXG5cblx0LyogRXh0cmFjdCBhbGwgcG9zc2libGUgY2hhcmFjdGVycyBmcm9tIHRoZSBkYXRlIGZvcm1hdC4gKi9cblx0X3Bvc3NpYmxlQ2hhcnM6IGZ1bmN0aW9uIChmb3JtYXQpIHtcblx0XHR2YXIgY2hhcnMgPSAnJztcblx0XHR2YXIgbGl0ZXJhbCA9IGZhbHNlO1xuXHRcdC8vIENoZWNrIHdoZXRoZXIgYSBmb3JtYXQgY2hhcmFjdGVyIGlzIGRvdWJsZWRcblx0XHR2YXIgbG9va0FoZWFkID0gZnVuY3Rpb24obWF0Y2gpIHtcblx0XHRcdHZhciBtYXRjaGVzID0gKGlGb3JtYXQgKyAxIDwgZm9ybWF0Lmxlbmd0aCAmJiBmb3JtYXQuY2hhckF0KGlGb3JtYXQgKyAxKSA9PSBtYXRjaCk7XG5cdFx0XHRpZiAobWF0Y2hlcylcblx0XHRcdFx0aUZvcm1hdCsrO1xuXHRcdFx0cmV0dXJuIG1hdGNoZXM7XG5cdFx0fTtcblx0XHRmb3IgKHZhciBpRm9ybWF0ID0gMDsgaUZvcm1hdCA8IGZvcm1hdC5sZW5ndGg7IGlGb3JtYXQrKylcblx0XHRcdGlmIChsaXRlcmFsKVxuXHRcdFx0XHRpZiAoZm9ybWF0LmNoYXJBdChpRm9ybWF0KSA9PSBcIidcIiAmJiAhbG9va0FoZWFkKFwiJ1wiKSlcblx0XHRcdFx0XHRsaXRlcmFsID0gZmFsc2U7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRjaGFycyArPSBmb3JtYXQuY2hhckF0KGlGb3JtYXQpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRzd2l0Y2ggKGZvcm1hdC5jaGFyQXQoaUZvcm1hdCkpIHtcblx0XHRcdFx0XHRjYXNlICdkJzogY2FzZSAnbSc6IGNhc2UgJ3knOiBjYXNlICdAJzpcblx0XHRcdFx0XHRcdGNoYXJzICs9ICcwMTIzNDU2Nzg5Jztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ0QnOiBjYXNlICdNJzpcblx0XHRcdFx0XHRcdHJldHVybiBudWxsOyAvLyBBY2NlcHQgYW55dGhpbmdcblx0XHRcdFx0XHRjYXNlIFwiJ1wiOlxuXHRcdFx0XHRcdFx0aWYgKGxvb2tBaGVhZChcIidcIikpXG5cdFx0XHRcdFx0XHRcdGNoYXJzICs9IFwiJ1wiO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRsaXRlcmFsID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRjaGFycyArPSBmb3JtYXQuY2hhckF0KGlGb3JtYXQpO1xuXHRcdFx0XHR9XG5cdFx0cmV0dXJuIGNoYXJzO1xuXHR9LFxuXG5cdC8qIEdldCBhIHNldHRpbmcgdmFsdWUsIGRlZmF1bHRpbmcgaWYgbmVjZXNzYXJ5LiAqL1xuXHRfZ2V0OiBmdW5jdGlvbihpbnN0LCBuYW1lKSB7XG5cdFx0cmV0dXJuIGluc3Quc2V0dGluZ3NbbmFtZV0gIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRpbnN0LnNldHRpbmdzW25hbWVdIDogdGhpcy5fZGVmYXVsdHNbbmFtZV07XG5cdH0sXG5cblx0LyogUGFyc2UgZXhpc3RpbmcgZGF0ZSBhbmQgaW5pdGlhbGlzZSBkYXRlIHBpY2tlci4gKi9cblx0X3NldERhdGVGcm9tRmllbGQ6IGZ1bmN0aW9uKGluc3QsIG5vRGVmYXVsdCkge1xuXHRcdGlmIChpbnN0LmlucHV0LnZhbCgpID09IGluc3QubGFzdFZhbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR2YXIgZGF0ZUZvcm1hdCA9IHRoaXMuX2dldChpbnN0LCAnZGF0ZUZvcm1hdCcpO1xuXHRcdHZhciBkYXRlcyA9IGluc3QubGFzdFZhbCA9IGluc3QuaW5wdXQgPyBpbnN0LmlucHV0LnZhbCgpIDogbnVsbDtcblx0XHR2YXIgZGF0ZSwgZGVmYXVsdERhdGU7XG5cdFx0ZGF0ZSA9IGRlZmF1bHREYXRlID0gdGhpcy5fZ2V0RGVmYXVsdERhdGUoaW5zdCk7XG5cdFx0dmFyIHNldHRpbmdzID0gdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGluc3QpO1xuXHRcdHRyeSB7XG5cdFx0XHRkYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZUZvcm1hdCwgZGF0ZXMsIHNldHRpbmdzKSB8fCBkZWZhdWx0RGF0ZTtcblx0XHR9IGNhdGNoIChldmVudCkge1xuXHRcdFx0dGhpcy5sb2coZXZlbnQpO1xuXHRcdFx0ZGF0ZXMgPSAobm9EZWZhdWx0ID8gJycgOiBkYXRlcyk7XG5cdFx0fVxuXHRcdGluc3Quc2VsZWN0ZWREYXkgPSBkYXRlLmdldERhdGUoKTtcblx0XHRpbnN0LmRyYXdNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcblx0XHRpbnN0LmRyYXdZZWFyID0gaW5zdC5zZWxlY3RlZFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cdFx0aW5zdC5jdXJyZW50RGF5ID0gKGRhdGVzID8gZGF0ZS5nZXREYXRlKCkgOiAwKTtcblx0XHRpbnN0LmN1cnJlbnRNb250aCA9IChkYXRlcyA/IGRhdGUuZ2V0TW9udGgoKSA6IDApO1xuXHRcdGluc3QuY3VycmVudFllYXIgPSAoZGF0ZXMgPyBkYXRlLmdldEZ1bGxZZWFyKCkgOiAwKTtcblx0XHR0aGlzLl9hZGp1c3RJbnN0RGF0ZShpbnN0KTtcblx0fSxcblxuXHQvKiBSZXRyaWV2ZSB0aGUgZGVmYXVsdCBkYXRlIHNob3duIG9uIG9wZW5pbmcuICovXG5cdF9nZXREZWZhdWx0RGF0ZTogZnVuY3Rpb24oaW5zdCkge1xuXHRcdHJldHVybiB0aGlzLl9yZXN0cmljdE1pbk1heChpbnN0LFxuXHRcdFx0dGhpcy5fZGV0ZXJtaW5lRGF0ZShpbnN0LCB0aGlzLl9nZXQoaW5zdCwgJ2RlZmF1bHREYXRlJyksIG5ldyBEYXRlKCkpKTtcblx0fSxcblxuXHQvKiBBIGRhdGUgbWF5IGJlIHNwZWNpZmllZCBhcyBhbiBleGFjdCB2YWx1ZSBvciBhIHJlbGF0aXZlIG9uZS4gKi9cblx0X2RldGVybWluZURhdGU6IGZ1bmN0aW9uKGluc3QsIGRhdGUsIGRlZmF1bHREYXRlKSB7XG5cdFx0dmFyIG9mZnNldE51bWVyaWMgPSBmdW5jdGlvbihvZmZzZXQpIHtcblx0XHRcdHZhciBkYXRlID0gbmV3IERhdGUoKTtcblx0XHRcdGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIG9mZnNldCk7XG5cdFx0XHRyZXR1cm4gZGF0ZTtcblx0XHR9O1xuXHRcdHZhciBvZmZzZXRTdHJpbmcgPSBmdW5jdGlvbihvZmZzZXQpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHJldHVybiAkLmRhdGVwaWNrZXIucGFyc2VEYXRlKCQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICdkYXRlRm9ybWF0JyksXG5cdFx0XHRcdFx0b2Zmc2V0LCAkLmRhdGVwaWNrZXIuX2dldEZvcm1hdENvbmZpZyhpbnN0KSk7XG5cdFx0XHR9XG5cdFx0XHRjYXRjaCAoZSkge1xuXHRcdFx0XHQvLyBJZ25vcmVcblx0XHRcdH1cblx0XHRcdHZhciBkYXRlID0gKG9mZnNldC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9eYy8pID9cblx0XHRcdFx0JC5kYXRlcGlja2VyLl9nZXREYXRlKGluc3QpIDogbnVsbCkgfHwgbmV3IERhdGUoKTtcblx0XHRcdHZhciB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXHRcdFx0dmFyIG1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuXHRcdFx0dmFyIGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuXHRcdFx0dmFyIHBhdHRlcm4gPSAvKFsrLV0/WzAtOV0rKVxccyooZHxEfHd8V3xtfE18eXxZKT8vZztcblx0XHRcdHZhciBtYXRjaGVzID0gcGF0dGVybi5leGVjKG9mZnNldCk7XG5cdFx0XHR3aGlsZSAobWF0Y2hlcykge1xuXHRcdFx0XHRzd2l0Y2ggKG1hdGNoZXNbMl0gfHwgJ2QnKSB7XG5cdFx0XHRcdFx0Y2FzZSAnZCcgOiBjYXNlICdEJyA6XG5cdFx0XHRcdFx0XHRkYXkgKz0gcGFyc2VJbnQobWF0Y2hlc1sxXSwxMCk7IGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3cnIDogY2FzZSAnVycgOlxuXHRcdFx0XHRcdFx0ZGF5ICs9IHBhcnNlSW50KG1hdGNoZXNbMV0sMTApICogNzsgYnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbScgOiBjYXNlICdNJyA6XG5cdFx0XHRcdFx0XHRtb250aCArPSBwYXJzZUludChtYXRjaGVzWzFdLDEwKTtcblx0XHRcdFx0XHRcdGRheSA9IE1hdGgubWluKGRheSwgJC5kYXRlcGlja2VyLl9nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAneSc6IGNhc2UgJ1knIDpcblx0XHRcdFx0XHRcdHllYXIgKz0gcGFyc2VJbnQobWF0Y2hlc1sxXSwxMCk7XG5cdFx0XHRcdFx0XHRkYXkgPSBNYXRoLm1pbihkYXksICQuZGF0ZXBpY2tlci5fZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG1hdGNoZXMgPSBwYXR0ZXJuLmV4ZWMob2Zmc2V0KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KTtcblx0XHR9O1xuXHRcdHZhciBuZXdEYXRlID0gKGRhdGUgPT0gbnVsbCB8fCBkYXRlID09PSAnJyA/IGRlZmF1bHREYXRlIDogKHR5cGVvZiBkYXRlID09ICdzdHJpbmcnID8gb2Zmc2V0U3RyaW5nKGRhdGUpIDpcblx0XHRcdCh0eXBlb2YgZGF0ZSA9PSAnbnVtYmVyJyA/IChpc05hTihkYXRlKSA/IGRlZmF1bHREYXRlIDogb2Zmc2V0TnVtZXJpYyhkYXRlKSkgOiBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSkpKSk7XG5cdFx0bmV3RGF0ZSA9IChuZXdEYXRlICYmIG5ld0RhdGUudG9TdHJpbmcoKSA9PSAnSW52YWxpZCBEYXRlJyA/IGRlZmF1bHREYXRlIDogbmV3RGF0ZSk7XG5cdFx0aWYgKG5ld0RhdGUpIHtcblx0XHRcdG5ld0RhdGUuc2V0SG91cnMoMCk7XG5cdFx0XHRuZXdEYXRlLnNldE1pbnV0ZXMoMCk7XG5cdFx0XHRuZXdEYXRlLnNldFNlY29uZHMoMCk7XG5cdFx0XHRuZXdEYXRlLnNldE1pbGxpc2Vjb25kcygwKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ld0RhdGUpO1xuXHR9LFxuXG5cdC8qIEhhbmRsZSBzd2l0Y2ggdG8vZnJvbSBkYXlsaWdodCBzYXZpbmcuXG5cdCAgIEhvdXJzIG1heSBiZSBub24temVybyBvbiBkYXlsaWdodCBzYXZpbmcgY3V0LW92ZXI6XG5cdCAgID4gMTIgd2hlbiBtaWRuaWdodCBjaGFuZ2VvdmVyLCBidXQgdGhlbiBjYW5ub3QgZ2VuZXJhdGVcblx0ICAgbWlkbmlnaHQgZGF0ZXRpbWUsIHNvIGp1bXAgdG8gMUFNLCBvdGhlcndpc2UgcmVzZXQuXG5cdCAgIEBwYXJhbSAgZGF0ZSAgKERhdGUpIHRoZSBkYXRlIHRvIGNoZWNrXG5cdCAgIEByZXR1cm4gIChEYXRlKSB0aGUgY29ycmVjdGVkIGRhdGUgKi9cblx0X2RheWxpZ2h0U2F2aW5nQWRqdXN0OiBmdW5jdGlvbihkYXRlKSB7XG5cdFx0aWYgKCFkYXRlKSByZXR1cm4gbnVsbDtcblx0XHRkYXRlLnNldEhvdXJzKGRhdGUuZ2V0SG91cnMoKSA+IDEyID8gZGF0ZS5nZXRIb3VycygpICsgMiA6IDApO1xuXHRcdHJldHVybiBkYXRlO1xuXHR9LFxuXG5cdC8qIFNldCB0aGUgZGF0ZShzKSBkaXJlY3RseS4gKi9cblx0X3NldERhdGU6IGZ1bmN0aW9uKGluc3QsIGRhdGUsIG5vQ2hhbmdlKSB7XG5cdFx0dmFyIGNsZWFyID0gIWRhdGU7XG5cdFx0dmFyIG9yaWdNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aDtcblx0XHR2YXIgb3JpZ1llYXIgPSBpbnN0LnNlbGVjdGVkWWVhcjtcblx0XHR2YXIgbmV3RGF0ZSA9IHRoaXMuX3Jlc3RyaWN0TWluTWF4KGluc3QsIHRoaXMuX2RldGVybWluZURhdGUoaW5zdCwgZGF0ZSwgbmV3IERhdGUoKSkpO1xuXHRcdGluc3Quc2VsZWN0ZWREYXkgPSBpbnN0LmN1cnJlbnREYXkgPSBuZXdEYXRlLmdldERhdGUoKTtcblx0XHRpbnN0LmRyYXdNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aCA9IGluc3QuY3VycmVudE1vbnRoID0gbmV3RGF0ZS5nZXRNb250aCgpO1xuXHRcdGluc3QuZHJhd1llYXIgPSBpbnN0LnNlbGVjdGVkWWVhciA9IGluc3QuY3VycmVudFllYXIgPSBuZXdEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdFx0aWYgKChvcmlnTW9udGggIT0gaW5zdC5zZWxlY3RlZE1vbnRoIHx8IG9yaWdZZWFyICE9IGluc3Quc2VsZWN0ZWRZZWFyKSAmJiAhbm9DaGFuZ2UpXG5cdFx0XHR0aGlzLl9ub3RpZnlDaGFuZ2UoaW5zdCk7XG5cdFx0dGhpcy5fYWRqdXN0SW5zdERhdGUoaW5zdCk7XG5cdFx0aWYgKGluc3QuaW5wdXQpIHtcblx0XHRcdGluc3QuaW5wdXQudmFsKGNsZWFyID8gJycgOiB0aGlzLl9mb3JtYXREYXRlKGluc3QpKTtcblx0XHR9XG5cdH0sXG5cblx0LyogUmV0cmlldmUgdGhlIGRhdGUocykgZGlyZWN0bHkuICovXG5cdF9nZXREYXRlOiBmdW5jdGlvbihpbnN0KSB7XG5cdFx0dmFyIHN0YXJ0RGF0ZSA9ICghaW5zdC5jdXJyZW50WWVhciB8fCAoaW5zdC5pbnB1dCAmJiBpbnN0LmlucHV0LnZhbCgpID09ICcnKSA/IG51bGwgOlxuXHRcdFx0dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoXG5cdFx0XHRpbnN0LmN1cnJlbnRZZWFyLCBpbnN0LmN1cnJlbnRNb250aCwgaW5zdC5jdXJyZW50RGF5KSkpO1xuXHRcdFx0cmV0dXJuIHN0YXJ0RGF0ZTtcblx0fSxcblxuXHQvKiBBdHRhY2ggdGhlIG9ueHh4IGhhbmRsZXJzLiAgVGhlc2UgYXJlIGRlY2xhcmVkIHN0YXRpY2FsbHkgc29cblx0ICogdGhleSB3b3JrIHdpdGggc3RhdGljIGNvZGUgdHJhbnNmb3JtZXJzIGxpa2UgQ2FqYS5cblx0ICovXG5cdF9hdHRhY2hIYW5kbGVyczogZnVuY3Rpb24oaW5zdCkge1xuXHRcdHZhciBzdGVwTW9udGhzID0gdGhpcy5fZ2V0KGluc3QsICdzdGVwTW9udGhzJyk7XG5cdFx0dmFyIGlkID0gJyMnICsgaW5zdC5pZC5yZXBsYWNlKCAvXFxcXFxcXFwvZywgXCJcXFxcXCIgKTtcblx0XHRpbnN0LmRwRGl2LmZpbmQoJ1tkYXRhLWhhbmRsZXJdJykubWFwKGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBoYW5kbGVyID0ge1xuXHRcdFx0XHRwcmV2OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0d2luZG93WydEUF9qUXVlcnlfJyArIGRwdXVpZF0uZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShpZCwgLXN0ZXBNb250aHMsICdNJyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG5leHQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR3aW5kb3dbJ0RQX2pRdWVyeV8nICsgZHB1dWlkXS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGlkLCArc3RlcE1vbnRocywgJ00nKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0aGlkZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHdpbmRvd1snRFBfalF1ZXJ5XycgKyBkcHV1aWRdLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRvZGF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0d2luZG93WydEUF9qUXVlcnlfJyArIGRwdXVpZF0uZGF0ZXBpY2tlci5fZ290b1RvZGF5KGlkKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0c2VsZWN0RGF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0d2luZG93WydEUF9qUXVlcnlfJyArIGRwdXVpZF0uZGF0ZXBpY2tlci5fc2VsZWN0RGF5KGlkLCArdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtbW9udGgnKSwgK3RoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLXllYXInKSwgdGhpcyk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRzZWxlY3RNb250aDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHdpbmRvd1snRFBfalF1ZXJ5XycgKyBkcHV1aWRdLmRhdGVwaWNrZXIuX3NlbGVjdE1vbnRoWWVhcihpZCwgdGhpcywgJ00nKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNlbGVjdFllYXI6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR3aW5kb3dbJ0RQX2pRdWVyeV8nICsgZHB1dWlkXS5kYXRlcGlja2VyLl9zZWxlY3RNb250aFllYXIoaWQsIHRoaXMsICdZJyk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0JCh0aGlzKS5iaW5kKHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLWV2ZW50JyksIGhhbmRsZXJbdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtaGFuZGxlcicpXSk7XG5cdFx0fSk7XG5cdH0sXG5cblx0LyogR2VuZXJhdGUgdGhlIEhUTUwgZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkYXRlIHBpY2tlci4gKi9cblx0X2dlbmVyYXRlSFRNTDogZnVuY3Rpb24oaW5zdCkge1xuXHRcdHZhciB0b2RheSA9IG5ldyBEYXRlKCk7XG5cdFx0dG9kYXkgPSB0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChcblx0XHRcdG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSkpOyAvLyBjbGVhciB0aW1lXG5cdFx0dmFyIGlzUlRMID0gdGhpcy5fZ2V0KGluc3QsICdpc1JUTCcpO1xuXHRcdHZhciBzaG93QnV0dG9uUGFuZWwgPSB0aGlzLl9nZXQoaW5zdCwgJ3Nob3dCdXR0b25QYW5lbCcpO1xuXHRcdHZhciBoaWRlSWZOb1ByZXZOZXh0ID0gdGhpcy5fZ2V0KGluc3QsICdoaWRlSWZOb1ByZXZOZXh0Jyk7XG5cdFx0dmFyIG5hdmlnYXRpb25Bc0RhdGVGb3JtYXQgPSB0aGlzLl9nZXQoaW5zdCwgJ25hdmlnYXRpb25Bc0RhdGVGb3JtYXQnKTtcblx0XHR2YXIgbnVtTW9udGhzID0gdGhpcy5fZ2V0TnVtYmVyT2ZNb250aHMoaW5zdCk7XG5cdFx0dmFyIHNob3dDdXJyZW50QXRQb3MgPSB0aGlzLl9nZXQoaW5zdCwgJ3Nob3dDdXJyZW50QXRQb3MnKTtcblx0XHR2YXIgc3RlcE1vbnRocyA9IHRoaXMuX2dldChpbnN0LCAnc3RlcE1vbnRocycpO1xuXHRcdHZhciBpc011bHRpTW9udGggPSAobnVtTW9udGhzWzBdICE9IDEgfHwgbnVtTW9udGhzWzFdICE9IDEpO1xuXHRcdHZhciBjdXJyZW50RGF0ZSA9IHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KCghaW5zdC5jdXJyZW50RGF5ID8gbmV3IERhdGUoOTk5OSwgOSwgOSkgOlxuXHRcdFx0bmV3IERhdGUoaW5zdC5jdXJyZW50WWVhciwgaW5zdC5jdXJyZW50TW9udGgsIGluc3QuY3VycmVudERheSkpKTtcblx0XHR2YXIgbWluRGF0ZSA9IHRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwgJ21pbicpO1xuXHRcdHZhciBtYXhEYXRlID0gdGhpcy5fZ2V0TWluTWF4RGF0ZShpbnN0LCAnbWF4Jyk7XG5cdFx0dmFyIGRyYXdNb250aCA9IGluc3QuZHJhd01vbnRoIC0gc2hvd0N1cnJlbnRBdFBvcztcblx0XHR2YXIgZHJhd1llYXIgPSBpbnN0LmRyYXdZZWFyO1xuXHRcdGlmIChkcmF3TW9udGggPCAwKSB7XG5cdFx0XHRkcmF3TW9udGggKz0gMTI7XG5cdFx0XHRkcmF3WWVhci0tO1xuXHRcdH1cblx0XHRpZiAobWF4RGF0ZSkge1xuXHRcdFx0dmFyIG1heERyYXcgPSB0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShtYXhEYXRlLmdldEZ1bGxZZWFyKCksXG5cdFx0XHRcdG1heERhdGUuZ2V0TW9udGgoKSAtIChudW1Nb250aHNbMF0gKiBudW1Nb250aHNbMV0pICsgMSwgbWF4RGF0ZS5nZXREYXRlKCkpKTtcblx0XHRcdG1heERyYXcgPSAobWluRGF0ZSAmJiBtYXhEcmF3IDwgbWluRGF0ZSA/IG1pbkRhdGUgOiBtYXhEcmF3KTtcblx0XHRcdHdoaWxlICh0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkcmF3WWVhciwgZHJhd01vbnRoLCAxKSkgPiBtYXhEcmF3KSB7XG5cdFx0XHRcdGRyYXdNb250aC0tO1xuXHRcdFx0XHRpZiAoZHJhd01vbnRoIDwgMCkge1xuXHRcdFx0XHRcdGRyYXdNb250aCA9IDExO1xuXHRcdFx0XHRcdGRyYXdZZWFyLS07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aW5zdC5kcmF3TW9udGggPSBkcmF3TW9udGg7XG5cdFx0aW5zdC5kcmF3WWVhciA9IGRyYXdZZWFyO1xuXHRcdHZhciBwcmV2VGV4dCA9IHRoaXMuX2dldChpbnN0LCAncHJldlRleHQnKTtcblx0XHRwcmV2VGV4dCA9ICghbmF2aWdhdGlvbkFzRGF0ZUZvcm1hdCA/IHByZXZUZXh0IDogdGhpcy5mb3JtYXREYXRlKHByZXZUZXh0LFxuXHRcdFx0dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZHJhd1llYXIsIGRyYXdNb250aCAtIHN0ZXBNb250aHMsIDEpKSxcblx0XHRcdHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSkpO1xuXHRcdHZhciBwcmV2ID0gKHRoaXMuX2NhbkFkanVzdE1vbnRoKGluc3QsIC0xLCBkcmF3WWVhciwgZHJhd01vbnRoKSA/XG5cdFx0XHQnPGEgY2xhc3M9XCJ1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbFwiIGRhdGEtaGFuZGxlcj1cInByZXZcIiBkYXRhLWV2ZW50PVwiY2xpY2tcIicgK1xuXHRcdFx0JyB0aXRsZT1cIicgKyBwcmV2VGV4dCArICdcIj48c3BhbiBjbGFzcz1cInVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJyArICggaXNSVEwgPyAnZScgOiAndycpICsgJ1wiPicgKyBwcmV2VGV4dCArICc8L3NwYW4+PC9hPicgOlxuXHRcdFx0KGhpZGVJZk5vUHJldk5leHQgPyAnJyA6ICc8YSBjbGFzcz1cInVpLWRhdGVwaWNrZXItcHJldiB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWRpc2FibGVkXCIgdGl0bGU9XCInKyBwcmV2VGV4dCArJ1wiPjxzcGFuIGNsYXNzPVwidWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0nICsgKCBpc1JUTCA/ICdlJyA6ICd3JykgKyAnXCI+JyArIHByZXZUZXh0ICsgJzwvc3Bhbj48L2E+JykpO1xuXHRcdHZhciBuZXh0VGV4dCA9IHRoaXMuX2dldChpbnN0LCAnbmV4dFRleHQnKTtcblx0XHRuZXh0VGV4dCA9ICghbmF2aWdhdGlvbkFzRGF0ZUZvcm1hdCA/IG5leHRUZXh0IDogdGhpcy5mb3JtYXREYXRlKG5leHRUZXh0LFxuXHRcdFx0dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZHJhd1llYXIsIGRyYXdNb250aCArIHN0ZXBNb250aHMsIDEpKSxcblx0XHRcdHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSkpO1xuXHRcdHZhciBuZXh0ID0gKHRoaXMuX2NhbkFkanVzdE1vbnRoKGluc3QsICsxLCBkcmF3WWVhciwgZHJhd01vbnRoKSA/XG5cdFx0XHQnPGEgY2xhc3M9XCJ1aS1kYXRlcGlja2VyLW5leHQgdWktY29ybmVyLWFsbFwiIGRhdGEtaGFuZGxlcj1cIm5leHRcIiBkYXRhLWV2ZW50PVwiY2xpY2tcIicgK1xuXHRcdFx0JyB0aXRsZT1cIicgKyBuZXh0VGV4dCArICdcIj48c3BhbiBjbGFzcz1cInVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJyArICggaXNSVEwgPyAndycgOiAnZScpICsgJ1wiPicgKyBuZXh0VGV4dCArICc8L3NwYW4+PC9hPicgOlxuXHRcdFx0KGhpZGVJZk5vUHJldk5leHQgPyAnJyA6ICc8YSBjbGFzcz1cInVpLWRhdGVwaWNrZXItbmV4dCB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWRpc2FibGVkXCIgdGl0bGU9XCInKyBuZXh0VGV4dCArICdcIj48c3BhbiBjbGFzcz1cInVpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtJyArICggaXNSVEwgPyAndycgOiAnZScpICsgJ1wiPicgKyBuZXh0VGV4dCArICc8L3NwYW4+PC9hPicpKTtcblx0XHR2YXIgY3VycmVudFRleHQgPSB0aGlzLl9nZXQoaW5zdCwgJ2N1cnJlbnRUZXh0Jyk7XG5cdFx0dmFyIGdvdG9EYXRlID0gKHRoaXMuX2dldChpbnN0LCAnZ290b0N1cnJlbnQnKSAmJiBpbnN0LmN1cnJlbnREYXkgPyBjdXJyZW50RGF0ZSA6IHRvZGF5KTtcblx0XHRjdXJyZW50VGV4dCA9ICghbmF2aWdhdGlvbkFzRGF0ZUZvcm1hdCA/IGN1cnJlbnRUZXh0IDpcblx0XHRcdHRoaXMuZm9ybWF0RGF0ZShjdXJyZW50VGV4dCwgZ290b0RhdGUsIHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSkpO1xuXHRcdHZhciBjb250cm9scyA9ICghaW5zdC5pbmxpbmUgPyAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ1aS1kYXRlcGlja2VyLWNsb3NlIHVpLXN0YXRlLWRlZmF1bHQgdWktcHJpb3JpdHktcHJpbWFyeSB1aS1jb3JuZXItYWxsXCIgZGF0YS1oYW5kbGVyPVwiaGlkZVwiIGRhdGEtZXZlbnQ9XCJjbGlja1wiPicgK1xuXHRcdFx0dGhpcy5fZ2V0KGluc3QsICdjbG9zZVRleHQnKSArICc8L2J1dHRvbj4nIDogJycpO1xuXHRcdHZhciBidXR0b25QYW5lbCA9IChzaG93QnV0dG9uUGFuZWwpID8gJzxkaXYgY2xhc3M9XCJ1aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnRcIj4nICsgKGlzUlRMID8gY29udHJvbHMgOiAnJykgK1xuXHRcdFx0KHRoaXMuX2lzSW5SYW5nZShpbnN0LCBnb3RvRGF0ZSkgPyAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ1aS1kYXRlcGlja2VyLWN1cnJlbnQgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1zZWNvbmRhcnkgdWktY29ybmVyLWFsbFwiIGRhdGEtaGFuZGxlcj1cInRvZGF5XCIgZGF0YS1ldmVudD1cImNsaWNrXCInICtcblx0XHRcdCc+JyArIGN1cnJlbnRUZXh0ICsgJzwvYnV0dG9uPicgOiAnJykgKyAoaXNSVEwgPyAnJyA6IGNvbnRyb2xzKSArICc8L2Rpdj4nIDogJyc7XG5cdFx0dmFyIGZpcnN0RGF5ID0gcGFyc2VJbnQodGhpcy5fZ2V0KGluc3QsICdmaXJzdERheScpLDEwKTtcblx0XHRmaXJzdERheSA9IChpc05hTihmaXJzdERheSkgPyAwIDogZmlyc3REYXkpO1xuXHRcdHZhciBzaG93V2VlayA9IHRoaXMuX2dldChpbnN0LCAnc2hvd1dlZWsnKTtcblx0XHR2YXIgZGF5TmFtZXMgPSB0aGlzLl9nZXQoaW5zdCwgJ2RheU5hbWVzJyk7XG5cdFx0dmFyIGRheU5hbWVzU2hvcnQgPSB0aGlzLl9nZXQoaW5zdCwgJ2RheU5hbWVzU2hvcnQnKTtcblx0XHR2YXIgZGF5TmFtZXNNaW4gPSB0aGlzLl9nZXQoaW5zdCwgJ2RheU5hbWVzTWluJyk7XG5cdFx0dmFyIG1vbnRoTmFtZXMgPSB0aGlzLl9nZXQoaW5zdCwgJ21vbnRoTmFtZXMnKTtcblx0XHR2YXIgbW9udGhOYW1lc1Nob3J0ID0gdGhpcy5fZ2V0KGluc3QsICdtb250aE5hbWVzU2hvcnQnKTtcblx0XHR2YXIgYmVmb3JlU2hvd0RheSA9IHRoaXMuX2dldChpbnN0LCAnYmVmb3JlU2hvd0RheScpO1xuXHRcdHZhciBzaG93T3RoZXJNb250aHMgPSB0aGlzLl9nZXQoaW5zdCwgJ3Nob3dPdGhlck1vbnRocycpO1xuXHRcdHZhciBzZWxlY3RPdGhlck1vbnRocyA9IHRoaXMuX2dldChpbnN0LCAnc2VsZWN0T3RoZXJNb250aHMnKTtcblx0XHR2YXIgY2FsY3VsYXRlV2VlayA9IHRoaXMuX2dldChpbnN0LCAnY2FsY3VsYXRlV2VlaycpIHx8IHRoaXMuaXNvODYwMVdlZWs7XG5cdFx0dmFyIGRlZmF1bHREYXRlID0gdGhpcy5fZ2V0RGVmYXVsdERhdGUoaW5zdCk7XG5cdFx0dmFyIGh0bWwgPSAnJztcblx0XHRmb3IgKHZhciByb3cgPSAwOyByb3cgPCBudW1Nb250aHNbMF07IHJvdysrKSB7XG5cdFx0XHR2YXIgZ3JvdXAgPSAnJztcblx0XHRcdHRoaXMubWF4Um93cyA9IDQ7XG5cdFx0XHRmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBudW1Nb250aHNbMV07IGNvbCsrKSB7XG5cdFx0XHRcdHZhciBzZWxlY3RlZERhdGUgPSB0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkcmF3WWVhciwgZHJhd01vbnRoLCBpbnN0LnNlbGVjdGVkRGF5KSk7XG5cdFx0XHRcdHZhciBjb3JuZXJDbGFzcyA9ICcgdWktY29ybmVyLWFsbCc7XG5cdFx0XHRcdHZhciBjYWxlbmRlciA9ICcnO1xuXHRcdFx0XHRpZiAoaXNNdWx0aU1vbnRoKSB7XG5cdFx0XHRcdFx0Y2FsZW5kZXIgKz0gJzxkaXYgY2xhc3M9XCJ1aS1kYXRlcGlja2VyLWdyb3VwJztcblx0XHRcdFx0XHRpZiAobnVtTW9udGhzWzFdID4gMSlcblx0XHRcdFx0XHRcdHN3aXRjaCAoY29sKSB7XG5cdFx0XHRcdFx0XHRcdGNhc2UgMDogY2FsZW5kZXIgKz0gJyB1aS1kYXRlcGlja2VyLWdyb3VwLWZpcnN0Jztcblx0XHRcdFx0XHRcdFx0XHRjb3JuZXJDbGFzcyA9ICcgdWktY29ybmVyLScgKyAoaXNSVEwgPyAncmlnaHQnIDogJ2xlZnQnKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgbnVtTW9udGhzWzFdLTE6IGNhbGVuZGVyICs9ICcgdWktZGF0ZXBpY2tlci1ncm91cC1sYXN0Jztcblx0XHRcdFx0XHRcdFx0XHRjb3JuZXJDbGFzcyA9ICcgdWktY29ybmVyLScgKyAoaXNSVEwgPyAnbGVmdCcgOiAncmlnaHQnKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6IGNhbGVuZGVyICs9ICcgdWktZGF0ZXBpY2tlci1ncm91cC1taWRkbGUnOyBjb3JuZXJDbGFzcyA9ICcnOyBicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjYWxlbmRlciArPSAnXCI+Jztcblx0XHRcdFx0fVxuXHRcdFx0XHRjYWxlbmRlciArPSAnPGRpdiBjbGFzcz1cInVpLWRhdGVwaWNrZXItaGVhZGVyIHVpLXdpZGdldC1oZWFkZXIgdWktaGVscGVyLWNsZWFyZml4JyArIGNvcm5lckNsYXNzICsgJ1wiPicgK1xuXHRcdFx0XHRcdCgvYWxsfGxlZnQvLnRlc3QoY29ybmVyQ2xhc3MpICYmIHJvdyA9PSAwID8gKGlzUlRMID8gbmV4dCA6IHByZXYpIDogJycpICtcblx0XHRcdFx0XHQoL2FsbHxyaWdodC8udGVzdChjb3JuZXJDbGFzcykgJiYgcm93ID09IDAgPyAoaXNSVEwgPyBwcmV2IDogbmV4dCkgOiAnJykgK1xuXHRcdFx0XHRcdHRoaXMuX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyKGluc3QsIGRyYXdNb250aCwgZHJhd1llYXIsIG1pbkRhdGUsIG1heERhdGUsXG5cdFx0XHRcdFx0cm93ID4gMCB8fCBjb2wgPiAwLCBtb250aE5hbWVzLCBtb250aE5hbWVzU2hvcnQpICsgLy8gZHJhdyBtb250aCBoZWFkZXJzXG5cdFx0XHRcdFx0JzwvZGl2Pjx0YWJsZSBjbGFzcz1cInVpLWRhdGVwaWNrZXItY2FsZW5kYXJcIj48dGhlYWQ+JyArXG5cdFx0XHRcdFx0Jzx0cj4nO1xuXHRcdFx0XHR2YXIgdGhlYWQgPSAoc2hvd1dlZWsgPyAnPHRoIGNsYXNzPVwidWktZGF0ZXBpY2tlci13ZWVrLWNvbFwiPicgKyB0aGlzLl9nZXQoaW5zdCwgJ3dlZWtIZWFkZXInKSArICc8L3RoPicgOiAnJyk7XG5cdFx0XHRcdGZvciAodmFyIGRvdyA9IDA7IGRvdyA8IDc7IGRvdysrKSB7IC8vIGRheXMgb2YgdGhlIHdlZWtcblx0XHRcdFx0XHR2YXIgZGF5ID0gKGRvdyArIGZpcnN0RGF5KSAlIDc7XG5cdFx0XHRcdFx0dGhlYWQgKz0gJzx0aCcgKyAoKGRvdyArIGZpcnN0RGF5ICsgNikgJSA3ID49IDUgPyAnIGNsYXNzPVwidWktZGF0ZXBpY2tlci13ZWVrLWVuZFwiJyA6ICcnKSArICc+JyArXG5cdFx0XHRcdFx0XHQnPHNwYW4gdGl0bGU9XCInICsgZGF5TmFtZXNbZGF5XSArICdcIj4nICsgZGF5TmFtZXNNaW5bZGF5XSArICc8L3NwYW4+PC90aD4nO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhbGVuZGVyICs9IHRoZWFkICsgJzwvdHI+PC90aGVhZD48dGJvZHk+Jztcblx0XHRcdFx0dmFyIGRheXNJbk1vbnRoID0gdGhpcy5fZ2V0RGF5c0luTW9udGgoZHJhd1llYXIsIGRyYXdNb250aCk7XG5cdFx0XHRcdGlmIChkcmF3WWVhciA9PSBpbnN0LnNlbGVjdGVkWWVhciAmJiBkcmF3TW9udGggPT0gaW5zdC5zZWxlY3RlZE1vbnRoKVxuXHRcdFx0XHRcdGluc3Quc2VsZWN0ZWREYXkgPSBNYXRoLm1pbihpbnN0LnNlbGVjdGVkRGF5LCBkYXlzSW5Nb250aCk7XG5cdFx0XHRcdHZhciBsZWFkRGF5cyA9ICh0aGlzLl9nZXRGaXJzdERheU9mTW9udGgoZHJhd1llYXIsIGRyYXdNb250aCkgLSBmaXJzdERheSArIDcpICUgNztcblx0XHRcdFx0dmFyIGN1clJvd3MgPSBNYXRoLmNlaWwoKGxlYWREYXlzICsgZGF5c0luTW9udGgpIC8gNyk7IC8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHJvd3MgdG8gZ2VuZXJhdGVcblx0XHRcdFx0dmFyIG51bVJvd3MgPSAoaXNNdWx0aU1vbnRoID8gdGhpcy5tYXhSb3dzID4gY3VyUm93cyA/IHRoaXMubWF4Um93cyA6IGN1clJvd3MgOiBjdXJSb3dzKTsgLy9JZiBtdWx0aXBsZSBtb250aHMsIHVzZSB0aGUgaGlnaGVyIG51bWJlciBvZiByb3dzIChzZWUgIzcwNDMpXG5cdFx0XHRcdHRoaXMubWF4Um93cyA9IG51bVJvd3M7XG5cdFx0XHRcdHZhciBwcmludERhdGUgPSB0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkcmF3WWVhciwgZHJhd01vbnRoLCAxIC0gbGVhZERheXMpKTtcblx0XHRcdFx0Zm9yICh2YXIgZFJvdyA9IDA7IGRSb3cgPCBudW1Sb3dzOyBkUm93KyspIHsgLy8gY3JlYXRlIGRhdGUgcGlja2VyIHJvd3Ncblx0XHRcdFx0XHRjYWxlbmRlciArPSAnPHRyPic7XG5cdFx0XHRcdFx0dmFyIHRib2R5ID0gKCFzaG93V2VlayA/ICcnIDogJzx0ZCBjbGFzcz1cInVpLWRhdGVwaWNrZXItd2Vlay1jb2xcIj4nICtcblx0XHRcdFx0XHRcdHRoaXMuX2dldChpbnN0LCAnY2FsY3VsYXRlV2VlaycpKHByaW50RGF0ZSkgKyAnPC90ZD4nKTtcblx0XHRcdFx0XHRmb3IgKHZhciBkb3cgPSAwOyBkb3cgPCA3OyBkb3crKykgeyAvLyBjcmVhdGUgZGF0ZSBwaWNrZXIgZGF5c1xuXHRcdFx0XHRcdFx0dmFyIGRheVNldHRpbmdzID0gKGJlZm9yZVNob3dEYXkgP1xuXHRcdFx0XHRcdFx0XHRiZWZvcmVTaG93RGF5LmFwcGx5KChpbnN0LmlucHV0ID8gaW5zdC5pbnB1dFswXSA6IG51bGwpLCBbcHJpbnREYXRlXSkgOiBbdHJ1ZSwgJyddKTtcblx0XHRcdFx0XHRcdHZhciBvdGhlck1vbnRoID0gKHByaW50RGF0ZS5nZXRNb250aCgpICE9IGRyYXdNb250aCk7XG5cdFx0XHRcdFx0XHR2YXIgdW5zZWxlY3RhYmxlID0gKG90aGVyTW9udGggJiYgIXNlbGVjdE90aGVyTW9udGhzKSB8fCAhZGF5U2V0dGluZ3NbMF0gfHxcblx0XHRcdFx0XHRcdFx0KG1pbkRhdGUgJiYgcHJpbnREYXRlIDwgbWluRGF0ZSkgfHwgKG1heERhdGUgJiYgcHJpbnREYXRlID4gbWF4RGF0ZSk7XG5cdFx0XHRcdFx0XHR0Ym9keSArPSAnPHRkIGNsYXNzPVwiJyArXG5cdFx0XHRcdFx0XHRcdCgoZG93ICsgZmlyc3REYXkgKyA2KSAlIDcgPj0gNSA/ICcgdWktZGF0ZXBpY2tlci13ZWVrLWVuZCcgOiAnJykgKyAvLyBoaWdobGlnaHQgd2Vla2VuZHNcblx0XHRcdFx0XHRcdFx0KG90aGVyTW9udGggPyAnIHVpLWRhdGVwaWNrZXItb3RoZXItbW9udGgnIDogJycpICsgLy8gaGlnaGxpZ2h0IGRheXMgZnJvbSBvdGhlciBtb250aHNcblx0XHRcdFx0XHRcdFx0KChwcmludERhdGUuZ2V0VGltZSgpID09IHNlbGVjdGVkRGF0ZS5nZXRUaW1lKCkgJiYgZHJhd01vbnRoID09IGluc3Quc2VsZWN0ZWRNb250aCAmJiBpbnN0Ll9rZXlFdmVudCkgfHwgLy8gdXNlciBwcmVzc2VkIGtleVxuXHRcdFx0XHRcdFx0XHQoZGVmYXVsdERhdGUuZ2V0VGltZSgpID09IHByaW50RGF0ZS5nZXRUaW1lKCkgJiYgZGVmYXVsdERhdGUuZ2V0VGltZSgpID09IHNlbGVjdGVkRGF0ZS5nZXRUaW1lKCkpID9cblx0XHRcdFx0XHRcdFx0Ly8gb3IgZGVmYXVsdERhdGUgaXMgY3VycmVudCBwcmludGVkRGF0ZSBhbmQgZGVmYXVsdERhdGUgaXMgc2VsZWN0ZWREYXRlXG5cdFx0XHRcdFx0XHRcdCcgJyArIHRoaXMuX2RheU92ZXJDbGFzcyA6ICcnKSArIC8vIGhpZ2hsaWdodCBzZWxlY3RlZCBkYXlcblx0XHRcdFx0XHRcdFx0KHVuc2VsZWN0YWJsZSA/ICcgJyArIHRoaXMuX3Vuc2VsZWN0YWJsZUNsYXNzICsgJyB1aS1zdGF0ZS1kaXNhYmxlZCc6ICcnKSArICAvLyBoaWdobGlnaHQgdW5zZWxlY3RhYmxlIGRheXNcblx0XHRcdFx0XHRcdFx0KG90aGVyTW9udGggJiYgIXNob3dPdGhlck1vbnRocyA/ICcnIDogJyAnICsgZGF5U2V0dGluZ3NbMV0gKyAvLyBoaWdobGlnaHQgY3VzdG9tIGRhdGVzXG5cdFx0XHRcdFx0XHRcdChwcmludERhdGUuZ2V0VGltZSgpID09IGN1cnJlbnREYXRlLmdldFRpbWUoKSA/ICcgJyArIHRoaXMuX2N1cnJlbnRDbGFzcyA6ICcnKSArIC8vIGhpZ2hsaWdodCBzZWxlY3RlZCBkYXlcblx0XHRcdFx0XHRcdFx0KHByaW50RGF0ZS5nZXRUaW1lKCkgPT0gdG9kYXkuZ2V0VGltZSgpID8gJyB1aS1kYXRlcGlja2VyLXRvZGF5JyA6ICcnKSkgKyAnXCInICsgLy8gaGlnaGxpZ2h0IHRvZGF5IChpZiBkaWZmZXJlbnQpXG5cdFx0XHRcdFx0XHRcdCgoIW90aGVyTW9udGggfHwgc2hvd090aGVyTW9udGhzKSAmJiBkYXlTZXR0aW5nc1syXSA/ICcgdGl0bGU9XCInICsgZGF5U2V0dGluZ3NbMl0gKyAnXCInIDogJycpICsgLy8gY2VsbCB0aXRsZVxuXHRcdFx0XHRcdFx0XHQodW5zZWxlY3RhYmxlID8gJycgOiAnIGRhdGEtaGFuZGxlcj1cInNlbGVjdERheVwiIGRhdGEtZXZlbnQ9XCJjbGlja1wiIGRhdGEtbW9udGg9XCInICsgcHJpbnREYXRlLmdldE1vbnRoKCkgKyAnXCIgZGF0YS15ZWFyPVwiJyArIHByaW50RGF0ZS5nZXRGdWxsWWVhcigpICsgJ1wiJykgKyAnPicgKyAvLyBhY3Rpb25zXG5cdFx0XHRcdFx0XHRcdChvdGhlck1vbnRoICYmICFzaG93T3RoZXJNb250aHMgPyAnJiN4YTA7JyA6IC8vIGRpc3BsYXkgZm9yIG90aGVyIG1vbnRoc1xuXHRcdFx0XHRcdFx0XHQodW5zZWxlY3RhYmxlID8gJzxzcGFuIGNsYXNzPVwidWktc3RhdGUtZGVmYXVsdFwiPicgKyBwcmludERhdGUuZ2V0RGF0ZSgpICsgJzwvc3Bhbj4nIDogJzxhIGNsYXNzPVwidWktc3RhdGUtZGVmYXVsdCcgK1xuXHRcdFx0XHRcdFx0XHQocHJpbnREYXRlLmdldFRpbWUoKSA9PSB0b2RheS5nZXRUaW1lKCkgPyAnIHVpLXN0YXRlLWhpZ2hsaWdodCcgOiAnJykgK1xuXHRcdFx0XHRcdFx0XHQocHJpbnREYXRlLmdldFRpbWUoKSA9PSBjdXJyZW50RGF0ZS5nZXRUaW1lKCkgPyAnIHVpLXN0YXRlLWFjdGl2ZScgOiAnJykgKyAvLyBoaWdobGlnaHQgc2VsZWN0ZWQgZGF5XG5cdFx0XHRcdFx0XHRcdChvdGhlck1vbnRoID8gJyB1aS1wcmlvcml0eS1zZWNvbmRhcnknIDogJycpICsgLy8gZGlzdGluZ3Vpc2ggZGF0ZXMgZnJvbSBvdGhlciBtb250aHNcblx0XHRcdFx0XHRcdFx0J1wiIGhyZWY9XCIjXCI+JyArIHByaW50RGF0ZS5nZXREYXRlKCkgKyAnPC9hPicpKSArICc8L3RkPic7IC8vIGRpc3BsYXkgc2VsZWN0YWJsZSBkYXRlXG5cdFx0XHRcdFx0XHRwcmludERhdGUuc2V0RGF0ZShwcmludERhdGUuZ2V0RGF0ZSgpICsgMSk7XG5cdFx0XHRcdFx0XHRwcmludERhdGUgPSB0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChwcmludERhdGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjYWxlbmRlciArPSB0Ym9keSArICc8L3RyPic7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZHJhd01vbnRoKys7XG5cdFx0XHRcdGlmIChkcmF3TW9udGggPiAxMSkge1xuXHRcdFx0XHRcdGRyYXdNb250aCA9IDA7XG5cdFx0XHRcdFx0ZHJhd1llYXIrKztcblx0XHRcdFx0fVxuXHRcdFx0XHRjYWxlbmRlciArPSAnPC90Ym9keT48L3RhYmxlPicgKyAoaXNNdWx0aU1vbnRoID8gJzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0XHQoKG51bU1vbnRoc1swXSA+IDAgJiYgY29sID09IG51bU1vbnRoc1sxXS0xKSA/ICc8ZGl2IGNsYXNzPVwidWktZGF0ZXBpY2tlci1yb3ctYnJlYWtcIj48L2Rpdj4nIDogJycpIDogJycpO1xuXHRcdFx0XHRncm91cCArPSBjYWxlbmRlcjtcblx0XHRcdH1cblx0XHRcdGh0bWwgKz0gZ3JvdXA7XG5cdFx0fVxuXHRcdGh0bWwgKz0gYnV0dG9uUGFuZWwgKyAoJC51aS5pZTYgJiYgIWluc3QuaW5saW5lID9cblx0XHRcdCc8aWZyYW1lIHNyYz1cImphdmFzY3JpcHQ6ZmFsc2U7XCIgY2xhc3M9XCJ1aS1kYXRlcGlja2VyLWNvdmVyXCIgZnJhbWVib3JkZXI9XCIwXCI+PC9pZnJhbWU+JyA6ICcnKTtcblx0XHRpbnN0Ll9rZXlFdmVudCA9IGZhbHNlO1xuXHRcdHJldHVybiBodG1sO1xuXHR9LFxuXG5cdC8qIEdlbmVyYXRlIHRoZSBtb250aCBhbmQgeWVhciBoZWFkZXIuICovXG5cdF9nZW5lcmF0ZU1vbnRoWWVhckhlYWRlcjogZnVuY3Rpb24oaW5zdCwgZHJhd01vbnRoLCBkcmF3WWVhciwgbWluRGF0ZSwgbWF4RGF0ZSxcblx0XHRcdHNlY29uZGFyeSwgbW9udGhOYW1lcywgbW9udGhOYW1lc1Nob3J0KSB7XG5cdFx0dmFyIGNoYW5nZU1vbnRoID0gdGhpcy5fZ2V0KGluc3QsICdjaGFuZ2VNb250aCcpO1xuXHRcdHZhciBjaGFuZ2VZZWFyID0gdGhpcy5fZ2V0KGluc3QsICdjaGFuZ2VZZWFyJyk7XG5cdFx0dmFyIHNob3dNb250aEFmdGVyWWVhciA9IHRoaXMuX2dldChpbnN0LCAnc2hvd01vbnRoQWZ0ZXJZZWFyJyk7XG5cdFx0dmFyIGh0bWwgPSAnPGRpdiBjbGFzcz1cInVpLWRhdGVwaWNrZXItdGl0bGVcIj4nO1xuXHRcdHZhciBtb250aEh0bWwgPSAnJztcblx0XHQvLyBtb250aCBzZWxlY3Rpb25cblx0XHRpZiAoc2Vjb25kYXJ5IHx8ICFjaGFuZ2VNb250aClcblx0XHRcdG1vbnRoSHRtbCArPSAnPHNwYW4gY2xhc3M9XCJ1aS1kYXRlcGlja2VyLW1vbnRoXCI+JyArIG1vbnRoTmFtZXNbZHJhd01vbnRoXSArICc8L3NwYW4+Jztcblx0XHRlbHNlIHtcblx0XHRcdHZhciBpbk1pblllYXIgPSAobWluRGF0ZSAmJiBtaW5EYXRlLmdldEZ1bGxZZWFyKCkgPT0gZHJhd1llYXIpO1xuXHRcdFx0dmFyIGluTWF4WWVhciA9IChtYXhEYXRlICYmIG1heERhdGUuZ2V0RnVsbFllYXIoKSA9PSBkcmF3WWVhcik7XG5cdFx0XHRtb250aEh0bWwgKz0gJzxzZWxlY3QgY2xhc3M9XCJ1aS1kYXRlcGlja2VyLW1vbnRoXCIgZGF0YS1oYW5kbGVyPVwic2VsZWN0TW9udGhcIiBkYXRhLWV2ZW50PVwiY2hhbmdlXCI+Jztcblx0XHRcdGZvciAodmFyIG1vbnRoID0gMDsgbW9udGggPCAxMjsgbW9udGgrKykge1xuXHRcdFx0XHRpZiAoKCFpbk1pblllYXIgfHwgbW9udGggPj0gbWluRGF0ZS5nZXRNb250aCgpKSAmJlxuXHRcdFx0XHRcdFx0KCFpbk1heFllYXIgfHwgbW9udGggPD0gbWF4RGF0ZS5nZXRNb250aCgpKSlcblx0XHRcdFx0XHRtb250aEh0bWwgKz0gJzxvcHRpb24gdmFsdWU9XCInICsgbW9udGggKyAnXCInICtcblx0XHRcdFx0XHRcdChtb250aCA9PSBkcmF3TW9udGggPyAnIHNlbGVjdGVkPVwic2VsZWN0ZWRcIicgOiAnJykgK1xuXHRcdFx0XHRcdFx0Jz4nICsgbW9udGhOYW1lc1Nob3J0W21vbnRoXSArICc8L29wdGlvbj4nO1xuXHRcdFx0fVxuXHRcdFx0bW9udGhIdG1sICs9ICc8L3NlbGVjdD4nO1xuXHRcdH1cblx0XHRpZiAoIXNob3dNb250aEFmdGVyWWVhcilcblx0XHRcdGh0bWwgKz0gbW9udGhIdG1sICsgKHNlY29uZGFyeSB8fCAhKGNoYW5nZU1vbnRoICYmIGNoYW5nZVllYXIpID8gJyYjeGEwOycgOiAnJyk7XG5cdFx0Ly8geWVhciBzZWxlY3Rpb25cblx0XHRpZiAoICFpbnN0LnllYXJzaHRtbCApIHtcblx0XHRcdGluc3QueWVhcnNodG1sID0gJyc7XG5cdFx0XHRpZiAoc2Vjb25kYXJ5IHx8ICFjaGFuZ2VZZWFyKVxuXHRcdFx0XHRodG1sICs9ICc8c3BhbiBjbGFzcz1cInVpLWRhdGVwaWNrZXIteWVhclwiPicgKyBkcmF3WWVhciArICc8L3NwYW4+Jztcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHQvLyBkZXRlcm1pbmUgcmFuZ2Ugb2YgeWVhcnMgdG8gZGlzcGxheVxuXHRcdFx0XHR2YXIgeWVhcnMgPSB0aGlzLl9nZXQoaW5zdCwgJ3llYXJSYW5nZScpLnNwbGl0KCc6Jyk7XG5cdFx0XHRcdHZhciB0aGlzWWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcblx0XHRcdFx0dmFyIGRldGVybWluZVllYXIgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0XHRcdHZhciB5ZWFyID0gKHZhbHVlLm1hdGNoKC9jWystXS4qLykgPyBkcmF3WWVhciArIHBhcnNlSW50KHZhbHVlLnN1YnN0cmluZygxKSwgMTApIDpcblx0XHRcdFx0XHRcdCh2YWx1ZS5tYXRjaCgvWystXS4qLykgPyB0aGlzWWVhciArIHBhcnNlSW50KHZhbHVlLCAxMCkgOlxuXHRcdFx0XHRcdFx0cGFyc2VJbnQodmFsdWUsIDEwKSkpO1xuXHRcdFx0XHRcdHJldHVybiAoaXNOYU4oeWVhcikgPyB0aGlzWWVhciA6IHllYXIpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHR2YXIgeWVhciA9IGRldGVybWluZVllYXIoeWVhcnNbMF0pO1xuXHRcdFx0XHR2YXIgZW5kWWVhciA9IE1hdGgubWF4KHllYXIsIGRldGVybWluZVllYXIoeWVhcnNbMV0gfHwgJycpKTtcblx0XHRcdFx0eWVhciA9IChtaW5EYXRlID8gTWF0aC5tYXgoeWVhciwgbWluRGF0ZS5nZXRGdWxsWWVhcigpKSA6IHllYXIpO1xuXHRcdFx0XHRlbmRZZWFyID0gKG1heERhdGUgPyBNYXRoLm1pbihlbmRZZWFyLCBtYXhEYXRlLmdldEZ1bGxZZWFyKCkpIDogZW5kWWVhcik7XG5cdFx0XHRcdGluc3QueWVhcnNodG1sICs9ICc8c2VsZWN0IGNsYXNzPVwidWktZGF0ZXBpY2tlci15ZWFyXCIgZGF0YS1oYW5kbGVyPVwic2VsZWN0WWVhclwiIGRhdGEtZXZlbnQ9XCJjaGFuZ2VcIj4nO1xuXHRcdFx0XHRmb3IgKDsgeWVhciA8PSBlbmRZZWFyOyB5ZWFyKyspIHtcblx0XHRcdFx0XHRpbnN0LnllYXJzaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyB5ZWFyICsgJ1wiJyArXG5cdFx0XHRcdFx0XHQoeWVhciA9PSBkcmF3WWVhciA/ICcgc2VsZWN0ZWQ9XCJzZWxlY3RlZFwiJyA6ICcnKSArXG5cdFx0XHRcdFx0XHQnPicgKyB5ZWFyICsgJzwvb3B0aW9uPic7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5zdC55ZWFyc2h0bWwgKz0gJzwvc2VsZWN0Pic7XG5cblx0XHRcdFx0aHRtbCArPSBpbnN0LnllYXJzaHRtbDtcblx0XHRcdFx0aW5zdC55ZWFyc2h0bWwgPSBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRodG1sICs9IHRoaXMuX2dldChpbnN0LCAneWVhclN1ZmZpeCcpO1xuXHRcdGlmIChzaG93TW9udGhBZnRlclllYXIpXG5cdFx0XHRodG1sICs9IChzZWNvbmRhcnkgfHwgIShjaGFuZ2VNb250aCAmJiBjaGFuZ2VZZWFyKSA/ICcmI3hhMDsnIDogJycpICsgbW9udGhIdG1sO1xuXHRcdGh0bWwgKz0gJzwvZGl2Pic7IC8vIENsb3NlIGRhdGVwaWNrZXJfaGVhZGVyXG5cdFx0cmV0dXJuIGh0bWw7XG5cdH0sXG5cblx0LyogQWRqdXN0IG9uZSBvZiB0aGUgZGF0ZSBzdWItZmllbGRzLiAqL1xuXHRfYWRqdXN0SW5zdERhdGU6IGZ1bmN0aW9uKGluc3QsIG9mZnNldCwgcGVyaW9kKSB7XG5cdFx0dmFyIHllYXIgPSBpbnN0LmRyYXdZZWFyICsgKHBlcmlvZCA9PSAnWScgPyBvZmZzZXQgOiAwKTtcblx0XHR2YXIgbW9udGggPSBpbnN0LmRyYXdNb250aCArIChwZXJpb2QgPT0gJ00nID8gb2Zmc2V0IDogMCk7XG5cdFx0dmFyIGRheSA9IE1hdGgubWluKGluc3Quc2VsZWN0ZWREYXksIHRoaXMuX2dldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSkgK1xuXHRcdFx0KHBlcmlvZCA9PSAnRCcgPyBvZmZzZXQgOiAwKTtcblx0XHR2YXIgZGF0ZSA9IHRoaXMuX3Jlc3RyaWN0TWluTWF4KGluc3QsXG5cdFx0XHR0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KSkpO1xuXHRcdGluc3Quc2VsZWN0ZWREYXkgPSBkYXRlLmdldERhdGUoKTtcblx0XHRpbnN0LmRyYXdNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcblx0XHRpbnN0LmRyYXdZZWFyID0gaW5zdC5zZWxlY3RlZFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cdFx0aWYgKHBlcmlvZCA9PSAnTScgfHwgcGVyaW9kID09ICdZJylcblx0XHRcdHRoaXMuX25vdGlmeUNoYW5nZShpbnN0KTtcblx0fSxcblxuXHQvKiBFbnN1cmUgYSBkYXRlIGlzIHdpdGhpbiBhbnkgbWluL21heCBib3VuZHMuICovXG5cdF9yZXN0cmljdE1pbk1heDogZnVuY3Rpb24oaW5zdCwgZGF0ZSkge1xuXHRcdHZhciBtaW5EYXRlID0gdGhpcy5fZ2V0TWluTWF4RGF0ZShpbnN0LCAnbWluJyk7XG5cdFx0dmFyIG1heERhdGUgPSB0aGlzLl9nZXRNaW5NYXhEYXRlKGluc3QsICdtYXgnKTtcblx0XHR2YXIgbmV3RGF0ZSA9IChtaW5EYXRlICYmIGRhdGUgPCBtaW5EYXRlID8gbWluRGF0ZSA6IGRhdGUpO1xuXHRcdG5ld0RhdGUgPSAobWF4RGF0ZSAmJiBuZXdEYXRlID4gbWF4RGF0ZSA/IG1heERhdGUgOiBuZXdEYXRlKTtcblx0XHRyZXR1cm4gbmV3RGF0ZTtcblx0fSxcblxuXHQvKiBOb3RpZnkgY2hhbmdlIG9mIG1vbnRoL3llYXIuICovXG5cdF9ub3RpZnlDaGFuZ2U6IGZ1bmN0aW9uKGluc3QpIHtcblx0XHR2YXIgb25DaGFuZ2UgPSB0aGlzLl9nZXQoaW5zdCwgJ29uQ2hhbmdlTW9udGhZZWFyJyk7XG5cdFx0aWYgKG9uQ2hhbmdlKVxuXHRcdFx0b25DaGFuZ2UuYXBwbHkoKGluc3QuaW5wdXQgPyBpbnN0LmlucHV0WzBdIDogbnVsbCksXG5cdFx0XHRcdFtpbnN0LnNlbGVjdGVkWWVhciwgaW5zdC5zZWxlY3RlZE1vbnRoICsgMSwgaW5zdF0pO1xuXHR9LFxuXG5cdC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIG1vbnRocyB0byBzaG93LiAqL1xuXHRfZ2V0TnVtYmVyT2ZNb250aHM6IGZ1bmN0aW9uKGluc3QpIHtcblx0XHR2YXIgbnVtTW9udGhzID0gdGhpcy5fZ2V0KGluc3QsICdudW1iZXJPZk1vbnRocycpO1xuXHRcdHJldHVybiAobnVtTW9udGhzID09IG51bGwgPyBbMSwgMV0gOiAodHlwZW9mIG51bU1vbnRocyA9PSAnbnVtYmVyJyA/IFsxLCBudW1Nb250aHNdIDogbnVtTW9udGhzKSk7XG5cdH0sXG5cblx0LyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IG1heGltdW0gZGF0ZSAtIGVuc3VyZSBubyB0aW1lIGNvbXBvbmVudHMgYXJlIHNldC4gKi9cblx0X2dldE1pbk1heERhdGU6IGZ1bmN0aW9uKGluc3QsIG1pbk1heCkge1xuXHRcdHJldHVybiB0aGlzLl9kZXRlcm1pbmVEYXRlKGluc3QsIHRoaXMuX2dldChpbnN0LCBtaW5NYXggKyAnRGF0ZScpLCBudWxsKTtcblx0fSxcblxuXHQvKiBGaW5kIHRoZSBudW1iZXIgb2YgZGF5cyBpbiBhIGdpdmVuIG1vbnRoLiAqL1xuXHRfZ2V0RGF5c0luTW9udGg6IGZ1bmN0aW9uKHllYXIsIG1vbnRoKSB7XG5cdFx0cmV0dXJuIDMyIC0gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoeWVhciwgbW9udGgsIDMyKSkuZ2V0RGF0ZSgpO1xuXHR9LFxuXG5cdC8qIEZpbmQgdGhlIGRheSBvZiB0aGUgd2VlayBvZiB0aGUgZmlyc3Qgb2YgYSBtb250aC4gKi9cblx0X2dldEZpcnN0RGF5T2ZNb250aDogZnVuY3Rpb24oeWVhciwgbW9udGgpIHtcblx0XHRyZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpLmdldERheSgpO1xuXHR9LFxuXG5cdC8qIERldGVybWluZXMgaWYgd2Ugc2hvdWxkIGFsbG93IGEgXCJuZXh0L3ByZXZcIiBtb250aCBkaXNwbGF5IGNoYW5nZS4gKi9cblx0X2NhbkFkanVzdE1vbnRoOiBmdW5jdGlvbihpbnN0LCBvZmZzZXQsIGN1clllYXIsIGN1ck1vbnRoKSB7XG5cdFx0dmFyIG51bU1vbnRocyA9IHRoaXMuX2dldE51bWJlck9mTW9udGhzKGluc3QpO1xuXHRcdHZhciBkYXRlID0gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoY3VyWWVhcixcblx0XHRcdGN1ck1vbnRoICsgKG9mZnNldCA8IDAgPyBvZmZzZXQgOiBudW1Nb250aHNbMF0gKiBudW1Nb250aHNbMV0pLCAxKSk7XG5cdFx0aWYgKG9mZnNldCA8IDApXG5cdFx0XHRkYXRlLnNldERhdGUodGhpcy5fZ2V0RGF5c0luTW9udGgoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkpKTtcblx0XHRyZXR1cm4gdGhpcy5faXNJblJhbmdlKGluc3QsIGRhdGUpO1xuXHR9LFxuXG5cdC8qIElzIHRoZSBnaXZlbiBkYXRlIGluIHRoZSBhY2NlcHRlZCByYW5nZT8gKi9cblx0X2lzSW5SYW5nZTogZnVuY3Rpb24oaW5zdCwgZGF0ZSkge1xuXHRcdHZhciBtaW5EYXRlID0gdGhpcy5fZ2V0TWluTWF4RGF0ZShpbnN0LCAnbWluJyk7XG5cdFx0dmFyIG1heERhdGUgPSB0aGlzLl9nZXRNaW5NYXhEYXRlKGluc3QsICdtYXgnKTtcblx0XHRyZXR1cm4gKCghbWluRGF0ZSB8fCBkYXRlLmdldFRpbWUoKSA+PSBtaW5EYXRlLmdldFRpbWUoKSkgJiZcblx0XHRcdCghbWF4RGF0ZSB8fCBkYXRlLmdldFRpbWUoKSA8PSBtYXhEYXRlLmdldFRpbWUoKSkpO1xuXHR9LFxuXG5cdC8qIFByb3ZpZGUgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGZvcm1hdHRpbmcvcGFyc2luZy4gKi9cblx0X2dldEZvcm1hdENvbmZpZzogZnVuY3Rpb24oaW5zdCkge1xuXHRcdHZhciBzaG9ydFllYXJDdXRvZmYgPSB0aGlzLl9nZXQoaW5zdCwgJ3Nob3J0WWVhckN1dG9mZicpO1xuXHRcdHNob3J0WWVhckN1dG9mZiA9ICh0eXBlb2Ygc2hvcnRZZWFyQ3V0b2ZmICE9ICdzdHJpbmcnID8gc2hvcnRZZWFyQ3V0b2ZmIDpcblx0XHRcdG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAlIDEwMCArIHBhcnNlSW50KHNob3J0WWVhckN1dG9mZiwgMTApKTtcblx0XHRyZXR1cm4ge3Nob3J0WWVhckN1dG9mZjogc2hvcnRZZWFyQ3V0b2ZmLFxuXHRcdFx0ZGF5TmFtZXNTaG9ydDogdGhpcy5fZ2V0KGluc3QsICdkYXlOYW1lc1Nob3J0JyksIGRheU5hbWVzOiB0aGlzLl9nZXQoaW5zdCwgJ2RheU5hbWVzJyksXG5cdFx0XHRtb250aE5hbWVzU2hvcnQ6IHRoaXMuX2dldChpbnN0LCAnbW9udGhOYW1lc1Nob3J0JyksIG1vbnRoTmFtZXM6IHRoaXMuX2dldChpbnN0LCAnbW9udGhOYW1lcycpfTtcblx0fSxcblxuXHQvKiBGb3JtYXQgdGhlIGdpdmVuIGRhdGUgZm9yIGRpc3BsYXkuICovXG5cdF9mb3JtYXREYXRlOiBmdW5jdGlvbihpbnN0LCBkYXksIG1vbnRoLCB5ZWFyKSB7XG5cdFx0aWYgKCFkYXkpIHtcblx0XHRcdGluc3QuY3VycmVudERheSA9IGluc3Quc2VsZWN0ZWREYXk7XG5cdFx0XHRpbnN0LmN1cnJlbnRNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aDtcblx0XHRcdGluc3QuY3VycmVudFllYXIgPSBpbnN0LnNlbGVjdGVkWWVhcjtcblx0XHR9XG5cdFx0dmFyIGRhdGUgPSAoZGF5ID8gKHR5cGVvZiBkYXkgPT0gJ29iamVjdCcgPyBkYXkgOlxuXHRcdFx0dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoeWVhciwgbW9udGgsIGRheSkpKSA6XG5cdFx0XHR0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShpbnN0LmN1cnJlbnRZZWFyLCBpbnN0LmN1cnJlbnRNb250aCwgaW5zdC5jdXJyZW50RGF5KSkpO1xuXHRcdHJldHVybiB0aGlzLmZvcm1hdERhdGUodGhpcy5fZ2V0KGluc3QsICdkYXRlRm9ybWF0JyksIGRhdGUsIHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSk7XG5cdH1cbn0pO1xuXG4vKlxuICogQmluZCBob3ZlciBldmVudHMgZm9yIGRhdGVwaWNrZXIgZWxlbWVudHMuXG4gKiBEb25lIHZpYSBkZWxlZ2F0ZSBzbyB0aGUgYmluZGluZyBvbmx5IG9jY3VycyBvbmNlIGluIHRoZSBsaWZldGltZSBvZiB0aGUgcGFyZW50IGRpdi5cbiAqIEdsb2JhbCBpbnN0QWN0aXZlLCBzZXQgYnkgX3VwZGF0ZURhdGVwaWNrZXIgYWxsb3dzIHRoZSBoYW5kbGVycyB0byBmaW5kIHRoZWlyIHdheSBiYWNrIHRvIHRoZSBhY3RpdmUgcGlja2VyLlxuICovXG5mdW5jdGlvbiBiaW5kSG92ZXIoZHBEaXYpIHtcblx0dmFyIHNlbGVjdG9yID0gJ2J1dHRvbiwgLnVpLWRhdGVwaWNrZXItcHJldiwgLnVpLWRhdGVwaWNrZXItbmV4dCwgLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIgdGQgYSc7XG5cdHJldHVybiBkcERpdi5kZWxlZ2F0ZShzZWxlY3RvciwgJ21vdXNlb3V0JywgZnVuY3Rpb24oKSB7XG5cdFx0XHQkKHRoaXMpLnJlbW92ZUNsYXNzKCd1aS1zdGF0ZS1ob3ZlcicpO1xuXHRcdFx0aWYgKHRoaXMuY2xhc3NOYW1lLmluZGV4T2YoJ3VpLWRhdGVwaWNrZXItcHJldicpICE9IC0xKSAkKHRoaXMpLnJlbW92ZUNsYXNzKCd1aS1kYXRlcGlja2VyLXByZXYtaG92ZXInKTtcblx0XHRcdGlmICh0aGlzLmNsYXNzTmFtZS5pbmRleE9mKCd1aS1kYXRlcGlja2VyLW5leHQnKSAhPSAtMSkgJCh0aGlzKS5yZW1vdmVDbGFzcygndWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyJyk7XG5cdFx0fSlcblx0XHQuZGVsZWdhdGUoc2VsZWN0b3IsICdtb3VzZW92ZXInLCBmdW5jdGlvbigpe1xuXHRcdFx0aWYgKCEkLmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKCBpbnN0QWN0aXZlLmlubGluZSA/IGRwRGl2LnBhcmVudCgpWzBdIDogaW5zdEFjdGl2ZS5pbnB1dFswXSkpIHtcblx0XHRcdFx0JCh0aGlzKS5wYXJlbnRzKCcudWktZGF0ZXBpY2tlci1jYWxlbmRhcicpLmZpbmQoJ2EnKS5yZW1vdmVDbGFzcygndWktc3RhdGUtaG92ZXInKTtcblx0XHRcdFx0JCh0aGlzKS5hZGRDbGFzcygndWktc3RhdGUtaG92ZXInKTtcblx0XHRcdFx0aWYgKHRoaXMuY2xhc3NOYW1lLmluZGV4T2YoJ3VpLWRhdGVwaWNrZXItcHJldicpICE9IC0xKSAkKHRoaXMpLmFkZENsYXNzKCd1aS1kYXRlcGlja2VyLXByZXYtaG92ZXInKTtcblx0XHRcdFx0aWYgKHRoaXMuY2xhc3NOYW1lLmluZGV4T2YoJ3VpLWRhdGVwaWNrZXItbmV4dCcpICE9IC0xKSAkKHRoaXMpLmFkZENsYXNzKCd1aS1kYXRlcGlja2VyLW5leHQtaG92ZXInKTtcblx0XHRcdH1cblx0XHR9KTtcbn1cblxuLyogalF1ZXJ5IGV4dGVuZCBub3cgaWdub3JlcyBudWxscyEgKi9cbmZ1bmN0aW9uIGV4dGVuZFJlbW92ZSh0YXJnZXQsIHByb3BzKSB7XG5cdCQuZXh0ZW5kKHRhcmdldCwgcHJvcHMpO1xuXHRmb3IgKHZhciBuYW1lIGluIHByb3BzKVxuXHRcdGlmIChwcm9wc1tuYW1lXSA9PSBudWxsIHx8IHByb3BzW25hbWVdID09IHVuZGVmaW5lZClcblx0XHRcdHRhcmdldFtuYW1lXSA9IHByb3BzW25hbWVdO1xuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxuLyogSW52b2tlIHRoZSBkYXRlcGlja2VyIGZ1bmN0aW9uYWxpdHkuXG4gICBAcGFyYW0gIG9wdGlvbnMgIHN0cmluZyAtIGEgY29tbWFuZCwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgb3Jcblx0ICAgICAgICAgICAgICAgIE9iamVjdCAtIHNldHRpbmdzIGZvciBhdHRhY2hpbmcgbmV3IGRhdGVwaWNrZXIgZnVuY3Rpb25hbGl0eVxuICAgQHJldHVybiAgalF1ZXJ5IG9iamVjdCAqL1xuJC5mbi5kYXRlcGlja2VyID0gZnVuY3Rpb24ob3B0aW9ucyl7XG5cblx0LyogVmVyaWZ5IGFuIGVtcHR5IGNvbGxlY3Rpb24gd2Fzbid0IHBhc3NlZCAtIEZpeGVzICM2OTc2ICovXG5cdGlmICggIXRoaXMubGVuZ3RoICkge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyogSW5pdGlhbGlzZSB0aGUgZGF0ZSBwaWNrZXIuICovXG5cdGlmICghJC5kYXRlcGlja2VyLmluaXRpYWxpemVkKSB7XG5cdFx0JChkb2N1bWVudCkubW91c2Vkb3duKCQuZGF0ZXBpY2tlci5fY2hlY2tFeHRlcm5hbENsaWNrKS5cblx0XHRcdGZpbmQoZG9jdW1lbnQuYm9keSkuYXBwZW5kKCQuZGF0ZXBpY2tlci5kcERpdik7XG5cdFx0JC5kYXRlcGlja2VyLmluaXRpYWxpemVkID0gdHJ1ZTtcblx0fVxuXG5cdHZhciBvdGhlckFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXHRpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ3N0cmluZycgJiYgKG9wdGlvbnMgPT0gJ2lzRGlzYWJsZWQnIHx8IG9wdGlvbnMgPT0gJ2dldERhdGUnIHx8IG9wdGlvbnMgPT0gJ3dpZGdldCcpKVxuXHRcdHJldHVybiAkLmRhdGVwaWNrZXJbJ18nICsgb3B0aW9ucyArICdEYXRlcGlja2VyJ10uXG5cdFx0XHRhcHBseSgkLmRhdGVwaWNrZXIsIFt0aGlzWzBdXS5jb25jYXQob3RoZXJBcmdzKSk7XG5cdGlmIChvcHRpb25zID09ICdvcHRpb24nICYmIGFyZ3VtZW50cy5sZW5ndGggPT0gMiAmJiB0eXBlb2YgYXJndW1lbnRzWzFdID09ICdzdHJpbmcnKVxuXHRcdHJldHVybiAkLmRhdGVwaWNrZXJbJ18nICsgb3B0aW9ucyArICdEYXRlcGlja2VyJ10uXG5cdFx0XHRhcHBseSgkLmRhdGVwaWNrZXIsIFt0aGlzWzBdXS5jb25jYXQob3RoZXJBcmdzKSk7XG5cdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG5cdFx0dHlwZW9mIG9wdGlvbnMgPT0gJ3N0cmluZycgP1xuXHRcdFx0JC5kYXRlcGlja2VyWydfJyArIG9wdGlvbnMgKyAnRGF0ZXBpY2tlciddLlxuXHRcdFx0XHRhcHBseSgkLmRhdGVwaWNrZXIsIFt0aGlzXS5jb25jYXQob3RoZXJBcmdzKSkgOlxuXHRcdFx0JC5kYXRlcGlja2VyLl9hdHRhY2hEYXRlcGlja2VyKHRoaXMsIG9wdGlvbnMpO1xuXHR9KTtcbn07XG5cbiQuZGF0ZXBpY2tlciA9IG5ldyBEYXRlcGlja2VyKCk7IC8vIHNpbmdsZXRvbiBpbnN0YW5jZVxuJC5kYXRlcGlja2VyLmluaXRpYWxpemVkID0gZmFsc2U7XG4kLmRhdGVwaWNrZXIudXVpZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuJC5kYXRlcGlja2VyLnZlcnNpb24gPSBcIjEuOS4yXCI7XG5cbi8vIFdvcmthcm91bmQgZm9yICM0MDU1XG4vLyBBZGQgYW5vdGhlciBnbG9iYWwgdG8gYXZvaWQgbm9Db25mbGljdCBpc3N1ZXMgd2l0aCBpbmxpbmUgZXZlbnQgaGFuZGxlcnNcbndpbmRvd1snRFBfalF1ZXJ5XycgKyBkcHV1aWRdID0gJDtcblxufSkoalF1ZXJ5KTtcbiJdLCJmaWxlIjoianF1ZXJ5dWkvanF1ZXJ5LnVpLmRhdGVwaWNrZXIuanMifQ==
- </script><script>
- /*! Selectric ϟ v1.13.0 (2017-08-22) - git.io/tjl9sQ - Copyright (c) 2017 Leonardo Santos - MIT License */
- $(document).on("ready", function () {
- !function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&module.exports?module.exports=function(t,s){return void 0===s&&(s="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(s),s}:e(jQuery)}(function(e){"use strict";var t=e(document),s=e(window),l=["a","e","i","o","u","n","c","y"],i=[/[\xE0-\xE5]/g,/[\xE8-\xEB]/g,/[\xEC-\xEF]/g,/[\xF2-\xF6]/g,/[\xF9-\xFC]/g,/[\xF1]/g,/[\xE7]/g,/[\xFD-\xFF]/g],n=function(t,s){var l=this;l.element=t,l.$element=e(t),l.state={multiple:!!l.$element.attr("multiple"),enabled:!1,opened:!1,currValue:-1,selectedIdx:-1,highlightedIdx:-1},l.eventTriggers={open:l.open,close:l.close,destroy:l.destroy,refresh:l.refresh,init:l.init},l.init(s)};n.prototype={utils:{isMobile:function(){return/android|ip(hone|od|ad)/i.test(navigator.userAgent)},escapeRegExp:function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},replaceDiacritics:function(e){for(var t=i.length;t--;)e=e.toLowerCase().replace(i[t],l[t]);return e},format:function(e){var t=arguments;return(""+e).replace(/\{(?:(\d+)|(\w+))\}/g,function(e,s,l){return l&&t[1]?t[1][l]:t[s]})},nextEnabledItem:function(e,t){for(;e[t=(t+1)%e.length].disabled;);return t},previousEnabledItem:function(e,t){for(;e[t=(t>0?t:e.length)-1].disabled;);return t},toDash:function(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()},triggerCallback:function(t,s){var l=s.element,i=s.options["on"+t],n=[l].concat([].slice.call(arguments).slice(1));e.isFunction(i)&&i.apply(l,n),e(l).trigger("selectric-"+this.toDash(t),n)},arrayToClassname:function(t){var s=e.grep(t,function(e){return!!e});return e.trim(s.join(" "))}},init:function(t){var s=this;if(s.options=e.extend(!0,{},e.fn.selectric.defaults,s.options,t),s.utils.triggerCallback("BeforeInit",s),s.destroy(!0),s.options.disableOnMobile&&s.utils.isMobile())return void(s.disableOnMobile=!0);s.classes=s.getClassNames();var l=e("<input/>",{class:s.classes.input,readonly:s.utils.isMobile()}),i=e("<div/>",{class:s.classes.items,tabindex:-1}),n=e("<div/>",{class:s.classes.scroll}),a=e("<div/>",{class:s.classes.prefix,html:s.options.arrowButtonMarkup}),o=e("<span/>",{class:"label"}),r=s.$element.wrap("<div/>").parent().append(a.prepend(o),i,l),u=e("<div/>",{class:s.classes.hideselect});s.elements={input:l,items:i,itemsScroll:n,wrapper:a,label:o,outerWrapper:r},s.options.nativeOnMobile&&s.utils.isMobile()&&(s.elements.input=void 0,u.addClass(s.classes.prefix+"-is-native"),s.$element.on("change",function(){s.refresh()})),s.$element.on(s.eventTriggers).wrap(u),s.originalTabindex=s.$element.prop("tabindex"),s.$element.prop("tabindex",-1),s.populate(),s.activate(),s.utils.triggerCallback("Init",s)},activate:function(){var e=this,t=e.elements.items.closest(":visible").children(":hidden").addClass(e.classes.tempshow),s=e.$element.width();t.removeClass(e.classes.tempshow),e.utils.triggerCallback("BeforeActivate",e),e.elements.outerWrapper.prop("class",e.utils.arrayToClassname([e.classes.wrapper,e.$element.prop("class").replace(/\S+/g,e.classes.prefix+"-$&"),e.options.responsive?e.classes.responsive:""])),e.options.inheritOriginalWidth&&s>0&&e.elements.outerWrapper.width(s),e.unbindEvents(),e.$element.prop("disabled")?(e.elements.outerWrapper.addClass(e.classes.disabled),e.elements.input&&e.elements.input.prop("disabled",!0)):(e.state.enabled=!0,e.elements.outerWrapper.removeClass(e.classes.disabled),e.$li=e.elements.items.removeAttr("style").find("li"),e.bindEvents()),e.utils.triggerCallback("Activate",e)},getClassNames:function(){var t=this,s=t.options.customClass,l={};return e.each("Input Items Open Disabled TempShow HideSelect Wrapper Focus Hover Responsive Above Below Scroll Group GroupLabel".split(" "),function(e,i){var n=s.prefix+i;l[i.toLowerCase()]=s.camelCase?n:t.utils.toDash(n)}),l.prefix=s.prefix,l},setLabel:function(){var t=this,s=t.options.labelBuilder;if(t.state.multiple){var l=e.isArray(t.state.currValue)?t.state.currValue:[t.state.currValue];l=0===l.length?[0]:l;var i=e.map(l,function(s){return e.grep(t.lookupItems,function(e){return e.index===s})[0]});i=e.grep(i,function(t){return i.length>1||0===i.length?""!==e.trim(t.value):t}),i=e.map(i,function(l){return e.isFunction(s)?s(l):t.utils.format(s,l)}),t.options.multiple.maxLabelEntries&&(i.length>=t.options.multiple.maxLabelEntries+1?(i=i.slice(0,t.options.multiple.maxLabelEntries),i.push(e.isFunction(s)?s({text:"..."}):t.utils.format(s,{text:"..."}))):i.slice(i.length-1)),t.elements.label.html(i.join(t.options.multiple.separator))}else{var n=t.lookupItems[t.state.currValue];t.elements.label.html(e.isFunction(s)?s(n):t.utils.format(s,n))}},populate:function(){var t=this,s=t.$element.children(),l=t.$element.find("option"),i=l.filter(":selected"),n=l.index(i),a=0,o=t.state.multiple?[]:0;i.length>1&&t.state.multiple&&(n=[],i.each(function(){n.push(e(this).index())})),t.state.currValue=~n?n:o,t.state.selectedIdx=t.state.currValue,t.state.highlightedIdx=t.state.currValue,t.items=[],t.lookupItems=[],s.length&&(s.each(function(s){var l=e(this);if(l.is("optgroup")){var i={element:l,label:l.prop("label"),groupDisabled:l.prop("disabled"),items:[]};l.children().each(function(s){var l=e(this);i.items[s]=t.getItemData(a,l,i.groupDisabled||l.prop("disabled")),t.lookupItems[a]=i.items[s],a++}),t.items[s]=i}else t.items[s]=t.getItemData(a,l,l.prop("disabled")),t.lookupItems[a]=t.items[s],a++}),t.setLabel(),t.elements.items.append(t.elements.itemsScroll.html(t.getItemsMarkup(t.items))))},getItemData:function(t,s,l){var i=this;return{index:t,element:s,value:s.val(),className:s.prop("class"),text:s.html(),slug:e.trim(i.utils.replaceDiacritics(s.html())),alt:s.attr("data-alt"),selected:s.prop("selected"),disabled:l}},getItemsMarkup:function(t){var s=this,l="<ul>";return e.isFunction(s.options.listBuilder)&&s.options.listBuilder&&(t=s.options.listBuilder(t)),e.each(t,function(t,i){void 0!==i.label?(l+=s.utils.format('<ul class="{1}"><li class="{2}">{3}</li>',s.utils.arrayToClassname([s.classes.group,i.groupDisabled?"disabled":"",i.element.prop("class")]),s.classes.grouplabel,i.element.prop("label")),e.each(i.items,function(e,t){l+=s.getItemMarkup(t.index,t)}),l+="</ul>"):l+=s.getItemMarkup(i.index,i)}),l+"</ul>"},getItemMarkup:function(t,s){var l=this,i=l.options.optionsItemBuilder,n={value:s.value,text:s.text,slug:s.slug,index:s.index};return l.utils.format('<li data-index="{1}" class="{2}">{3}</li>',t,l.utils.arrayToClassname([s.className,t===l.items.length-1?"last":"",s.disabled?"disabled":"",s.selected?"selected":""]),e.isFunction(i)?l.utils.format(i(s,this.$element,t),s):l.utils.format(i,n))},unbindEvents:function(){var e=this;e.elements.wrapper.add(e.$element).add(e.elements.outerWrapper).add(e.elements.input).off(".sl")},bindEvents:function(){var t=this;t.elements.outerWrapper.on("mouseenter.sl mouseleave.sl",function(s){e(this).toggleClass(t.classes.hover,"mouseenter"===s.type),t.options.openOnHover&&(clearTimeout(t.closeTimer),"mouseleave"===s.type?t.closeTimer=setTimeout(e.proxy(t.close,t),t.options.hoverIntentTimeout):t.open())}),t.elements.wrapper.on("click.sl",function(e){t.state.opened?t.close():t.open(e)}),t.options.nativeOnMobile&&t.utils.isMobile()||(t.$element.on("focus.sl",function(){t.elements.input.focus()}),t.elements.input.prop({tabindex:t.originalTabindex,disabled:!1}).on("keydown.sl",e.proxy(t.handleKeys,t)).on("focusin.sl",function(e){t.elements.outerWrapper.addClass(t.classes.focus),t.elements.input.one("blur",function(){t.elements.input.blur()}),t.options.openOnFocus&&!t.state.opened&&t.open(e)}).on("focusout.sl",function(){t.elements.outerWrapper.removeClass(t.classes.focus)}).on("input propertychange",function(){var s=t.elements.input.val(),l=new RegExp("^"+t.utils.escapeRegExp(s),"i");clearTimeout(t.resetStr),t.resetStr=setTimeout(function(){t.elements.input.val("")},t.options.keySearchTimeout),s.length&&e.each(t.items,function(e,s){if(!s.disabled){if(l.test(s.text)||l.test(s.slug))return void t.highlight(e);if(s.alt)for(var i=s.alt.split("|"),n=0;n<i.length&&i[n];n++)if(l.test(i[n].trim()))return void t.highlight(e)}})})),t.$li.on({mousedown:function(e){e.preventDefault(),e.stopPropagation()},click:function(){return t.select(e(this).data("index")),!1}})},handleKeys:function(t){var s=this,l=t.which,i=s.options.keys,n=e.inArray(l,i.previous)>-1,a=e.inArray(l,i.next)>-1,o=e.inArray(l,i.select)>-1,r=e.inArray(l,i.open)>-1,u=s.state.highlightedIdx,p=n&&0===u||a&&u+1===s.items.length,c=0;if(13!==l&&32!==l||t.preventDefault(),n||a){if(!s.options.allowWrap&&p)return;n&&(c=s.utils.previousEnabledItem(s.lookupItems,u)),a&&(c=s.utils.nextEnabledItem(s.lookupItems,u)),s.highlight(c)}if(o&&s.state.opened)return s.select(u),void(s.state.multiple&&s.options.multiple.keepMenuOpen||s.close());r&&!s.state.opened&&s.open()},refresh:function(){var e=this;e.populate(),e.activate(),e.utils.triggerCallback("Refresh",e)},setOptionsDimensions:function(){var e=this,t=e.elements.items.closest(":visible").children(":hidden").addClass(e.classes.tempshow),s=e.options.maxHeight,l=e.elements.items.outerWidth(),i=e.elements.wrapper.outerWidth()-(l-e.elements.items.width());!e.options.expandToItemText||i>l?e.finalWidth=i:(e.elements.items.css("overflow","scroll"),e.elements.outerWrapper.width(9e4),e.finalWidth=e.elements.items.width(),e.elements.items.css("overflow",""),e.elements.outerWrapper.width("")),e.elements.items.width(e.finalWidth).height()>s&&e.elements.items.height(s),t.removeClass(e.classes.tempshow)},isInViewport:function(){var e=this;if(!0===e.options.forceRenderAbove)e.elements.outerWrapper.addClass(e.classes.above);else if(!0===e.options.forceRenderBelow)e.elements.outerWrapper.addClass(e.classes.below);else{var t=s.scrollTop(),l=s.height(),i=e.elements.outerWrapper.offset().top,n=e.elements.outerWrapper.outerHeight(),a=i+n+e.itemsHeight<=t+l,o=i-e.itemsHeight>t,r=!a&&o,u=!r;e.elements.outerWrapper.toggleClass(e.classes.above,r),e.elements.outerWrapper.toggleClass(e.classes.below,u)}},detectItemVisibility:function(t){var s=this,l=s.$li.filter("[data-index]");s.state.multiple&&(t=e.isArray(t)&&0===t.length?0:t,t=e.isArray(t)?Math.min.apply(Math,t):t);var i=l.eq(t).outerHeight(),n=l[t].offsetTop,a=s.elements.itemsScroll.scrollTop(),o=n+2*i;s.elements.itemsScroll.scrollTop(o>a+s.itemsHeight?o-s.itemsHeight:n-i<a?n-i:a)},open:function(s){var l=this;if(l.options.nativeOnMobile&&l.utils.isMobile())return!1;l.utils.triggerCallback("BeforeOpen",l),s&&(s.preventDefault(),l.options.stopPropagation&&s.stopPropagation()),l.state.enabled&&(l.setOptionsDimensions(),e("."+l.classes.hideselect,"."+l.classes.open).children().selectric("close"),l.state.opened=!0,l.itemsHeight=l.elements.items.outerHeight(),l.itemsInnerHeight=l.elements.items.height(),l.elements.outerWrapper.addClass(l.classes.open),l.elements.input.val(""),s&&"focusin"!==s.type&&l.elements.input.focus(),setTimeout(function(){t.on("click.sl",e.proxy(l.close,l)).on("scroll.sl",e.proxy(l.isInViewport,l))},1),l.isInViewport(),l.options.preventWindowScroll&&t.on("mousewheel.sl DOMMouseScroll.sl","."+l.classes.scroll,function(t){var s=t.originalEvent,i=e(this).scrollTop(),n=0;"detail"in s&&(n=-1*s.detail),"wheelDelta"in s&&(n=s.wheelDelta),"wheelDeltaY"in s&&(n=s.wheelDeltaY),"deltaY"in s&&(n=-1*s.deltaY),(i===this.scrollHeight-l.itemsInnerHeight&&n<0||0===i&&n>0)&&t.preventDefault()}),l.detectItemVisibility(l.state.selectedIdx),l.highlight(l.state.multiple?-1:l.state.selectedIdx),l.utils.triggerCallback("Open",l))},close:function(){var e=this;e.utils.triggerCallback("BeforeClose",e),t.off(".sl"),e.elements.outerWrapper.removeClass(e.classes.open),e.state.opened=!1,e.utils.triggerCallback("Close",e)},change:function(){var t=this;t.utils.triggerCallback("BeforeChange",t),t.state.multiple?(e.each(t.lookupItems,function(e){t.lookupItems[e].selected=!1,t.$element.find("option").prop("selected",!1)}),e.each(t.state.selectedIdx,function(e,s){t.lookupItems[s].selected=!0,t.$element.find("option").eq(s).prop("selected",!0)}),t.state.currValue=t.state.selectedIdx,t.setLabel(),t.utils.triggerCallback("Change",t)):t.state.currValue!==t.state.selectedIdx&&(t.$element.prop("selectedIndex",t.state.currValue=t.state.selectedIdx).data("value",t.lookupItems[t.state.selectedIdx].text),t.setLabel(),t.utils.triggerCallback("Change",t))},highlight:function(e){var t=this,s=t.$li.filter("[data-index]").removeClass("highlighted");t.utils.triggerCallback("BeforeHighlight",t),void 0===e||-1===e||t.lookupItems[e].disabled||(s.eq(t.state.highlightedIdx=e).addClass("highlighted"),t.detectItemVisibility(e),t.utils.triggerCallback("Highlight",t))},select:function(t){var s=this,l=s.$li.filter("[data-index]");if(s.utils.triggerCallback("BeforeSelect",s,t),void 0!==t&&-1!==t&&!s.lookupItems[t].disabled){if(s.state.multiple){s.state.selectedIdx=e.isArray(s.state.selectedIdx)?s.state.selectedIdx:[s.state.selectedIdx];var i=e.inArray(t,s.state.selectedIdx);-1!==i?s.state.selectedIdx.splice(i,1):s.state.selectedIdx.push(t),l.removeClass("selected").filter(function(t){return-1!==e.inArray(t,s.state.selectedIdx)}).addClass("selected")}else l.removeClass("selected").eq(s.state.selectedIdx=t).addClass("selected");s.state.multiple&&s.options.multiple.keepMenuOpen||s.close(),s.change(),s.utils.triggerCallback("Select",s,t)}},destroy:function(e){var t=this;t.state&&t.state.enabled&&(t.elements.items.add(t.elements.wrapper).add(t.elements.input).remove(),e||t.$element.removeData("selectric").removeData("value"),t.$element.prop("tabindex",t.originalTabindex).off(".sl").off(t.eventTriggers).unwrap().unwrap(),t.state.enabled=!1)}},e.fn.selectric=function(t){return this.each(function(){var s=e.data(this,"selectric");s&&!s.disableOnMobile?"string"==typeof t&&s[t]?s[t]():s.init(t):e.data(this,"selectric",new n(this,t))})},e.fn.selectric.defaults={onChange:function(t){e(t).change()},maxHeight:300,keySearchTimeout:500,arrowButtonMarkup:'<b class="button">▾</b>',disableOnMobile:!1,nativeOnMobile:!0,openOnFocus:!0,openOnHover:!1,hoverIntentTimeout:500,expandToItemText:!1,responsive:!1,preventWindowScroll:!0,inheritOriginalWidth:!1,allowWrap:!0,forceRenderAbove:!1,forceRenderBelow:!1,stopPropagation:!0,optionsItemBuilder:"{text}",labelBuilder:"{text}",listBuilder:!1,keys:{previous:[37,38],next:[39,40],select:[9,13,27],open:[13,32,37,38,39,40],close:[9,27]},customClass:{prefix:"selectric",camelCase:!1},multiple:{separator:", ",keepMenuOpen:!0,maxLabelEntries:!1}}});
- });
- </script><script>
- $('.b-search__input').attr('autocomplete','off');
- $(document).ready(function(){
- //setModal();
- //setTabs();
- });
- function setModalMaxHeight(element) {
- this.$element = $(element);
- this.$content = this.$element.find('.b-modal__wrapper');
- var contentHeight = $(window).height();
- var headerHeight = this.$element.find('.b-modal__header').outerHeight(true) || 0;
- var footerHeight = this.$element.find('.b-modal__footer').outerHeight(true) || 0;
- var magicMargin = $(window).width() < 768 ? 0 : 70;
- var maxHeight = contentHeight - (headerHeight + footerHeight + magicMargin);
- this.$content.css({
- 'overflow': 'hidden'
- });
- this.$element
- .find('.b-modal__content').css({
- 'max-height': maxHeight,
- 'overflow-y': 'auto'
- });
- }
- $('.b-modal').on('show.bs.modal', function() {
- $(this).show();
- setModalMaxHeight(this);
- });
- $(window).resize(function() {
- if ($('.b-modal').length != 0) {
- $('.b-modal').each(function (index, item) {
- setModalMaxHeight(item);
- });
- }
- });
- $(document)
- .on("hover", ".js-hover-active", function() {
- $(this).toggleClass("active");
- $( ".b-shadow").toggleClass("active");
- });
- $(".js-togg-active").mouseover(function(){
- //.on("mouseup", ".js-togg-active", function() {
- $(this).addClass("active");
- });
- $(".js-togg-active").mouseout(function(){
- $(this).removeClass("active");
- });
- $(document).on("click", ".js-open-button", function() {
- $(this).siblings( ".js-close-button" ).addClass("active");
- $(this).siblings( ".js-close-button" ).removeClass("hide");
- $(this).siblings(".js-hide").addClass("active");
- var _row = $(this).closest(".b-comments__table-row");
- $(_row).next(".js-hide").addClass("active");
- //$('.js-close-button, .js-hide').addClass("active");
- $(this).addClass("hide");
- //$('.js-close-button').removeClass("hide");
- });
- $(document).on("click", ".js-close-button", function() {
- $(this).removeClass("active");
- $(this).siblings( ".js-open-button" ).removeClass("hide");
- $(this).siblings(".js-hide").removeClass("active");
- var _row = $(this).closest(".b-comments__table-row");
- $(_row).next(".js-hide").removeClass("active");
- //$('.js-close-button, .js-hide').removeClass("active");
- //$('.js-open-button').removeClass("hide");
- $(this).addClass("hide");
- });
- $(document).on("click", ".js-open", function() {
- if ($(this).hasClass("container-open"))
- {
- $('#container_comments').toggle();
- }
- else
- {
- $('.b-competere').toggle();
- }
- $(this).toggleClass('active');
- $('.js-toggle-active').toggleClass('active');
- });
- $(document).on("click", ".js-togg-active", function() {
- $(this).toggleClass("active");
- });
- $(document).on("click", ".b-personal-info__open-button.prew", function() {
- $('.b-icon__open.little').toggleClass("active");
- $('.b-personal-info__table-row.prew').toggleClass("hide");
- });
- //menu
- /*$(function(){
- $('.b-header__toggle-menu').click(function(){
- $('.b-header__toggle-menu').toggleClass('is-close');
- });
- });
- $(function(){
- $(".b-header__toggle-menu").click(function(){
- $('.b-header__menu').toggleClass('active');
- $('.col-lg-9.col-md-9.hidden-xs').toggleClass('show-xs');
- });
- });
- //tabs
- /*function setTabs(){
- $(".js-tab-content").hide();
- $(".js-tab-item.active").each(function(){
- var activeTabPre = $(this).attr('rel');
- $("#"+activeTabPre).show();
- })
- $(".js-tab-item").click(function() {
- $(this).closest(".js-tab").next(".js-tab-group").children(".js-tab-content").hide();
- var activeTab = $(this).attr("rel");
- $("#"+activeTab).show();
- $(this).closest(".js-tab").find(".js-tab-item").removeClass("active");
- $(this).addClass("active");
- });
- }
- $(".b-textarea, .b-input").on("focusout", function () {
- $(this).css("color", "black");
- });
- // Модалки
- $(".js-open-modal").click(function(){
- $(".b-modal, .b-shadow").show();
- $("body").addClass("off-scroll");
- });
- $(".js-close-modal, .b-shadow").click(function(){
- $(".b-modal, .b-shadow").hide();
- $("body").removeClass("off-scroll");
- });
- /* Sticky-kit v1.1.2 */
- (function() {
- var $, win;
- $ = this.jQuery || window.jQuery;
- win = $(window);
- $.fn.stick_in_parent = function(opts) {
- var doc, elm, enable_bottoming, fn, i, inner_scrolling, len, manual_spacer, offset_top, parent_selector, recalc_every, sticky_class;
- if (opts == null) {
- opts = {};
- }
- sticky_class = opts.sticky_class, inner_scrolling = opts.inner_scrolling, recalc_every = opts.recalc_every, parent_selector = opts.parent, offset_top = opts.offset_top, manual_spacer = opts.spacer, enable_bottoming = opts.bottoming;
- if (offset_top == null) {
- offset_top = 0;
- }
- if (parent_selector == null) {
- parent_selector = void 0;
- }
- if (inner_scrolling == null) {
- inner_scrolling = true;
- }
- if (sticky_class == null) {
- sticky_class = "is_stuck";
- }
- doc = $(document);
- if (enable_bottoming == null) {
- enable_bottoming = true;
- }
- fn = function(elm, padding_bottom, parent_top, parent_height, top, height, el_float, detached) {
- var bottomed, detach, fixed, last_pos, last_scroll_height, offset, parent, recalc, recalc_and_tick, recalc_counter, spacer, tick;
- if (elm.data("sticky_kit")) {
- return;
- }
- elm.data("sticky_kit", true);
- last_scroll_height = doc.height();
- parent = elm.parent();
- if (parent_selector != null) {
- parent = parent.closest(parent_selector);
- }
- if (!parent.length) {
- throw "failed to find stick parent";
- }
- fixed = false;
- bottomed = false;
- spacer = manual_spacer != null ? manual_spacer && elm.closest(manual_spacer) : $("<div />");
- if (spacer) {
- spacer.css('position', elm.css('position'));
- }
- recalc = function() {
- var border_top, padding_top, restore;
- if (detached) {
- return;
- }
- last_scroll_height = doc.height();
- border_top = parseInt(parent.css("border-top-width"), 10);
- padding_top = parseInt(parent.css("padding-top"), 10);
- padding_bottom = parseInt(parent.css("padding-bottom"), 10);
- parent_top = parent.offset().top + border_top + padding_top;
- parent_height = parent.height();
- if (fixed) {
- fixed = false;
- bottomed = false;
- if (manual_spacer == null) {
- elm.insertAfter(spacer);
- spacer.detach();
- }
- elm.css({
- position: "",
- top: "",
- width: "",
- bottom: ""
- }).removeClass(sticky_class);
- restore = true;
- }
- top = elm.offset().top - (parseInt(elm.css("margin-top"), 10) || 0) - offset_top;
- height = elm.outerHeight(true);
- el_float = elm.css("float");
- if (spacer) {
- spacer.css({
- width: elm.outerWidth(true),
- height: height,
- display: elm.css("display"),
- "vertical-align": elm.css("vertical-align"),
- "float": el_float
- });
- }
- if (restore) {
- return tick();
- }
- };
- recalc();
- if (height === parent_height) {
- return;
- }
- last_pos = void 0;
- offset = offset_top;
- recalc_counter = recalc_every;
- tick = function() {
- var css, delta, recalced, scroll, will_bottom, win_height;
- if (detached) {
- return;
- }
- recalced = false;
- if (recalc_counter != null) {
- recalc_counter -= 1;
- if (recalc_counter <= 0) {
- recalc_counter = recalc_every;
- recalc();
- recalced = true;
- }
- }
- if (!recalced && doc.height() !== last_scroll_height) {
- recalc();
- recalced = true;
- }
- scroll = win.scrollTop();
- if (last_pos != null) {
- delta = scroll - last_pos;
- }
- last_pos = scroll;
- if (fixed) {
- if (enable_bottoming) {
- will_bottom = scroll + height + offset > parent_height + parent_top;
- if (bottomed && !will_bottom) {
- bottomed = false;
- elm.css({
- position: "fixed",
- bottom: "",
- top: offset
- }).trigger("sticky_kit:unbottom");
- }
- }
- if (scroll < top) {
- fixed = false;
- offset = offset_top;
- if (manual_spacer == null) {
- if (el_float === "left" || el_float === "right") {
- elm.insertAfter(spacer);
- }
- spacer.detach();
- }
- css = {
- position: "",
- width: "",
- top: ""
- };
- elm.css(css).removeClass(sticky_class).trigger("sticky_kit:unstick");
- }
- if (inner_scrolling) {
- win_height = win.height();
- if (height + offset_top > win_height) {
- if (!bottomed) {
- offset -= delta;
- offset = Math.max(win_height - height, offset);
- offset = Math.min(offset_top, offset);
- if (fixed) {
- elm.css({
- top: offset + "px"
- });
- }
- }
- }
- }
- } else {
- if (scroll > top) {
- fixed = true;
- css = {
- position: "fixed",
- top: offset
- };
- css.width = elm.css("box-sizing") === "border-box" ? elm.outerWidth() + "px" : elm.width() + "px";
- elm.css(css).addClass(sticky_class);
- if (manual_spacer == null) {
- elm.after(spacer);
- if (el_float === "left" || el_float === "right") {
- spacer.append(elm);
- }
- }
- elm.trigger("sticky_kit:stick");
- }
- }
- if (fixed && enable_bottoming) {
- if (will_bottom == null) {
- will_bottom = scroll + height + offset > parent_height + parent_top;
- }
- if (!bottomed && will_bottom) {
- bottomed = true;
- if (parent.css("position") === "static") {
- parent.css({
- position: "relative"
- });
- }
- return elm.css({
- position: "absolute",
- bottom: padding_bottom,
- top: "auto"
- }).trigger("sticky_kit:bottom");
- }
- }
- };
- recalc_and_tick = function() {
- recalc();
- return tick();
- };
- detach = function() {
- detached = true;
- win.off("touchmove", tick);
- win.off("scroll", tick);
- win.off("resize", recalc_and_tick);
- $(document.body).off("sticky_kit:recalc", recalc_and_tick);
- elm.off("sticky_kit:detach", detach);
- elm.removeData("sticky_kit");
- elm.css({
- position: "",
- bottom: "",
- top: "",
- width: ""
- });
- parent.position("position", "");
- if (fixed) {
- if (manual_spacer == null) {
- if (el_float === "left" || el_float === "right") {
- elm.insertAfter(spacer);
- }
- spacer.remove();
- }
- return elm.removeClass(sticky_class);
- }
- };
- win.on("touchmove", tick);
- win.on("scroll", tick);
- win.on("resize", recalc_and_tick);
- $(document.body).on("sticky_kit:recalc", recalc_and_tick);
- elm.on("sticky_kit:detach", detach);
- return setTimeout(tick, 0);
- };
- for (i = 0, len = this.length; i < len; i++) {
- elm = this[i];
- fn($(elm));
- }
- return this;
- };
- }).call(this);
- /*! Selectric ϟ v1.13.0 (2017-08-22) - git.io/tjl9sQ - Copyright (c) 2017 Leonardo Santos - MIT License */
- !function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&module.exports?module.exports=function(t,s){return void 0===s&&(s="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(s),s}:e(jQuery)}(function(e){"use strict";var t=e(document),s=e(window),l=["a","e","i","o","u","n","c","y"],i=[/[\xE0-\xE5]/g,/[\xE8-\xEB]/g,/[\xEC-\xEF]/g,/[\xF2-\xF6]/g,/[\xF9-\xFC]/g,/[\xF1]/g,/[\xE7]/g,/[\xFD-\xFF]/g],n=function(t,s){var l=this;l.element=t,l.$element=e(t),l.state={multiple:!!l.$element.attr("multiple"),enabled:!1,opened:!1,currValue:-1,selectedIdx:-1,highlightedIdx:-1},l.eventTriggers={open:l.open,close:l.close,destroy:l.destroy,refresh:l.refresh,init:l.init},l.init(s)};n.prototype={utils:{isMobile:function(){return/android|ip(hone|od|ad)/i.test(navigator.userAgent)},escapeRegExp:function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},replaceDiacritics:function(e){for(var t=i.length;t--;)e=e.toLowerCase().replace(i[t],l[t]);return e},format:function(e){var t=arguments;return(""+e).replace(/\{(?:(\d+)|(\w+))\}/g,function(e,s,l){return l&&t[1]?t[1][l]:t[s]})},nextEnabledItem:function(e,t){for(;e[t=(t+1)%e.length].disabled;);return t},previousEnabledItem:function(e,t){for(;e[t=(t>0?t:e.length)-1].disabled;);return t},toDash:function(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()},triggerCallback:function(t,s){var l=s.element,i=s.options["on"+t],n=[l].concat([].slice.call(arguments).slice(1));e.isFunction(i)&&i.apply(l,n),e(l).trigger("selectric-"+this.toDash(t),n)},arrayToClassname:function(t){var s=e.grep(t,function(e){return!!e});return e.trim(s.join(" "))}},init:function(t){var s=this;if(s.options=e.extend(!0,{},e.fn.selectric.defaults,s.options,t),s.utils.triggerCallback("BeforeInit",s),s.destroy(!0),s.options.disableOnMobile&&s.utils.isMobile())return void(s.disableOnMobile=!0);s.classes=s.getClassNames();var l=e("<input/>",{class:s.classes.input,readonly:s.utils.isMobile()}),i=e("<div/>",{class:s.classes.items,tabindex:-1}),n=e("<div/>",{class:s.classes.scroll}),a=e("<div/>",{class:s.classes.prefix,html:s.options.arrowButtonMarkup}),o=e("<span/>",{class:"label"}),r=s.$element.wrap("<div/>").parent().append(a.prepend(o),i,l),u=e("<div/>",{class:s.classes.hideselect});s.elements={input:l,items:i,itemsScroll:n,wrapper:a,label:o,outerWrapper:r},s.options.nativeOnMobile&&s.utils.isMobile()&&(s.elements.input=void 0,u.addClass(s.classes.prefix+"-is-native"),s.$element.on("change",function(){s.refresh()})),s.$element.on(s.eventTriggers).wrap(u),s.originalTabindex=s.$element.prop("tabindex"),s.$element.prop("tabindex",-1),s.populate(),s.activate(),s.utils.triggerCallback("Init",s)},activate:function(){var e=this,t=e.elements.items.closest(":visible").children(":hidden").addClass(e.classes.tempshow),s=e.$element.width();t.removeClass(e.classes.tempshow),e.utils.triggerCallback("BeforeActivate",e),e.elements.outerWrapper.prop("class",e.utils.arrayToClassname([e.classes.wrapper,e.$element.prop("class").replace(/\S+/g,e.classes.prefix+"-$&"),e.options.responsive?e.classes.responsive:""])),e.options.inheritOriginalWidth&&s>0&&e.elements.outerWrapper.width(s),e.unbindEvents(),e.$element.prop("disabled")?(e.elements.outerWrapper.addClass(e.classes.disabled),e.elements.input&&e.elements.input.prop("disabled",!0)):(e.state.enabled=!0,e.elements.outerWrapper.removeClass(e.classes.disabled),e.$li=e.elements.items.removeAttr("style").find("li"),e.bindEvents()),e.utils.triggerCallback("Activate",e)},getClassNames:function(){var t=this,s=t.options.customClass,l={};return e.each("Input Items Open Disabled TempShow HideSelect Wrapper Focus Hover Responsive Above Below Scroll Group GroupLabel".split(" "),function(e,i){var n=s.prefix+i;l[i.toLowerCase()]=s.camelCase?n:t.utils.toDash(n)}),l.prefix=s.prefix,l},setLabel:function(){var t=this,s=t.options.labelBuilder;if(t.state.multiple){var l=e.isArray(t.state.currValue)?t.state.currValue:[t.state.currValue];l=0===l.length?[0]:l;var i=e.map(l,function(s){return e.grep(t.lookupItems,function(e){return e.index===s})[0]});i=e.grep(i,function(t){return i.length>1||0===i.length?""!==e.trim(t.value):t}),i=e.map(i,function(l){return e.isFunction(s)?s(l):t.utils.format(s,l)}),t.options.multiple.maxLabelEntries&&(i.length>=t.options.multiple.maxLabelEntries+1?(i=i.slice(0,t.options.multiple.maxLabelEntries),i.push(e.isFunction(s)?s({text:"..."}):t.utils.format(s,{text:"..."}))):i.slice(i.length-1)),t.elements.label.html(i.join(t.options.multiple.separator))}else{var n=t.lookupItems[t.state.currValue];t.elements.label.html(e.isFunction(s)?s(n):t.utils.format(s,n))}},populate:function(){var t=this,s=t.$element.children(),l=t.$element.find("option"),i=l.filter(":selected"),n=l.index(i),a=0,o=t.state.multiple?[]:0;i.length>1&&t.state.multiple&&(n=[],i.each(function(){n.push(e(this).index())})),t.state.currValue=~n?n:o,t.state.selectedIdx=t.state.currValue,t.state.highlightedIdx=t.state.currValue,t.items=[],t.lookupItems=[],s.length&&(s.each(function(s){var l=e(this);if(l.is("optgroup")){var i={element:l,label:l.prop("label"),groupDisabled:l.prop("disabled"),items:[]};l.children().each(function(s){var l=e(this);i.items[s]=t.getItemData(a,l,i.groupDisabled||l.prop("disabled")),t.lookupItems[a]=i.items[s],a++}),t.items[s]=i}else t.items[s]=t.getItemData(a,l,l.prop("disabled")),t.lookupItems[a]=t.items[s],a++}),t.setLabel(),t.elements.items.append(t.elements.itemsScroll.html(t.getItemsMarkup(t.items))))},getItemData:function(t,s,l){var i=this;return{index:t,element:s,value:s.val(),className:s.prop("class"),text:s.html(),slug:e.trim(i.utils.replaceDiacritics(s.html())),alt:s.attr("data-alt"),selected:s.prop("selected"),disabled:l}},getItemsMarkup:function(t){var s=this,l="<ul>";return e.isFunction(s.options.listBuilder)&&s.options.listBuilder&&(t=s.options.listBuilder(t)),e.each(t,function(t,i){void 0!==i.label?(l+=s.utils.format('<ul class="{1}"><li class="{2}">{3}</li>',s.utils.arrayToClassname([s.classes.group,i.groupDisabled?"disabled":"",i.element.prop("class")]),s.classes.grouplabel,i.element.prop("label")),e.each(i.items,function(e,t){l+=s.getItemMarkup(t.index,t)}),l+="</ul>"):l+=s.getItemMarkup(i.index,i)}),l+"</ul>"},getItemMarkup:function(t,s){var l=this,i=l.options.optionsItemBuilder,n={value:s.value,text:s.text,slug:s.slug,index:s.index};return l.utils.format('<li data-index="{1}" class="{2}">{3}</li>',t,l.utils.arrayToClassname([s.className,t===l.items.length-1?"last":"",s.disabled?"disabled":"",s.selected?"selected":""]),e.isFunction(i)?l.utils.format(i(s,this.$element,t),s):l.utils.format(i,n))},unbindEvents:function(){var e=this;e.elements.wrapper.add(e.$element).add(e.elements.outerWrapper).add(e.elements.input).off(".sl")},bindEvents:function(){var t=this;t.elements.outerWrapper.on("mouseenter.sl mouseleave.sl",function(s){e(this).toggleClass(t.classes.hover,"mouseenter"===s.type),t.options.openOnHover&&(clearTimeout(t.closeTimer),"mouseleave"===s.type?t.closeTimer=setTimeout(e.proxy(t.close,t),t.options.hoverIntentTimeout):t.open())}),t.elements.wrapper.on("click.sl",function(e){t.state.opened?t.close():t.open(e)}),t.options.nativeOnMobile&&t.utils.isMobile()||(t.$element.on("focus.sl",function(){t.elements.input.focus()}),t.elements.input.prop({tabindex:t.originalTabindex,disabled:!1}).on("keydown.sl",e.proxy(t.handleKeys,t)).on("focusin.sl",function(e){t.elements.outerWrapper.addClass(t.classes.focus),t.elements.input.one("blur",function(){t.elements.input.blur()}),t.options.openOnFocus&&!t.state.opened&&t.open(e)}).on("focusout.sl",function(){t.elements.outerWrapper.removeClass(t.classes.focus)}).on("input propertychange",function(){var s=t.elements.input.val(),l=new RegExp("^"+t.utils.escapeRegExp(s),"i");clearTimeout(t.resetStr),t.resetStr=setTimeout(function(){t.elements.input.val("")},t.options.keySearchTimeout),s.length&&e.each(t.items,function(e,s){if(!s.disabled){if(l.test(s.text)||l.test(s.slug))return void t.highlight(e);if(s.alt)for(var i=s.alt.split("|"),n=0;n<i.length&&i[n];n++)if(l.test(i[n].trim()))return void t.highlight(e)}})})),t.$li.on({mousedown:function(e){e.preventDefault(),e.stopPropagation()},click:function(){return t.select(e(this).data("index")),!1}})},handleKeys:function(t){var s=this,l=t.which,i=s.options.keys,n=e.inArray(l,i.previous)>-1,a=e.inArray(l,i.next)>-1,o=e.inArray(l,i.select)>-1,r=e.inArray(l,i.open)>-1,u=s.state.highlightedIdx,p=n&&0===u||a&&u+1===s.items.length,c=0;if(13!==l&&32!==l||t.preventDefault(),n||a){if(!s.options.allowWrap&&p)return;n&&(c=s.utils.previousEnabledItem(s.lookupItems,u)),a&&(c=s.utils.nextEnabledItem(s.lookupItems,u)),s.highlight(c)}if(o&&s.state.opened)return s.select(u),void(s.state.multiple&&s.options.multiple.keepMenuOpen||s.close());r&&!s.state.opened&&s.open()},refresh:function(){var e=this;e.populate(),e.activate(),e.utils.triggerCallback("Refresh",e)},setOptionsDimensions:function(){var e=this,t=e.elements.items.closest(":visible").children(":hidden").addClass(e.classes.tempshow),s=e.options.maxHeight,l=e.elements.items.outerWidth(),i=e.elements.wrapper.outerWidth()-(l-e.elements.items.width());!e.options.expandToItemText||i>l?e.finalWidth=i:(e.elements.items.css("overflow","scroll"),e.elements.outerWrapper.width(9e4),e.finalWidth=e.elements.items.width(),e.elements.items.css("overflow",""),e.elements.outerWrapper.width("")),e.elements.items.width(e.finalWidth).height()>s&&e.elements.items.height(s),t.removeClass(e.classes.tempshow)},isInViewport:function(){var e=this;if(!0===e.options.forceRenderAbove)e.elements.outerWrapper.addClass(e.classes.above);else if(!0===e.options.forceRenderBelow)e.elements.outerWrapper.addClass(e.classes.below);else{var t=s.scrollTop(),l=s.height(),i=e.elements.outerWrapper.offset().top,n=e.elements.outerWrapper.outerHeight(),a=i+n+e.itemsHeight<=t+l,o=i-e.itemsHeight>t,r=!a&&o,u=!r;e.elements.outerWrapper.toggleClass(e.classes.above,r),e.elements.outerWrapper.toggleClass(e.classes.below,u)}},detectItemVisibility:function(t){var s=this,l=s.$li.filter("[data-index]");s.state.multiple&&(t=e.isArray(t)&&0===t.length?0:t,t=e.isArray(t)?Math.min.apply(Math,t):t);var i=l.eq(t).outerHeight(),n=l[t].offsetTop,a=s.elements.itemsScroll.scrollTop(),o=n+2*i;s.elements.itemsScroll.scrollTop(o>a+s.itemsHeight?o-s.itemsHeight:n-i<a?n-i:a)},open:function(s){var l=this;if(l.options.nativeOnMobile&&l.utils.isMobile())return!1;l.utils.triggerCallback("BeforeOpen",l),s&&(s.preventDefault(),l.options.stopPropagation&&s.stopPropagation()),l.state.enabled&&(l.setOptionsDimensions(),e("."+l.classes.hideselect,"."+l.classes.open).children().selectric("close"),l.state.opened=!0,l.itemsHeight=l.elements.items.outerHeight(),l.itemsInnerHeight=l.elements.items.height(),l.elements.outerWrapper.addClass(l.classes.open),l.elements.input.val(""),s&&"focusin"!==s.type&&l.elements.input.focus(),setTimeout(function(){t.on("click.sl",e.proxy(l.close,l)).on("scroll.sl",e.proxy(l.isInViewport,l))},1),l.isInViewport(),l.options.preventWindowScroll&&t.on("mousewheel.sl DOMMouseScroll.sl","."+l.classes.scroll,function(t){var s=t.originalEvent,i=e(this).scrollTop(),n=0;"detail"in s&&(n=-1*s.detail),"wheelDelta"in s&&(n=s.wheelDelta),"wheelDeltaY"in s&&(n=s.wheelDeltaY),"deltaY"in s&&(n=-1*s.deltaY),(i===this.scrollHeight-l.itemsInnerHeight&&n<0||0===i&&n>0)&&t.preventDefault()}),l.detectItemVisibility(l.state.selectedIdx),l.highlight(l.state.multiple?-1:l.state.selectedIdx),l.utils.triggerCallback("Open",l))},close:function(){var e=this;e.utils.triggerCallback("BeforeClose",e),t.off(".sl"),e.elements.outerWrapper.removeClass(e.classes.open),e.state.opened=!1,e.utils.triggerCallback("Close",e)},change:function(){var t=this;t.utils.triggerCallback("BeforeChange",t),t.state.multiple?(e.each(t.lookupItems,function(e){t.lookupItems[e].selected=!1,t.$element.find("option").prop("selected",!1)}),e.each(t.state.selectedIdx,function(e,s){t.lookupItems[s].selected=!0,t.$element.find("option").eq(s).prop("selected",!0)}),t.state.currValue=t.state.selectedIdx,t.setLabel(),t.utils.triggerCallback("Change",t)):t.state.currValue!==t.state.selectedIdx&&(t.$element.prop("selectedIndex",t.state.currValue=t.state.selectedIdx).data("value",t.lookupItems[t.state.selectedIdx].text),t.setLabel(),t.utils.triggerCallback("Change",t))},highlight:function(e){var t=this,s=t.$li.filter("[data-index]").removeClass("highlighted");t.utils.triggerCallback("BeforeHighlight",t),void 0===e||-1===e||t.lookupItems[e].disabled||(s.eq(t.state.highlightedIdx=e).addClass("highlighted"),t.detectItemVisibility(e),t.utils.triggerCallback("Highlight",t))},select:function(t){var s=this,l=s.$li.filter("[data-index]");if(s.utils.triggerCallback("BeforeSelect",s,t),void 0!==t&&-1!==t&&!s.lookupItems[t].disabled){if(s.state.multiple){s.state.selectedIdx=e.isArray(s.state.selectedIdx)?s.state.selectedIdx:[s.state.selectedIdx];var i=e.inArray(t,s.state.selectedIdx);-1!==i?s.state.selectedIdx.splice(i,1):s.state.selectedIdx.push(t),l.removeClass("selected").filter(function(t){return-1!==e.inArray(t,s.state.selectedIdx)}).addClass("selected")}else l.removeClass("selected").eq(s.state.selectedIdx=t).addClass("selected");s.state.multiple&&s.options.multiple.keepMenuOpen||s.close(),s.change(),s.utils.triggerCallback("Select",s,t)}},destroy:function(e){var t=this;t.state&&t.state.enabled&&(t.elements.items.add(t.elements.wrapper).add(t.elements.input).remove(),e||t.$element.removeData("selectric").removeData("value"),t.$element.prop("tabindex",t.originalTabindex).off(".sl").off(t.eventTriggers).unwrap().unwrap(),t.state.enabled=!1)}},e.fn.selectric=function(t){return this.each(function(){var s=e.data(this,"selectric");s&&!s.disableOnMobile?"string"==typeof t&&s[t]?s[t]():s.init(t):e.data(this,"selectric",new n(this,t))})},e.fn.selectric.defaults={onChange:function(t){e(t).change()},maxHeight:300,keySearchTimeout:500,arrowButtonMarkup:'<b class="button">▾</b>',disableOnMobile:!1,nativeOnMobile:!0,openOnFocus:!0,openOnHover:!1,hoverIntentTimeout:500,expandToItemText:!1,responsive:!1,preventWindowScroll:!0,inheritOriginalWidth:!1,allowWrap:!0,forceRenderAbove:!1,forceRenderBelow:!1,stopPropagation:!0,optionsItemBuilder:"{text}",labelBuilder:"{text}",listBuilder:!1,keys:{previous:[37,38],next:[39,40],select:[9,13,27],open:[13,32,37,38,39,40],close:[9,27]},customClass:{prefix:"selectric",camelCase:!1},multiple:{separator:", ",keepMenuOpen:!0,maxLabelEntries:!1}}});
- /*
- * jQuery autoResize (textarea auto-resizer)
- * @copyright James Padolsey http://james.padolsey.com
- * @version 1.04
- */
- (function($){
- $.fn.autoResize = function(options) {
- // Just some abstracted details,
- // to make plugin users happy:
- var settings = $.extend({
- onResize : function(){
- },
- animate : true,
- animateDuration : 150,
- animateCallback : function(){},
- extraSpace : 20,
- limit: 1000
- }, options);
- // Only textarea's auto-resize:
- this.filter('textarea').each(function(){
- // Get rid of scrollbars and disable WebKit resizing:
- var textarea = $(this).css({resize:'none','overflow-y':'hidden'}),
- // Cache original height, for use later:
- origHeight = textarea.height(),
- // Need clone of textarea, hidden off screen:
- clone = (function(){
- // Properties which may effect space taken up by chracters:
- var props = ['height','width','lineHeight','textDecoration','letterSpacing'],
- propOb = {};
- // Create object of styles to apply:
- $.each(props, function(i, prop){
- propOb[prop] = textarea.css(prop);
- });
- // Clone the actual textarea removing unique properties
- // and insert before original textarea:
- return textarea.clone().removeAttr('id').removeAttr('name').css({
- position: 'absolute',
- top: 0,
- left: -9999
- }).css(propOb).attr('tabIndex','-1').insertBefore(textarea);
- })(),
- lastScrollTop = null,
- updateSize = function() {
- // Prepare the clone:
- clone.height(0).val($(this).val()).scrollTop(10000);
- // Find the height of text:
- var scrollTop = Math.max(clone.scrollTop(), origHeight) + settings.extraSpace,
- toChange = $(this).add(clone);
- // Don't do anything if scrollTip hasen't changed:
- if (lastScrollTop === scrollTop) { return; }
- lastScrollTop = scrollTop;
- // Check for limit:
- if ( scrollTop >= settings.limit ) {
- $(this).css('overflow-y','');
- return;
- }
- // Fire off callback:
- settings.onResize.call(this);
- // Either animate or directly apply height:
- settings.animate && textarea.css('display') === 'block' ?
- toChange.stop().animate({height:scrollTop}, settings.animateDuration, settings.animateCallback)
- : toChange.height(scrollTop);
- };
- // Bind namespaced handlers to appropriate events:
- textarea
- .unbind('.dynSiz')
- .bind('keyup.dynSiz', updateSize)
- .bind('keydown.dynSiz', updateSize)
- .bind('change.dynSiz', updateSize);
- });
- // Chain:
- return this;
- };
- })(jQuery);/*
- * jQuery autoResize (textarea auto-resizer)
- * @copyright James Padolsey http://james.padolsey.com
- * @version 1.04
- */
- (function($){
- $.fn.autoResize = function(options) {
- // Just some abstracted details,
- // to make plugin users happy:
- var settings = $.extend({
- onResize : function(){
- },
- animate : true,
- animateDuration : 150,
- animateCallback : function(){},
- extraSpace : 20,
- limit: 1000
- }, options);
- // Only textarea's auto-resize:
- this.filter('textarea').each(function(){
- // Get rid of scrollbars and disable WebKit resizing:
- var textarea = $(this).css({resize:'none','overflow-y':'hidden'}),
- // Cache original height, for use later:
- origHeight = textarea.height(),
- // Need clone of textarea, hidden off screen:
- clone = (function(){
- // Properties which may effect space taken up by chracters:
- var props = ['height','width','lineHeight','textDecoration','letterSpacing'],
- propOb = {};
- // Create object of styles to apply:
- $.each(props, function(i, prop){
- propOb[prop] = textarea.css(prop);
- });
- // Clone the actual textarea removing unique properties
- // and insert before original textarea:
- return textarea.clone().removeAttr('id').removeAttr('name').css({
- position: 'absolute',
- top: 0,
- left: -9999
- }).css(propOb).attr('tabIndex','-1').insertBefore(textarea);
- })(),
- lastScrollTop = null,
- updateSize = function() {
- // Prepare the clone:
- clone.height(0).val($(this).val()).scrollTop(10000);
- // Find the height of text:
- var scrollTop = Math.max(clone.scrollTop(), origHeight) + settings.extraSpace,
- toChange = $(this).add(clone);
- // Don't do anything if scrollTip hasen't changed:
- if (lastScrollTop === scrollTop) { return; }
- lastScrollTop = scrollTop;
- // Check for limit:
- if ( scrollTop >= settings.limit ) {
- $(this).css('overflow-y','');
- return;
- }
- // Fire off callback:
- settings.onResize.call(this);
- // Either animate or directly apply height:
- settings.animate && textarea.css('display') === 'block' ?
- toChange.stop().animate({height:scrollTop}, settings.animateDuration, settings.animateCallback)
- : toChange.height(scrollTop);
- };
- // Bind namespaced handlers to appropriate events:
- textarea
- .unbind('.dynSiz')
- .bind('keyup.dynSiz', updateSize)
- .bind('keydown.dynSiz', updateSize)
- .bind('change.dynSiz', updateSize);
- });
- // Chain:
- return this;
- };
- })(jQuery);
- /*!
- * jQuery UI Touch Punch 0.2.3
- *
- * Copyright 2011–2014, Dave Furfero
- * Dual licensed under the MIT or GPL Version 2 licenses.
- *
- * Depends:
- * jquery.ui.widget.js
- * jquery.ui.mouse.js
- */
- !function(a){function f(a,b){if(!(a.originalEvent.touches.length>1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);
- </script><script>
- /*!
- * Masonry PACKAGED v3.3.2
- * Cascading grid layout library
- * http://masonry.desandro.com
- * MIT License
- * by David DeSandro
- */
- !function(a){function b(){}function c(a){function c(b){b.prototype.option||(b.prototype.option=function(b){a.isPlainObject(b)&&(this.options=a.extend(!0,this.options,b))})}function e(b,c){a.fn[b]=function(e){if("string"==typeof e){for(var g=d.call(arguments,1),h=0,i=this.length;i>h;h++){var j=this[h],k=a.data(j,b);if(k)if(a.isFunction(k[e])&&"_"!==e.charAt(0)){var l=k[e].apply(k,g);if(void 0!==l)return l}else f("no such method '"+e+"' for "+b+" instance");else f("cannot call methods on "+b+" prior to initialization; attempted to call '"+e+"'")}return this}return this.each(function(){var d=a.data(this,b);d?(d.option(e),d._init()):(d=new c(this,e),a.data(this,b,d))})}}if(a){var f="undefined"==typeof console?b:function(a){console.error(a)};return a.bridget=function(a,b){c(b),e(a,b)},a.bridget}}var d=Array.prototype.slice;"function"==typeof define&&define.amd?define("jquery-bridget/jquery.bridget",["jquery"],c):c("object"==typeof exports?require("jquery"):a.jQuery)}(window),function(a){function b(b){var c=a.event;return c.target=c.target||c.srcElement||b,c}var c=document.documentElement,d=function(){};c.addEventListener?d=function(a,b,c){a.addEventListener(b,c,!1)}:c.attachEvent&&(d=function(a,c,d){a[c+d]=d.handleEvent?function(){var c=b(a);d.handleEvent.call(d,c)}:function(){var c=b(a);d.call(a,c)},a.attachEvent("on"+c,a[c+d])});var e=function(){};c.removeEventListener?e=function(a,b,c){a.removeEventListener(b,c,!1)}:c.detachEvent&&(e=function(a,b,c){a.detachEvent("on"+b,a[b+c]);try{delete a[b+c]}catch(d){a[b+c]=void 0}});var f={bind:d,unbind:e};"function"==typeof define&&define.amd?define("eventie/eventie",f):"object"==typeof exports?module.exports=f:a.eventie=f}(window),function(){function a(){}function b(a,b){for(var c=a.length;c--;)if(a[c].listener===b)return c;return-1}function c(a){return function(){return this[a].apply(this,arguments)}}var d=a.prototype,e=this,f=e.EventEmitter;d.getListeners=function(a){var b,c,d=this._getEvents();if(a instanceof RegExp){b={};for(c in d)d.hasOwnProperty(c)&&a.test(c)&&(b[c]=d[c])}else b=d[a]||(d[a]=[]);return b},d.flattenListeners=function(a){var b,c=[];for(b=0;b<a.length;b+=1)c.push(a[b].listener);return c},d.getListenersAsObject=function(a){var b,c=this.getListeners(a);return c instanceof Array&&(b={},b[a]=c),b||c},d.addListener=function(a,c){var d,e=this.getListenersAsObject(a),f="object"==typeof c;for(d in e)e.hasOwnProperty(d)&&-1===b(e[d],c)&&e[d].push(f?c:{listener:c,once:!1});return this},d.on=c("addListener"),d.addOnceListener=function(a,b){return this.addListener(a,{listener:b,once:!0})},d.once=c("addOnceListener"),d.defineEvent=function(a){return this.getListeners(a),this},d.defineEvents=function(a){for(var b=0;b<a.length;b+=1)this.defineEvent(a[b]);return this},d.removeListener=function(a,c){var d,e,f=this.getListenersAsObject(a);for(e in f)f.hasOwnProperty(e)&&(d=b(f[e],c),-1!==d&&f[e].splice(d,1));return this},d.off=c("removeListener"),d.addListeners=function(a,b){return this.manipulateListeners(!1,a,b)},d.removeListeners=function(a,b){return this.manipulateListeners(!0,a,b)},d.manipulateListeners=function(a,b,c){var d,e,f=a?this.removeListener:this.addListener,g=a?this.removeListeners:this.addListeners;if("object"!=typeof b||b instanceof RegExp)for(d=c.length;d--;)f.call(this,b,c[d]);else for(d in b)b.hasOwnProperty(d)&&(e=b[d])&&("function"==typeof e?f.call(this,d,e):g.call(this,d,e));return this},d.removeEvent=function(a){var b,c=typeof a,d=this._getEvents();if("string"===c)delete d[a];else if(a instanceof RegExp)for(b in d)d.hasOwnProperty(b)&&a.test(b)&&delete d[b];else delete this._events;return this},d.removeAllListeners=c("removeEvent"),d.emitEvent=function(a,b){var c,d,e,f,g=this.getListenersAsObject(a);for(e in g)if(g.hasOwnProperty(e))for(d=g[e].length;d--;)c=g[e][d],c.once===!0&&this.removeListener(a,c.listener),f=c.listener.apply(this,b||[]),f===this._getOnceReturnValue()&&this.removeListener(a,c.listener);return this},d.trigger=c("emitEvent"),d.emit=function(a){var b=Array.prototype.slice.call(arguments,1);return this.emitEvent(a,b)},d.setOnceReturnValue=function(a){return this._onceReturnValue=a,this},d._getOnceReturnValue=function(){return this.hasOwnProperty("_onceReturnValue")?this._onceReturnValue:!0},d._getEvents=function(){return this._events||(this._events={})},a.noConflict=function(){return e.EventEmitter=f,a},"function"==typeof define&&define.amd?define("eventEmitter/EventEmitter",[],function(){return a}):"object"==typeof module&&module.exports?module.exports=a:e.EventEmitter=a}.call(this),function(a){function b(a){if(a){if("string"==typeof d[a])return a;a=a.charAt(0).toUpperCase()+a.slice(1);for(var b,e=0,f=c.length;f>e;e++)if(b=c[e]+a,"string"==typeof d[b])return b}}var c="Webkit Moz ms Ms O".split(" "),d=document.documentElement.style;"function"==typeof define&&define.amd?define("get-style-property/get-style-property",[],function(){return b}):"object"==typeof exports?module.exports=b:a.getStyleProperty=b}(window),function(a){function b(a){var b=parseFloat(a),c=-1===a.indexOf("%")&&!isNaN(b);return c&&b}function c(){}function d(){for(var a={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},b=0,c=g.length;c>b;b++){var d=g[b];a[d]=0}return a}function e(c){function e(){if(!m){m=!0;var d=a.getComputedStyle;if(j=function(){var a=d?function(a){return d(a,null)}:function(a){return a.currentStyle};return function(b){var c=a(b);return c||f("Style returned "+c+". Are you running this code in a hidden iframe on Firefox? See http://bit.ly/getsizebug1"),c}}(),k=c("boxSizing")){var e=document.createElement("div");e.style.width="200px",e.style.padding="1px 2px 3px 4px",e.style.borderStyle="solid",e.style.borderWidth="1px 2px 3px 4px",e.style[k]="border-box";var g=document.body||document.documentElement;g.appendChild(e);var h=j(e);l=200===b(h.width),g.removeChild(e)}}}function h(a){if(e(),"string"==typeof a&&(a=document.querySelector(a)),a&&"object"==typeof a&&a.nodeType){var c=j(a);if("none"===c.display)return d();var f={};f.width=a.offsetWidth,f.height=a.offsetHeight;for(var h=f.isBorderBox=!(!k||!c[k]||"border-box"!==c[k]),m=0,n=g.length;n>m;m++){var o=g[m],p=c[o];p=i(a,p);var q=parseFloat(p);f[o]=isNaN(q)?0:q}var r=f.paddingLeft+f.paddingRight,s=f.paddingTop+f.paddingBottom,t=f.marginLeft+f.marginRight,u=f.marginTop+f.marginBottom,v=f.borderLeftWidth+f.borderRightWidth,w=f.borderTopWidth+f.borderBottomWidth,x=h&&l,y=b(c.width);y!==!1&&(f.width=y+(x?0:r+v));var z=b(c.height);return z!==!1&&(f.height=z+(x?0:s+w)),f.innerWidth=f.width-(r+v),f.innerHeight=f.height-(s+w),f.outerWidth=f.width+t,f.outerHeight=f.height+u,f}}function i(b,c){if(a.getComputedStyle||-1===c.indexOf("%"))return c;var d=b.style,e=d.left,f=b.runtimeStyle,g=f&&f.left;return g&&(f.left=b.currentStyle.left),d.left=c,c=d.pixelLeft,d.left=e,g&&(f.left=g),c}var j,k,l,m=!1;return h}var f="undefined"==typeof console?c:function(a){console.error(a)},g=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"];"function"==typeof define&&define.amd?define("get-size/get-size",["get-style-property/get-style-property"],e):"object"==typeof exports?module.exports=e(require("desandro-get-style-property")):a.getSize=e(a.getStyleProperty)}(window),function(a){function b(a){"function"==typeof a&&(b.isReady?a():g.push(a))}function c(a){var c="readystatechange"===a.type&&"complete"!==f.readyState;b.isReady||c||d()}function d(){b.isReady=!0;for(var a=0,c=g.length;c>a;a++){var d=g[a];d()}}function e(e){return"complete"===f.readyState?d():(e.bind(f,"DOMContentLoaded",c),e.bind(f,"readystatechange",c),e.bind(a,"load",c)),b}var f=a.document,g=[];b.isReady=!1,"function"==typeof define&&define.amd?define("doc-ready/doc-ready",["eventie/eventie"],e):"object"==typeof exports?module.exports=e(require("eventie")):a.docReady=e(a.eventie)}(window),function(a){function b(a,b){return a[g](b)}function c(a){if(!a.parentNode){var b=document.createDocumentFragment();b.appendChild(a)}}function d(a,b){c(a);for(var d=a.parentNode.querySelectorAll(b),e=0,f=d.length;f>e;e++)if(d[e]===a)return!0;return!1}function e(a,d){return c(a),b(a,d)}var f,g=function(){if(a.matches)return"matches";if(a.matchesSelector)return"matchesSelector";for(var b=["webkit","moz","ms","o"],c=0,d=b.length;d>c;c++){var e=b[c],f=e+"MatchesSelector";if(a[f])return f}}();if(g){var h=document.createElement("div"),i=b(h,"div");f=i?b:e}else f=d;"function"==typeof define&&define.amd?define("matches-selector/matches-selector",[],function(){return f}):"object"==typeof exports?module.exports=f:window.matchesSelector=f}(Element.prototype),function(a,b){"function"==typeof define&&define.amd?define("fizzy-ui-utils/utils",["doc-ready/doc-ready","matches-selector/matches-selector"],function(c,d){return b(a,c,d)}):"object"==typeof exports?module.exports=b(a,require("doc-ready"),require("desandro-matches-selector")):a.fizzyUIUtils=b(a,a.docReady,a.matchesSelector)}(window,function(a,b,c){var d={};d.extend=function(a,b){for(var c in b)a[c]=b[c];return a},d.modulo=function(a,b){return(a%b+b)%b};var e=Object.prototype.toString;d.isArray=function(a){return"[object Array]"==e.call(a)},d.makeArray=function(a){var b=[];if(d.isArray(a))b=a;else if(a&&"number"==typeof a.length)for(var c=0,e=a.length;e>c;c++)b.push(a[c]);else b.push(a);return b},d.indexOf=Array.prototype.indexOf?function(a,b){return a.indexOf(b)}:function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},d.removeFrom=function(a,b){var c=d.indexOf(a,b);-1!=c&&a.splice(c,1)},d.isElement="function"==typeof HTMLElement||"object"==typeof HTMLElement?function(a){return a instanceof HTMLElement}:function(a){return a&&"object"==typeof a&&1==a.nodeType&&"string"==typeof a.nodeName},d.setText=function(){function a(a,c){b=b||(void 0!==document.documentElement.textContent?"textContent":"innerText"),a[b]=c}var b;return a}(),d.getParent=function(a,b){for(;a!=document.body;)if(a=a.parentNode,c(a,b))return a},d.getQueryElement=function(a){return"string"==typeof a?document.querySelector(a):a},d.handleEvent=function(a){var b="on"+a.type;this[b]&&this[b](a)},d.filterFindElements=function(a,b){a=d.makeArray(a);for(var e=[],f=0,g=a.length;g>f;f++){var h=a[f];if(d.isElement(h))if(b){c(h,b)&&e.push(h);for(var i=h.querySelectorAll(b),j=0,k=i.length;k>j;j++)e.push(i[j])}else e.push(h)}return e},d.debounceMethod=function(a,b,c){var d=a.prototype[b],e=b+"Timeout";a.prototype[b]=function(){var a=this[e];a&&clearTimeout(a);var b=arguments,f=this;this[e]=setTimeout(function(){d.apply(f,b),delete f[e]},c||100)}},d.toDashed=function(a){return a.replace(/(.)([A-Z])/g,function(a,b,c){return b+"-"+c}).toLowerCase()};var f=a.console;return d.htmlInit=function(c,e){b(function(){for(var b=d.toDashed(e),g=document.querySelectorAll(".js-"+b),h="data-"+b+"-options",i=0,j=g.length;j>i;i++){var k,l=g[i],m=l.getAttribute(h);try{k=m&&JSON.parse(m)}catch(n){f&&f.error("Error parsing "+h+" on "+l.nodeName.toLowerCase()+(l.id?"#"+l.id:"")+": "+n);continue}var o=new c(l,k),p=a.jQuery;p&&p.data(l,e,o)}})},d}),function(a,b){"function"==typeof define&&define.amd?define("outlayer/item",["eventEmitter/EventEmitter","get-size/get-size","get-style-property/get-style-property","fizzy-ui-utils/utils"],function(c,d,e,f){return b(a,c,d,e,f)}):"object"==typeof exports?module.exports=b(a,require("wolfy87-eventemitter"),require("get-size"),require("desandro-get-style-property"),require("fizzy-ui-utils")):(a.Outlayer={},a.Outlayer.Item=b(a,a.EventEmitter,a.getSize,a.getStyleProperty,a.fizzyUIUtils))}(window,function(a,b,c,d,e){function f(a){for(var b in a)return!1;return b=null,!0}function g(a,b){a&&(this.element=a,this.layout=b,this.position={x:0,y:0},this._create())}function h(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}var i=a.getComputedStyle,j=i?function(a){return i(a,null)}:function(a){return a.currentStyle},k=d("transition"),l=d("transform"),m=k&&l,n=!!d("perspective"),o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"}[k],p=["transform","transition","transitionDuration","transitionProperty"],q=function(){for(var a={},b=0,c=p.length;c>b;b++){var e=p[b],f=d(e);f&&f!==e&&(a[e]=f)}return a}();e.extend(g.prototype,b.prototype),g.prototype._create=function(){this._transn={ingProperties:{},clean:{},onEnd:{}},this.css({position:"absolute"})},g.prototype.handleEvent=function(a){var b="on"+a.type;this[b]&&this[b](a)},g.prototype.getSize=function(){this.size=c(this.element)},g.prototype.css=function(a){var b=this.element.style;for(var c in a){var d=q[c]||c;b[d]=a[c]}},g.prototype.getPosition=function(){var a=j(this.element),b=this.layout.options,c=b.isOriginLeft,d=b.isOriginTop,e=a[c?"left":"right"],f=a[d?"top":"bottom"],g=this.layout.size,h=-1!=e.indexOf("%")?parseFloat(e)/100*g.width:parseInt(e,10),i=-1!=f.indexOf("%")?parseFloat(f)/100*g.height:parseInt(f,10);h=isNaN(h)?0:h,i=isNaN(i)?0:i,h-=c?g.paddingLeft:g.paddingRight,i-=d?g.paddingTop:g.paddingBottom,this.position.x=h,this.position.y=i},g.prototype.layoutPosition=function(){var a=this.layout.size,b=this.layout.options,c={},d=b.isOriginLeft?"paddingLeft":"paddingRight",e=b.isOriginLeft?"left":"right",f=b.isOriginLeft?"right":"left",g=this.position.x+a[d];c[e]=this.getXValue(g),c[f]="";var h=b.isOriginTop?"paddingTop":"paddingBottom",i=b.isOriginTop?"top":"bottom",j=b.isOriginTop?"bottom":"top",k=this.position.y+a[h];c[i]=this.getYValue(k),c[j]="",this.css(c),this.emitEvent("layout",[this])},g.prototype.getXValue=function(a){var b=this.layout.options;return b.percentPosition&&!b.isHorizontal?a/this.layout.size.width*100+"%":a+"px"},g.prototype.getYValue=function(a){var b=this.layout.options;return b.percentPosition&&b.isHorizontal?a/this.layout.size.height*100+"%":a+"px"},g.prototype._transitionTo=function(a,b){this.getPosition();var c=this.position.x,d=this.position.y,e=parseInt(a,10),f=parseInt(b,10),g=e===this.position.x&&f===this.position.y;if(this.setPosition(a,b),g&&!this.isTransitioning)return void this.layoutPosition();var h=a-c,i=b-d,j={};j.transform=this.getTranslate(h,i),this.transition({to:j,onTransitionEnd:{transform:this.layoutPosition},isCleaning:!0})},g.prototype.getTranslate=function(a,b){var c=this.layout.options;return a=c.isOriginLeft?a:-a,b=c.isOriginTop?b:-b,n?"translate3d("+a+"px, "+b+"px, 0)":"translate("+a+"px, "+b+"px)"},g.prototype.goTo=function(a,b){this.setPosition(a,b),this.layoutPosition()},g.prototype.moveTo=m?g.prototype._transitionTo:g.prototype.goTo,g.prototype.setPosition=function(a,b){this.position.x=parseInt(a,10),this.position.y=parseInt(b,10)},g.prototype._nonTransition=function(a){this.css(a.to),a.isCleaning&&this._removeStyles(a.to);for(var b in a.onTransitionEnd)a.onTransitionEnd[b].call(this)},g.prototype._transition=function(a){if(!parseFloat(this.layout.options.transitionDuration))return void this._nonTransition(a);var b=this._transn;for(var c in a.onTransitionEnd)b.onEnd[c]=a.onTransitionEnd[c];for(c in a.to)b.ingProperties[c]=!0,a.isCleaning&&(b.clean[c]=!0);if(a.from){this.css(a.from);var d=this.element.offsetHeight;d=null}this.enableTransition(a.to),this.css(a.to),this.isTransitioning=!0};var r="opacity,"+h(q.transform||"transform");g.prototype.enableTransition=function(){this.isTransitioning||(this.css({transitionProperty:r,transitionDuration:this.layout.options.transitionDuration}),this.element.addEventListener(o,this,!1))},g.prototype.transition=g.prototype[k?"_transition":"_nonTransition"],g.prototype.onwebkitTransitionEnd=function(a){this.ontransitionend(a)},g.prototype.onotransitionend=function(a){this.ontransitionend(a)};var s={"-webkit-transform":"transform","-moz-transform":"transform","-o-transform":"transform"};g.prototype.ontransitionend=function(a){if(a.target===this.element){var b=this._transn,c=s[a.propertyName]||a.propertyName;if(delete b.ingProperties[c],f(b.ingProperties)&&this.disableTransition(),c in b.clean&&(this.element.style[a.propertyName]="",delete b.clean[c]),c in b.onEnd){var d=b.onEnd[c];d.call(this),delete b.onEnd[c]}this.emitEvent("transitionEnd",[this])}},g.prototype.disableTransition=function(){this.removeTransitionStyles(),this.element.removeEventListener(o,this,!1),this.isTransitioning=!1},g.prototype._removeStyles=function(a){var b={};for(var c in a)b[c]="";this.css(b)};var t={transitionProperty:"",transitionDuration:""};return g.prototype.removeTransitionStyles=function(){this.css(t)},g.prototype.removeElem=function(){this.element.parentNode.removeChild(this.element),this.css({display:""}),this.emitEvent("remove",[this])},g.prototype.remove=function(){if(!k||!parseFloat(this.layout.options.transitionDuration))return void this.removeElem();var a=this;this.once("transitionEnd",function(){a.removeElem()}),this.hide()},g.prototype.reveal=function(){delete this.isHidden,this.css({display:""});var a=this.layout.options,b={},c=this.getHideRevealTransitionEndProperty("visibleStyle");b[c]=this.onRevealTransitionEnd,this.transition({from:a.hiddenStyle,to:a.visibleStyle,isCleaning:!0,onTransitionEnd:b})},g.prototype.onRevealTransitionEnd=function(){this.isHidden||this.emitEvent("reveal")},g.prototype.getHideRevealTransitionEndProperty=function(a){var b=this.layout.options[a];if(b.opacity)return"opacity";for(var c in b)return c},g.prototype.hide=function(){this.isHidden=!0,this.css({display:""});var a=this.layout.options,b={},c=this.getHideRevealTransitionEndProperty("hiddenStyle");b[c]=this.onHideTransitionEnd,this.transition({from:a.visibleStyle,to:a.hiddenStyle,isCleaning:!0,onTransitionEnd:b})},g.prototype.onHideTransitionEnd=function(){this.isHidden&&(this.css({display:"none"}),this.emitEvent("hide"))},g.prototype.destroy=function(){this.css({position:"",left:"",right:"",top:"",bottom:"",transition:"",transform:""})},g}),function(a,b){"function"==typeof define&&define.amd?define("outlayer/outlayer",["eventie/eventie","eventEmitter/EventEmitter","get-size/get-size","fizzy-ui-utils/utils","./item"],function(c,d,e,f,g){return b(a,c,d,e,f,g)}):"object"==typeof exports?module.exports=b(a,require("eventie"),require("wolfy87-eventemitter"),require("get-size"),require("fizzy-ui-utils"),require("./item")):a.Outlayer=b(a,a.eventie,a.EventEmitter,a.getSize,a.fizzyUIUtils,a.Outlayer.Item)}(window,function(a,b,c,d,e,f){function g(a,b){var c=e.getQueryElement(a);if(!c)return void(h&&h.error("Bad element for "+this.constructor.namespace+": "+(c||a)));this.element=c,i&&(this.$element=i(this.element)),this.options=e.extend({},this.constructor.defaults),this.option(b);var d=++k;this.element.outlayerGUID=d,l[d]=this,this._create(),this.options.isInitLayout&&this.layout()}var h=a.console,i=a.jQuery,j=function(){},k=0,l={};return g.namespace="outlayer",g.Item=f,g.defaults={containerStyle:{position:"relative"},isInitLayout:!0,isOriginLeft:!0,isOriginTop:!0,isResizeBound:!0,isResizingContainer:!0,transitionDuration:"0.4s",hiddenStyle:{opacity:0,transform:"scale(0.001)"},visibleStyle:{opacity:1,transform:"scale(1)"}},e.extend(g.prototype,c.prototype),g.prototype.option=function(a){e.extend(this.options,a)},g.prototype._create=function(){this.reloadItems(),this.stamps=[],this.stamp(this.options.stamp),e.extend(this.element.style,this.options.containerStyle),this.options.isResizeBound&&this.bindResize()},g.prototype.reloadItems=function(){this.items=this._itemize(this.element.children)},g.prototype._itemize=function(a){for(var b=this._filterFindItemElements(a),c=this.constructor.Item,d=[],e=0,f=b.length;f>e;e++){var g=b[e],h=new c(g,this);d.push(h)}return d},g.prototype._filterFindItemElements=function(a){return e.filterFindElements(a,this.options.itemSelector)},g.prototype.getItemElements=function(){for(var a=[],b=0,c=this.items.length;c>b;b++)a.push(this.items[b].element);return a},g.prototype.layout=function(){this._resetLayout(),this._manageStamps();var a=void 0!==this.options.isLayoutInstant?this.options.isLayoutInstant:!this._isLayoutInited;this.layoutItems(this.items,a),this._isLayoutInited=!0},g.prototype._init=g.prototype.layout,g.prototype._resetLayout=function(){this.getSize()},g.prototype.getSize=function(){this.size=d(this.element)},g.prototype._getMeasurement=function(a,b){var c,f=this.options[a];f?("string"==typeof f?c=this.element.querySelector(f):e.isElement(f)&&(c=f),this[a]=c?d(c)[b]:f):this[a]=0},g.prototype.layoutItems=function(a,b){a=this._getItemsForLayout(a),this._layoutItems(a,b),this._postLayout()},g.prototype._getItemsForLayout=function(a){for(var b=[],c=0,d=a.length;d>c;c++){var e=a[c];e.isIgnored||b.push(e)}return b},g.prototype._layoutItems=function(a,b){if(this._emitCompleteOnItems("layout",a),a&&a.length){for(var c=[],d=0,e=a.length;e>d;d++){var f=a[d],g=this._getItemLayoutPosition(f);g.item=f,g.isInstant=b||f.isLayoutInstant,c.push(g)}this._processLayoutQueue(c)}},g.prototype._getItemLayoutPosition=function(){return{x:0,y:0}},g.prototype._processLayoutQueue=function(a){for(var b=0,c=a.length;c>b;b++){var d=a[b];this._positionItem(d.item,d.x,d.y,d.isInstant)}},g.prototype._positionItem=function(a,b,c,d){d?a.goTo(b,c):a.moveTo(b,c)},g.prototype._postLayout=function(){this.resizeContainer()},g.prototype.resizeContainer=function(){if(this.options.isResizingContainer){var a=this._getContainerSize();a&&(this._setContainerMeasure(a.width,!0),this._setContainerMeasure(a.height,!1))}},g.prototype._getContainerSize=j,g.prototype._setContainerMeasure=function(a,b){if(void 0!==a){var c=this.size;c.isBorderBox&&(a+=b?c.paddingLeft+c.paddingRight+c.borderLeftWidth+c.borderRightWidth:c.paddingBottom+c.paddingTop+c.borderTopWidth+c.borderBottomWidth),a=Math.max(a,0),this.element.style[b?"width":"height"]=a+"px"}},g.prototype._emitCompleteOnItems=function(a,b){function c(){e.dispatchEvent(a+"Complete",null,[b])}function d(){g++,g===f&&c()}var e=this,f=b.length;if(!b||!f)return void c();for(var g=0,h=0,i=b.length;i>h;h++){var j=b[h];j.once(a,d)}},g.prototype.dispatchEvent=function(a,b,c){var d=b?[b].concat(c):c;if(this.emitEvent(a,d),i)if(this.$element=this.$element||i(this.element),b){var e=i.Event(b);e.type=a,this.$element.trigger(e,c)}else this.$element.trigger(a,c)},g.prototype.ignore=function(a){var b=this.getItem(a);b&&(b.isIgnored=!0)},g.prototype.unignore=function(a){var b=this.getItem(a);b&&delete b.isIgnored},g.prototype.stamp=function(a){if(a=this._find(a)){this.stamps=this.stamps.concat(a);for(var b=0,c=a.length;c>b;b++){var d=a[b];this.ignore(d)}}},g.prototype.unstamp=function(a){if(a=this._find(a))for(var b=0,c=a.length;c>b;b++){var d=a[b];e.removeFrom(this.stamps,d),this.unignore(d)}},g.prototype._find=function(a){return a?("string"==typeof a&&(a=this.element.querySelectorAll(a)),a=e.makeArray(a)):void 0},g.prototype._manageStamps=function(){if(this.stamps&&this.stamps.length){this._getBoundingRect();for(var a=0,b=this.stamps.length;b>a;a++){var c=this.stamps[a];this._manageStamp(c)}}},g.prototype._getBoundingRect=function(){var a=this.element.getBoundingClientRect(),b=this.size;this._boundingRect={left:a.left+b.paddingLeft+b.borderLeftWidth,top:a.top+b.paddingTop+b.borderTopWidth,right:a.right-(b.paddingRight+b.borderRightWidth),bottom:a.bottom-(b.paddingBottom+b.borderBottomWidth)}},g.prototype._manageStamp=j,g.prototype._getElementOffset=function(a){var b=a.getBoundingClientRect(),c=this._boundingRect,e=d(a),f={left:b.left-c.left-e.marginLeft,top:b.top-c.top-e.marginTop,right:c.right-b.right-e.marginRight,bottom:c.bottom-b.bottom-e.marginBottom};return f},g.prototype.handleEvent=function(a){var b="on"+a.type;this[b]&&this[b](a)},g.prototype.bindResize=function(){this.isResizeBound||(b.bind(a,"resize",this),this.isResizeBound=!0)},g.prototype.unbindResize=function(){this.isResizeBound&&b.unbind(a,"resize",this),this.isResizeBound=!1},g.prototype.onresize=function(){function a(){b.resize(),delete b.resizeTimeout}this.resizeTimeout&&clearTimeout(this.resizeTimeout);var b=this;this.resizeTimeout=setTimeout(a,100)},g.prototype.resize=function(){this.isResizeBound&&this.needsResizeLayout()&&this.layout()},g.prototype.needsResizeLayout=function(){var a=d(this.element),b=this.size&&a;return b&&a.innerWidth!==this.size.innerWidth},g.prototype.addItems=function(a){var b=this._itemize(a);return b.length&&(this.items=this.items.concat(b)),b},g.prototype.appended=function(a){var b=this.addItems(a);b.length&&(this.layoutItems(b,!0),this.reveal(b))},g.prototype.prepended=function(a){var b=this._itemize(a);if(b.length){var c=this.items.slice(0);this.items=b.concat(c),this._resetLayout(),this._manageStamps(),this.layoutItems(b,!0),this.reveal(b),this.layoutItems(c)}},g.prototype.reveal=function(a){this._emitCompleteOnItems("reveal",a);for(var b=a&&a.length,c=0;b&&b>c;c++){var d=a[c];d.reveal()}},g.prototype.hide=function(a){this._emitCompleteOnItems("hide",a);for(var b=a&&a.length,c=0;b&&b>c;c++){var d=a[c];d.hide()}},g.prototype.revealItemElements=function(a){var b=this.getItems(a);this.reveal(b)},g.prototype.hideItemElements=function(a){var b=this.getItems(a);this.hide(b)},g.prototype.getItem=function(a){for(var b=0,c=this.items.length;c>b;b++){var d=this.items[b];if(d.element===a)return d}},g.prototype.getItems=function(a){a=e.makeArray(a);for(var b=[],c=0,d=a.length;d>c;c++){var f=a[c],g=this.getItem(f);g&&b.push(g)}return b},g.prototype.remove=function(a){var b=this.getItems(a);if(this._emitCompleteOnItems("remove",b),b&&b.length)for(var c=0,d=b.length;d>c;c++){var f=b[c];f.remove(),e.removeFrom(this.items,f)}},g.prototype.destroy=function(){var a=this.element.style;a.height="",a.position="",a.width="";for(var b=0,c=this.items.length;c>b;b++){var d=this.items[b];d.destroy()}this.unbindResize();var e=this.element.outlayerGUID;delete l[e],delete this.element.outlayerGUID,i&&i.removeData(this.element,this.constructor.namespace)},g.data=function(a){a=e.getQueryElement(a);var b=a&&a.outlayerGUID;return b&&l[b]},g.create=function(a,b){function c(){g.apply(this,arguments)}return Object.create?c.prototype=Object.create(g.prototype):e.extend(c.prototype,g.prototype),c.prototype.constructor=c,c.defaults=e.extend({},g.defaults),e.extend(c.defaults,b),c.prototype.settings={},c.namespace=a,c.data=g.data,c.Item=function(){f.apply(this,arguments)},c.Item.prototype=new f,e.htmlInit(c,a),i&&i.bridget&&i.bridget(a,c),c},g.Item=f,g}),function(a,b){"function"==typeof define&&define.amd?define(["outlayer/outlayer","get-size/get-size","fizzy-ui-utils/utils"],b):"object"==typeof exports?module.exports=b(require("outlayer"),require("get-size"),require("fizzy-ui-utils")):a.Masonry=b(a.Outlayer,a.getSize,a.fizzyUIUtils)}(window,function(a,b,c){var d=a.create("masonry");return d.prototype._resetLayout=function(){this.getSize(),this._getMeasurement("columnWidth","outerWidth"),this._getMeasurement("gutter","outerWidth"),this.measureColumns();var a=this.cols;for(this.colYs=[];a--;)this.colYs.push(0);this.maxY=0},d.prototype.measureColumns=function(){if(this.getContainerWidth(),!this.columnWidth){var a=this.items[0],c=a&&a.element;this.columnWidth=c&&b(c).outerWidth||this.containerWidth}var d=this.columnWidth+=this.gutter,e=this.containerWidth+this.gutter,f=e/d,g=d-e%d,h=g&&1>g?"round":"floor";f=Math[h](f),this.cols=Math.max(f,1)},d.prototype.getContainerWidth=function(){var a=this.options.isFitWidth?this.element.parentNode:this.element,c=b(a);this.containerWidth=c&&c.innerWidth},d.prototype._getItemLayoutPosition=function(a){a.getSize();var b=a.size.outerWidth%this.columnWidth,d=b&&1>b?"round":"ceil",e=Math[d](a.size.outerWidth/this.columnWidth);e=Math.min(e,this.cols);for(var f=this._getColGroup(e),g=Math.min.apply(Math,f),h=c.indexOf(f,g),i={x:this.columnWidth*h,y:g},j=g+a.size.outerHeight,k=this.cols+1-f.length,l=0;k>l;l++)this.colYs[h+l]=j;return i},d.prototype._getColGroup=function(a){if(2>a)return this.colYs;for(var b=[],c=this.cols+1-a,d=0;c>d;d++){var e=this.colYs.slice(d,d+a);b[d]=Math.max.apply(Math,e)}return b},d.prototype._manageStamp=function(a){var c=b(a),d=this._getElementOffset(a),e=this.options.isOriginLeft?d.left:d.right,f=e+c.outerWidth,g=Math.floor(e/this.columnWidth);g=Math.max(0,g);var h=Math.floor(f/this.columnWidth);h-=f%this.columnWidth?0:1,h=Math.min(this.cols-1,h);for(var i=(this.options.isOriginTop?d.top:d.bottom)+c.outerHeight,j=g;h>=j;j++)this.colYs[j]=Math.max(i,this.colYs[j])},d.prototype._getContainerSize=function(){this.maxY=Math.max.apply(Math,this.colYs);var a={height:this.maxY};return this.options.isFitWidth&&(a.width=this._getContainerFitWidth()),a},d.prototype._getContainerFitWidth=function(){for(var a=0,b=this.cols;--b&&0===this.colYs[b];)a++;return(this.cols-a)*this.columnWidth-this.gutter},d.prototype.needsResizeLayout=function(){var a=this.containerWidth;return this.getContainerWidth(),a!==this.containerWidth},d});
- </script>
- <style>
- .hidden {
- display: none !important;
- }
- </style>
- <script type="text/javascript">
- (function(course_data){
- "use strict";
- function GetLearningData(){
- preloaderOn();
- $.ajax({
- type: "POST",
- url: "/pp/Ext/extjs_json_collection_data.html",
- dataType: "json",
- data: {
- collection_code: "beluga_course_data_rc",
- parameters: "learning_id="+course_data.learningID
- },
- success: function (data, textStatus, jqXHR) {
- preloaderOff();
- RenderLearningData(data.results[0]);
- }
- });
- };
- function RenderLearningData(data){
- $("#start_learning").off();
- $("#finish_learning").off();
- $("#learning_title").text(data.name);
- data.categories.forEach(function(el){
- $("#categories").after(
- '<li class="b-test__breadcrumbs-item"><a href="javascript:void(0);" class="b-test__breadcrumbs-link">'+el+'</a></li>'
- );
- });
- $("#categories").remove();
- if (data.course_resource != undefined && data.course_resource != ""){
- $("#course_image").css("background", "url('download_file.html?file_id="+data.course_resource+"') no-repeat center center");
- } else {
- $("#course_image").remove();
- }
- switch (data.status) {
- case 0:
- $("#course_status").text("Назначен");
- $("#finish_learning").addClass("hidden");
- $("#start_learning").text("Начать");
- break;
- case 1:
- $("#course_status").text("В процессе");
- $("#start_learning").text("Продолжить");
- if(!data.has_unfinished_required_parts || data.finish_without_mastery_score){
- $("#finish_learning").removeClass("hidden");
- } else {
- $("#finish_learning").addClass("hidden");
- }
- if(!data.has_unfinished_parts){
- $("#start_learning").addClass("hidden");
- } else {
- $("#start_learning").removeClass("hidden");
- }
- break;
- case 2:
- $("#course_status").text("Завершен");
- $("#finish_learning").removeClass("hidden");
- if(data.is_self_enrolled){
- $("#start_learning").text("Начать заново");
- } else {
- $("#start_learning").addClass("hidden");
- }
- if (data.feedback_type_id != null) {
- $("#feedback").attr("href", "view_doc.html?mode=response&doc_id=&response_object_id="+data.course_id+"&response_type_id="+data.feedback_type_id);
- $("#feedback").show();
- }
- break;
- case 3:
- $("#course_status").text("Не пройден");
- $("#finish_learning").removeClass("hidden");
- if(data.is_self_enrolled){
- $("#start_learning").text("Начать заново");
- } else {
- $("#start_learning").addClass("hidden");
- }
- if (data.feedback_type_id != null) {
- $("#feedback").attr("href", "view_doc.html?mode=response&doc_id=&response_object_id="+data.course_id+"&response_type_id="+data.feedback_type_id);
- $("#feedback").show();
- }
- break;
- case 4:
- $("#course_status").text("Пройден");
- $("#finish_learning").removeClass("hidden");
- if(data.is_self_enrolled){
- $("#start_learning").text("Начать заново");
- } else {
- $("#start_learning").addClass("hidden");
- }
- if (data.feedback_type_id != null) {
- $("#feedback").attr("href", "view_doc.html?mode=response&doc_id=&response_object_id="+data.course_id+"&response_type_id="+data.feedback_type_id);
- $("#feedback").show();
- }
- break;
- case 5:
- $("#course_status").text("Просмотрен");
- $("#finish_learning").removeClass("hidden");
- if(data.is_self_enrolled){
- $("#start_learning").text("Начать заново");
- } else {
- $("#start_learning").addClass("hidden");
- }
- if (data.feedback_type_id != null) {
- $("#feedback").attr("href", "view_doc.html?mode=response&doc_id=&response_object_id="+data.course_id+"&response_type_id="+data.feedback_type_id);
- $("#feedback").show();
- }
- break;
- case 10:
- if(data.is_self_enrolled){
- $("#course_status").text("Не назначен");
- $("#start_learning").text("Начать");
- } else {
- $("#course_status").text("Не доступен");
- $("#start_learning").off();
- $("#start_learning").addClass("hidden");
- }
- $("#finish_learning").addClass("hidden");
- break;
- case 11:
- $("#course_status").text("Не доступен");
- $("#start_learning").addClass("hidden");
- $("#finish_learning").addClass("hidden");
- $("#start_learning").off();
- $("#finish_learning").off();
- break;
- default:
- break;
- }
- if(data.a_l_id == ""){
- $("#finish_learning").addClass("hidden");
- }
- if(data.status != 11){
- $("#course_score").text(data.course_score);
- $("#date_start").text(data.date_start != '' ? data.date_start : '-');
- $("#date_l_start").text(data.date_l_start != '' ? data.date_l_start : '-');
- $("#date_finish").text(data.date_finish != '' ? data.date_finish : '-');
- if(data.description != ""){
- $("#course_desc").html(data.description);
- } else {
- $("#course_desc").remove();
- }
- $("#course_materials").empty();
- $("#course_map").empty();
- if(data.course_map.length > 0){
- data.course_map.forEach(function(el){
- switch (el.type) {
- case 'Курс':
- var btn = (function(){
- if(data.status == 10){
- return ''
- } else if (el.state_id <= 1 && data.status <= 2) {
- return $('<div>')
- .addClass("b-test__table-cell b-course__table-cell b-course__table-but")
- .append(
- $("<div>").addClass("b-course__table-cell-wrap").append(
- $('<a>')
- .attr('href', 'javascript:void(0);')
- .addClass("b-course__button-empty b-course__table-button")
- .text(el.state_id == 0 ? "Начать":"Продолжить")
- .on('click', function(){
- var _form = new FormData;
- _form.append("course_id", data.course_id);
- $.ajax({
- url: "/custom_web_template.html?object_code=beluga_get_session_id_sum",
- type: "POST",
- data: _form,
- dataType: "json",
- processData: false,
- contentType: false,
- success: function(res) {
- var courseWindow = window.open( 'course_launch.html?course_id='+data.course_id+'&object_id='+data.a_l_id+'&sid='+res.responseText+ "&part_code="+ el.parts);
- var _intrval_mod = setInterval(function(){
- if (courseWindow.closed) {
- clearInterval(_intrval_mod);
- location.href = 'view_doc.html?mode=course_page&object_id='+course_data.learningID;
- }
- }, 500);
- }
- });
- }),
- (function(){
- if(el.cur_attempt < el.attempts){
- return $('<a>')
- .attr('href', 'javascript:void(0);')
- .addClass("b-course__complete-attempt-link")
- .text("Завершить попытку")
- .on('click', function(){
- var _form = new FormData;
- _form.append("course_id", data.course_id);
- _form.append("learning_id", data.a_l_id);
- _form.append("part_code", el.parts);
- $.ajax({
- url: "/custom_web_template.html?object_code=beluga_course_finish_attempt",
- type: "POST",
- data: _form,
- dataType: "json",
- processData: false,
- contentType: false,
- success: function(res) {
- GetLearningData();
- }
- });
- })
- }
- })()
- )
- )
- } else {
- var score = 0;
- if(el.max_score != 0){
- score = el.score/el.max_score;
- } else {
- score = 1;
- }
- return $("<div>")
- .addClass("b-test__table-cell b-course__table-cell b-course__table-no-but")
- .append(
- $("<div>").addClass("b-course__table-cell-wrap").append(
- $("<div>").addClass("b-course__type-wrap").append(
- $("<div>")
- .addClass('goal-map__type '+(el.state_id != 3 ? "ready":"not-ready")+' b-course__type')
- .append(
- $('<span>')
- .text(el.state_name)
- .on('click', function(){
- var _form = new FormData;
- _form.append("course_id", data.course_id);
- $.ajax({
- url: "/custom_web_template.html?object_code=beluga_get_session_id_sum",
- type: "POST",
- data: _form,
- dataType: "json",
- processData: false,
- contentType: false,
- success: function(res) {
- var courseWindow = window.open( 'course_launch.html?course_id='+data.course_id+'&object_id='+data.a_l_id+'&sid='+res.responseText+ "&part_code="+ el.parts);
- var _intrval_mod = setInterval(function(){
- if (courseWindow.closed) {
- clearInterval(_intrval_mod);
- location.href = 'view_doc.html?mode=course_page&object_id='+course_data.learningID;
- }
- }, 500);
- }
- });
- }),
- $('<span>')
- .addClass("b-course__text-last")
- .text(Math.round(score*100)+"%")
- )
- ),
- (function(){
- if(el.cur_attempt < el.attempts){
- return $('<a>')
- .attr('href', 'javascript:void(0);')
- .addClass("b-course__complete-attempt-link new")
- .text("Пройти заново")
- .on('click', function(){
- var _form = new FormData;
- _form.append("course_id", data.course_id);
- _form.append("learning_id", data.a_l_id);
- _form.append("part_code", el.parts);
- $.ajax({
- url: "/custom_web_template.html?object_code=beluga_course_finish_attempt",
- type: "POST",
- data: _form,
- dataType: "json",
- processData: false,
- contentType: false,
- success: function(res) {
- GetLearningData();
- }
- });
- })
- }
- })()
- )
- )
- }
- })();
- break;
- case 'Тест':
- var btn = (function(){
- if(data.status == 10 || data.status == 11){
- return;
- } else if (el.state_id <= 1 && data.status <= 2) {
- return $('<div>')
- .addClass("b-test__table-cell b-course__table-cell b-course__table-but")
- .append(
- $("<div>").addClass("b-course__table-cell-wrap").append(
- '<a href="javascript:void(0);" class="b-course__button-empty b-course__table-button">'+(el.state_id == 0 ? "Начать":"Продолжить")+'</a>'
- )
- )
- .on('click', function(){
- location.href = "view_doc.html?mode=test_page&object_id="+el.test_id+"&course_id="+data.course_id+"&part_code="+el.parts+(data.a_l_id != "" ? "&learning_id="+data.a_l_id : "");
- });
- } else {
- if(!el.is_locked){
- var score = 0;
- if(el.max_score != 0){
- score = el.score/el.max_score;
- } else {
- score = 1;
- }
- return $("<div>")
- .addClass("b-test__table-cell b-course__table-cell b-course__table-no-but")
- .append(
- $("<div>").addClass("b-course__table-cell-wrap").append(
- $("<div>").addClass("b-course__type-wrap").append(
- $("<div>")
- .addClass("goal-map__type "+(el.state_id != 3 ? "ready":"not-ready")+" b-course__type")
- .append(
- $("<span>").text(el.state_name),
- $("<span>").addClass("b-course__text-last").text(Math.round((score)*100)+"%")
- )
- ).on('click', function(){
- location.href = "view_doc.html?mode=test_page&object_id="+el.test_id+"&course_id="+data.course_id+"&part_code="+el.parts+(data.a_l_id != "" ? "&learning_id="+data.a_l_id : "");
- })
- )
- );
- }
- }
- })();
- break;
- default:
- var btn = (function(){
- if(data.status == 10 || data.status == 11){
- return;
- } else {
- return $('<div>')
- .addClass("b-test__table-cell b-course__table-cell b-course__table-but")
- .append(
- $("<div>").addClass("b-course__table-cell-wrap").append(
- '<a href="javascript:void(0);" class="b-course__button-empty b-course__table-button">Открыть</a>'
- )
- )
- .on('click', function(){
- var _form = new FormData;
- _form.append("course_id", data.course_id);
- $.ajax({
- url: "/custom_web_template.html?object_code=beluga_get_session_id_sum",
- type: "POST",
- data: _form,
- dataType: "json",
- processData: false,
- contentType: false,
- success: function(res) {
- var url = 'course_launch.html?course_id='+data.course_id+'&object_id='+data.a_l_id+'&sid='+res.responseText+ "&part_code="+ el.parts;
- if(data.a_l_id == "" && el.type == 'Файл'){
- url = el.url;
- }
- var courseWindow = window.open(url);
- var _intrval_mod = setInterval(function(){
- if (courseWindow.closed) {
- clearInterval(_intrval_mod);
- location.href = 'view_doc.html?mode=course_page&object_id='+course_data.learningID;
- }
- }, 500);
- }
- });
- });
- }
- })();
- break;
- }
- $("#course_map").append(
- $("<div>")
- .addClass("b-test__table-row b-course__table-row")
- .append(
- $("<div>")
- .addClass("b-test__table-cell b-course__table-cell")
- .append(
- '<a href="javascript:void(0);" class="b-course__title-link">'+el.name+'</a>'
- ),
- $("<div>")
- .addClass("b-test__table-cell b-text__grey b-course__table-cell clearfix")
- .append(
- '<span class="b-course__table-text">'+el.type+'</span><span class="b-course__table-num">'+el.score+(el.max_score != 0 && el.max_score != '-' ? '/'+el.max_score : '')+'</span>'
- ),
- btn
- )
- );
- });
- } else {
- $("#map_block").remove();
- }
- if(data.docs.length != 0){
- data.docs.forEach(function(el){
- $("#course_materials").append(
- $("<div>")
- .addClass("b-test__table-row b-course__table-row" + (el.type == 'video' ? " b-course__table-row-video": ""))
- .append(
- $("<div>")
- .addClass("b-test__table-cell b-course__table-cell b-course__material-cell")
- .append(
- (function(){
- if(el.type == 'video'){
- return '<div class="b-course__material-icon-video"><i class="b-icon__play b-course__material-icon"></i></div>';
- } else {
- return '';
- }
- }),
- ' <a href="javascript:void(0);" class="b-course__title-link">'+el.name+'</a>'
- ),
- '<div class="b-test__table-cell b-text__grey clearfix b-course__material-cell">'+
- ' <span class="b-course__table-text b-course__big-text">'+el.type+'</span>'+
- ' <span class="b-course__table-num b-course__material-text">'+el.size+'</span></div>'+
- '</div>',
- $('<div>')
- .addClass("b-test__table-cell b-course__table-cell b-course__table-but b-course__material-cell")
- .append('<a href="javascript:void(0);" class="b-course__button-empty b-course__table-button b-course__material-button float-right b-course__material-button-download">Скачать</a>')
- .on("click", function(){
- window.open(el.url );
- })
- )
- );
- });
- } else {
- $("#materials_block").remove();
- }
- } else {
- $("#course_block").empty().append(
- '<h2 class="b-title__h2 b-course__h2">Курс находится в разработке.</h2>'
- )
- }
- if($("#start_learning").hasClass("hidden") && $("#finish_learning").hasClass("hidden")){
- $(".b-fixpanel").hide();
- }
- $("#start_learning").on("click", function(){
- if(data.status == 0 || data.status == 1){
- var _form = new FormData;
- _form.append("course_id", data.course_id);
- $.ajax({
- url: "/custom_web_template.html?object_code=beluga_get_session_id_sum",
- type: "POST",
- data: _form,
- dataType: "json",
- processData: false,
- contentType: false,
- success: function(res) {
- var courseWindow = window.open( 'course_launch.html?course_id='+data.course_id+'&object_id='+data.a_l_id+'&sid='+res.responseText+ "&part_code="+ data.c_part);
- var _intrval_mod = setInterval(function(){
- if (courseWindow.closed) {
- clearInterval(_intrval_mod);
- location.href = 'view_doc.html?mode=course_page&object_id='+course_data.learningID;
- }
- }, 500);
- }
- });
- } else {
- var form_data = new FormData();
- form_data.append("course_id", data.course_id)
- form_data.append("course_part", data.c_part)
- $.ajax({
- url: "/custom_web_template.html?object_code=beluga_activate_course",
- type: "POST",
- data: form_data,
- dataType: "json",
- processData: false,
- contentType: false,
- success: function(res) {
- if(!res.error){
- var courseWindow = window.open(res.url);
- var _intrval_mod = setInterval(function(){
- if (courseWindow.closed) {
- clearInterval(_intrval_mod);
- location.href = 'view_doc.html?mode=course_page&object_id='+course_data.learningID;
- }
- }, 500);
- } else {
- alert(data.message);
- }
- }
- });
- }
- });
- $("#finish_learning").click(function(){
- var form_data = new FormData();
- form_data.append("course_id", data.course_id);
- $.ajax({
- url: "/custom_web_template.html?object_code=beluga_finish_course",
- type: "POST",
- data: form_data,
- dataType: "json",
- processData: false,
- contentType: false,
- success: function(data) {
- location.href = 'view_doc.html?mode=course_page&object_id='+course_data.learningID;
- },
- error: function(){
- location.href = 'view_doc.html?mode=course_page&object_id='+course_data.learningID;
- }
- });
- });
- var h = $(".b-fixpanel").outerHeight();
- $("#panel_fix_height").css("height", h+"px");
- $(".b-course__title-link").on("click", function(){
- $(this).parent().next().next().click();
- });
- }
- function init(){
- GetLearningData();
- }
- init();
- $(window).on('load, resize, scroll', function(){
- var h = $(".b-footer").outerHeight();
- if (Math.round($(window).scrollTop()) == $(document).outerHeight() - $(window).outerHeight())
- {
- //Пользователь долистал до низа страницы
- $(".b-fixpanel").css("bottom", h+"px");
- }
- else {
- $(".b-fixpanel").css("bottom", "");
- }
- });
- })({"learningID":"6541234634070967339"});
- </script>
- <div class="b-page__title">
- <div class="b-container">
- <h1 class="b-title__h1 b-course__h1" id="learning_title"></h1>
- </div>
- </div>
- <div class="b-test__breadcrumbs">
- <div class="b-container">
- <div class="b-test__breadcrumbs-wrap b-course__breadcrumbs-wrap">
- <ul class="b-test__breadcrumbs-ul">
- <li class="b-test__breadcrumbs-item"><a href="javascript:void(0);"><div class="b-icon-course b-test__icon-course b-test__icon-test float-left"></div>Курс</a></li>
- <li class="b-test__breadcrumbs-item" id="categories"><a href="javascript:void(0);" class="b-test__breadcrumbs-link" >Вводные тесты</a></li>
- <li class="b-test__breadcrumbs-item active"><a href="javascript:void(0);" class="b-test__breadcrumbs-link b-test__breadcrumbs-link-last"><div class="icon-play b-test__icon-play float-left"></div> <span id="course_status">В процессе</span></a></li>
- </ul>
- </div>
- </div>
- </div>
- <div class="b-container" id="course_block">
- <div class="b-course__image" id="course_image"></div>
- <div class="b-test__table b-course__table">
- <div class="b-test__table-row">
- <div class="b-test__table-cell b-text__grey b-course__text-little">Баллы</div>
- <div class="b-test__table-cell"><span class="wl-text__orange" id="course_score"></span></div>
- </div>
- <div class="b-test__table-row">
- <div class="b-test__table-cell b-text__grey b-course__text-little">Дата активации</div>
- <div class="b-test__table-cell" id="date_start"></div>
- </div>
- <div class="b-test__table-row">
- <div class="b-test__table-cell b-text__grey b-course__text-little">Дата последнего посещения</div>
- <div class="b-test__table-cell" id="date_l_start"></div>
- </div>
- <div class="b-test__table-row">
- <div class="b-test__table-cell b-text__grey b-course__text-little">Дата планируемого завершения</div>
- <div class="b-test__table-cell" id="date_finish"></div>
- </div>
- </div>
- <div class="b-test__description" id="course_desc">
- </div>
- <div id="map_block">
- <h3 class="b-test__h3">Карта курса</h3>
- <div class="b-course__table-wrap" >
- <div class="b-test__table b-course__table" id="course_map">
- </div>
- </div>
- </div>
- <div id="materials_block">
- <h3 class="b-test__h3">Материалы курса</h3>
- <div class="b-course__table-wrap">
- <div class="b-test__table b-course__table b-course__table-material" id="course_materials">
- </div>
- </div>
- </div>
- </div>
- <div id="panel_fix_height"></div>
- <div class="b-fixpanel">
- <div class="b-container">
- <a href="javascript:void(0);" class="b-fixpanel__save" style="margin-right: 10px;" id="start_learning">Продолжить</a>
- <a href="javascript:void(0);" class="b-fixpanel__complete" id="finish_learning">Завершить</a>
- <a href="javascript:void(0);" class="b-fixpanel__complete" style="margin-right: 10px; display: none;" id="feedback">Оставить отзыв</a>
- </div>
- </div>
- <!--footer end -->
- <script type="text/javascript" src="scorm_api.js" language="javascript"></script>
- <script type="text/javascript">
- /*jQuery(function(){
- jQuery('textarea').autoResize();
- });*/
- $('select').selectric({
- maxHeight: 200
- });
- </script>
- <script type="text/javascript">
- $(".b-library__container").masonry({
- itemSelector: '.item',
- columnWidth: ".item",
- gutter: 10,
- isInitLayout: true,
- //isFitWidth: true,
- isResizeBound: true,
- });
- </script>
- <div class="b-container">
- </div><div class="b-container"><a style="margin-bottom: 100px; " class="b-button__blue full" href='view_print_form.html?print_form_id=6473426798783395895&object_id=6716797818596368129&sid=6473426798783395895'><h2>РАСПЕЧАТАТЬ СЕРТИФИКАТ</h2></a>
- </div><!-- старт сокрытие рамки новостей-->
- <!-- конец сокрытие рамки новостей--><!-- старт Ссылка на страницу новости со страницу одной новости-->
- <!-- конец Ссылка на страницу новости со страницу одной новости--><script>
- $(document).ready(function(){
- $(".portalhelp").click(function(){
- if(!$(".introjs-overlay").length>0)
- {
- introJs().start();
- }
- })
- })
- </script>
- </div>
- </div>
- <footer class="b-footer blue">
- <div class="b-container">
- <div class="b-footer__wrap">
- <div class="b-footer__header clearfix">
- <div class="b-footer__nav float-left">
- <nav id="footer_menu_main">
- </nav>
- </div>
- <div class="b-footer__link">
- <a id="footer_send_admin" href="javascript:void(0)">Написать администратору</a>
- </div>
- </div>
- <div class="b-footer__footer clearfix">
- <div class="b-footer__logo float-left">
- <a href="javascript:void(0)"><img src="download_file.html?file_id=6621426380956391193" alt="logo"></a>
- </div>
- <div class="b-footer__group float-left">
- <a id="footer_copy" href="javascript:void(0)"></a>
- </div>
- <div class="b-footer__logo-lab float-right">
- <a href="https://labmedia.su/">
- <img src="download_file.html?file_id=6621426457715887988" alt="logo">
- </a>
- </div>
- </div>
- </div>
- </div>
- <div id="footer_modal_admin"></div>
- </footer>
- <script>
- $(document).ready(function () {
- 'use strict';
- //модальное окно
- var Modal = (function () {
- var defaultText = 'Не более 5 МБ',
- maxFileSize = 1024 * 1024 * 5; //5 МБ
- function Constructor (config) {
- var self = this,
- emailTextArea = config.curUserEmail != "" ? $() : $('<textarea/>')
- .addClass("comment_input b-textarea comments")
- .attr({
- "id": "footer_send_from",
- "rows": 1,
- "placeholder": "Введите ваш адрес электронной почты",
- "style": "margin-top: 0; margin-bottom: 23px;"
- }),
- textarea = $('<textarea/>')
- .attr('maxlength', '3000')
- .addClass("b-write-to-admin__textarea-item"),
- label = $('<span/>')
- .addClass('b-write-to-admin__desc')
- .text(defaultText),
- delFileBtn = $('<a/>')
- .addClass('delete_file_btn')
- .attr('href', 'javascript:void(0);')
- .append(
- $('<i/>')
- .addClass('b-icon__delete')
- .css({
- 'position': 'absolute',
- 'margin-top': '23px',
- 'margin-left': '5px'
- })
- ),
- sendBtn = $('<a/>')
- .attr('href', 'javascript:void(0);')
- .addClass('b-write-to-admin__blue')
- .text('Отправить'),
- cancelBtn = $('<a/>')
- .attr('href', 'javascript:void(0);')
- .addClass('b-button__empty')
- .text('Отмена'),
- loadFileBtn = $('<a/>')
- .addClass('b-write-to-admin__but')
- .attr('href', 'javascript:void(0);')
- .append(
- $("<span/>")
- .text('Загрузить файл')
- ),
- fileInput = $('<input/>')
- .hide()
- .attr('accept', '.jpg, .jpeg, .png')
- .attr('type', 'file'),
- fileBlock = $('<div/>')
- .addClass('b-write-to-admin__download')
- .append(
- loadFileBtn,
- fileInput,
- label,
- delFileBtn
- ),
- domElement = $('<div/>')
- .addClass('b-shadow fade in')
- .hide()
- .append(
- $('<div/>')
- .addClass('b-modal b-report-selection b-write-to-admin')
- .hide()
- .append(
- $('<div/>')
- .addClass('b-modal__wrapper')
- .css('overflow', 'hidden')
- .append(
- $('<div/>')
- .addClass('b-modal__header b-report-selection__header')
- .append(
- $('<h3/>')
- .addClass('b-modal__title b-report-selection__title')
- .text('Написать администратору')
- ),
- $('<div/>')
- .addClass('b-modal__content')
- .css({
- 'max-height': '247px;',
- 'overflow-y': 'auto;'
- })
- .append(
- $('<div/>')
- .addClass('b-write-to-admin__textarea')
- .append(
- emailTextArea,
- textarea
- ),
- fileBlock
- ),
- $('<div/>')
- .addClass('b-report-selection__footer b-write-to-admin__footer')
- .append(
- sendBtn,
- cancelBtn
- )
- )
- )
- );
- //если в браузере нет FormData картинки не грузим
- if (!('FileReader' in window)) {
- fileBlock.hide();
- }
- //клик по кнопке Загрузить файл
- loadFileBtn.on('click', function (event) {
- fileInput.click();
- });
- //клик по кнопке Удалить файл
- delFileBtn.on('click', function (event) {
- fileInput.val('');
- self.fileText(defaultText);
- $(".delete_file_btn").hide();
- })
- //клик по кнопке Отправить
- sendBtn.on('click', function (event) {
- //клик обрабатывается если кнопка активна и передан колбэк и указана почта по требованию
- if (sendBtn.hasClass('active')) {
- var files = fileInput.prop("files"), form_data;
- if (files.length > 0) {
- var fr = new FileReader();
- fr.onload = function (res) {
- self.sendAjax(self.textarea.val(), fr.result, files[0].name);
- };
- fr.readAsBinaryString(files[0]);
- } else {
- self.sendAjax(self.textarea.val(), '', '');
- }
- sendBtn.removeClass('active');
- }
- });
- //добавление картинки
- fileInput.on('change', function (event) {
- var files = fileInput.prop("files"), form_data;
- if (files.length > 0) {
- //проверяем размер файла
- if (maxFileSize >= files[0].size) {
- $(".delete_file_btn").show();
- self.fileText(files[0].name);
- } else {
- $(".delete_file_btn").hide();
- self.errorFileText('Размер файла превышает 5 МБ');
- }
- }
- });
- //клик по кнопке Отменить
- cancelBtn.on('click', function (event) {
- self.hide();
- });
- //обработчик для textarea
- textarea.on('input change keyup', function (event) {
- sendBtn.toggleClass('active', self.validateInput());
- });
- emailTextArea.on('input change keyup', function (event) {
- sendBtn.toggleClass('active', self.validateInput());
- });
- //рендер на странице
- if (config.renderToId)
- $('#' + config.renderToId).append(domElement);
- //интерфейс класса
- self.domElement = domElement;
- self.label = label;
- self.emailTextArea = emailTextArea;
- self.textarea = textarea;
- self.fileInput = fileInput;
- self.sendBtn = sendBtn;
- self.curUserEmail = config.curUserEmail;
- }
- Constructor.prototype.deleteFile = function() {
- var self = this;
- self.fileText(defaultText);
- $(".delete_file_btn").hide();
- }
- Constructor.prototype.show = function () {
- var self = this;
- //при повторном открытии очищаем введенный текст, выбранный файл, кнопку отправить делаем не активной
- self.textarea.val('');
- self.fileText(defaultText);
- self.fileInput.val('');
- self.sendBtn.removeClass('active');
- $(".delete_file_btn").hide();
- self.domElement.show();
- $(".b-modal", self.domElement).show();
- $("body").addClass("off-scroll");
- }
- Constructor.prototype.hide = function () {
- var self = this;
- $("body").removeClass("off-scroll");
- $(".b-modal", self.domElement).hide();
- self.domElement.hide();
- }
- Constructor.prototype.getDomElement = function () {
- return this.domElement;
- }
- Constructor.prototype.errorFileText = function (str) {
- var self = this;
- self.label
- .text(str)
- .css('color', 'red');
- }
- Constructor.prototype.fileText = function (str) {
- var self = this;
- self.label
- .text(str)
- .css('color', '');
- }
- Constructor.prototype.validateInput = function () {
- var self = this,
- validator = new RegExp(/(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/gim),
- isFilledTextarea = self.textarea.val().trim() != "";
- if (self.curUserEmail == "") {
- isFilledTextarea = validator.test(self.emailTextArea.val()) && isFilledTextarea;
- }
- return isFilledTextarea;
- }
- Constructor.prototype.sendAjax = function (text, fileString, file_name) {
- var self = this;
- $.ajax({
- url: "/custom_web_template.html?object_code=beluga_send_admin_server",
- type: "POST",
- data: {
- text: text,
- file: fileString,
- file_name: file_name,
- cur_user_email: self.curUserEmail || self.emailTextArea.val()
- },
- dataType: "json",
- success: function (data, textStatus, jqXHR) {
- self.hide();
- },
- error: function () {
- alert('Возникла ошибка при отправке');
- }
- });
- }
- return Constructor;
- })();
- var options = {"menuItems":[{"name":"Каталог курсов","link_href":"view_doc.html?mode=edu_catalog&doc_id=6628161676399233617"},{"name":"Документы","link_href":"view_doc.html?mode=lib&doc_id=6628162092753246374"},{"name":"Обучение","link_href":"view_doc.html?mode=doc&doc_id=5800376573543914533"},{"name":"МИРР","link_href":"view_doc.html?mode=self_assessment&doc_id=6631857937049990730"},{"name":"Библиотека","link_href":"view_doc.html?mode=doc&doc_id=6522717384966615904"},{"name":"Заявки","link_href":"view_doc.html?mode=doc&doc_id=6148914691236517176"},{"name":"Вакансии компании","link_href":"view_doc.html?mode=company_vacancys&doc_id=6711191531803911194"}],"cur_user_email":"LebedevDO@belugagroup.ru"};
- //создание модального окна Написать администратору
- var modalAdmin = new Modal({
- renderToId: 'footer_modal_admin',
- curUserEmail: options.cur_user_email
- });
- //открытие модалки Написать администратору
- $('#footer_send_admin').on('click', function (event) {
- modalAdmin.show();
- });
- //меню
- var mainMenuContainer = $('#footer_menu_main');
- options.menuItems.forEach(function (item) {
- var a = $('<a href="' + item.link_href + '"></a>');
- a.text(item.name);
- mainMenuContainer.append(a);
- });
- $('#footer_copy').text('© ' + new Date().getFullYear() + ' BELUGA GROUP')
- });
- </script>
- <!--footer -->
- </body>
- </html>
Add Comment
Please, Sign In to add comment