

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"));

var _swiper = _interopRequireDefault(__webpack_require__(/*! swiper/dist/js/swiper.js */ "./node_modules/swiper/dist/js/swiper.js"));

var _popupWindowModule = _interopRequireDefault(__webpack_require__(/*! popup-window-module */ "./node_modules/popup-window-module/index.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _next(value) { step("next", value); } function _throw(err) { step("throw", err); } _next(); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _default =
/*#__PURE__*/
function () {
  function _default(card, target) {
    _classCallCheck(this, _default);

    this.logic(card, target);
  }

  _createClass(_default, [{
    key: "generateModalHTML",
    value: function generateModalHTML() {
      var ModalEl = document.createElement('div');
      ModalEl.className = 'forPhoto';
      ModalEl.id = 'forPhoto';
      ModalEl.innerHTML = "\n\t\t\t<div class=\"forPhoto__content\">\n\n\t\t\t</div>\n\t\t";
      this.content = ModalEl.querySelector('.forPhoto__content');
      document.body.appendChild(ModalEl);
      return ModalEl;
    }
  }, {
    key: "logic",
    value: function () {
      var _logic = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee(card, target) {
        var _this = this;

        var el, data, galleryTop, galleryThumbs;
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                el = target.closest('.newsCard__image') || target.closest('.newsCard__head');

                if (el) {
                  _context.next = 3;
                  break;
                }

                return _context.abrupt("return");

              case 3:
                this.el = this.generateModalHTML();
                _context.next = 6;
                return fetch(el.getAttribute('href'));

              case 6:
                data = _context.sent;
                _context.next = 9;
                return data.json();

              case 9:
                data = _context.sent;
                this.el.innerHTML = "\n\t\t<div class=\"swiper-container gallery-top\">\n\t\t\t<div class=\"swiper-wrapper\">\n\t\t\t\t".concat(data.map(function (item) {
                  return "\n\t\t\t\t\t\t<div class=\"swiper-slide\">\n\t\t\t\t\t\t\t<div class=\"forPhoto__slide\">\n\t\t\t\t\t\t\t\t<img src=\"".concat(item.image.thumb, "\" alt=\"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u043F\u043E\u0440\u0442\u043C\u043E\u043D\u0435\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t");
                }).join(''), "\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"swiper-container gallery-bottom\">\n\t\t\t<div class=\"forPhoto__close\"></div>\n\t\t\t<div class=\"swiper-wrapper\">\n\t\t\t\t").concat(data.map(function (item) {
                  return "\n\t\t\t\t\t\t<div class=\"swiper-slide\">\n\t\t\t\t\t\t\t<div class=\"forPhoto__slide\">\n\t\t\t\t\t\t\t\t<img src=\"".concat(item.image.normal, "\" alt=\"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u043F\u043E\u0440\u0442\u043C\u043E\u043D\u0435\" />\n\t\t\t\t\t\t\t\t<div class=\"forPhoto__content\">\n\t\t\t\t\t\t\t\t\t<div class=\"sectionName\">").concat(item.title, "</div>\n\t\t\t\t\t\t\t\t\t<div class=\"\">").concat(item.album, "</div>\n\t\t\t\t\t\t\t\t\t<div class=\"\">").concat(item.description, "</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t");
                }).join(''), "\n\t\t\t</div>\n\t\t</div>\n\t\t");
                this.el.querySelector('.forPhoto__close').addEventListener('click', function (event) {
                  _this.destroy();
                });
                ;
                galleryTop = new _swiper.default('.gallery-top', {
                  spaceBetween: 10,
                  centeredSlides: true,
                  slidesPerView: 'auto',
                  touchRatio: .2,
                  slideToClickedSlide: true
                });
                galleryThumbs = new _swiper.default('.gallery-bottom', {
                  spaceBetween: 10,
                  navigation: {
                    nextEl: '.swiper-button-next',
                    prevEl: '.swiper-button-prev'
                  },
                  pagination: {
                    el: '.swiper-pagination'
                  }
                });
                galleryTop.controller.control = galleryThumbs;
                galleryThumbs.controller.control = galleryTop;

              case 17:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      return function logic(_x, _x2) {
        return _logic.apply(this, arguments);
      };
    }()
  }, {
    key: "destroy",
    value: function destroy() {
      this.el.remove();
      this.el = null;
    }
  }]);

  return _default;
}(); // {
// 	title: 'Название',
// 	description: 'Описание',
// 	album: 'Название альбома',
// 	image: {
// 		width: '4000',
// 		height: '3000',
// 		thumb: '/adfafa.jpg',
// 		normal: '/zdfagag',
// 		original: '/fdfadfa',
// 		extension: 'jpg',
// 		originalName: 'Можно еще передать оригинальное название файла, незнаю зачем'
// 	}
// }


exports.default = _default;:root {

	/* @media (--to-desktop) {}
	@media (--to-tablet) {}
	@media (--to-mobile) {} */

}
@-webkit-keyframes fade {
  from {
    opacity: 1;
  }
  50% {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
@keyframes fade {
  from {
    opacity: 1;
  }
  50% {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
/*! Generated by Font Squirrel (https://www.fontsquirrel.com) on March 23, 2018 */
@font-face {
    font-family: Gilroy;
    src: url(../fonts/gilroy-medium-webfont.woff2) format('woff2'),
         url(../fonts/gilroy-medium-webfont.woff) format('woff');
    font-weight: 500;
    font-style: normal;
}
@font-face {
    font-family: Gilroy;
    src: url(../fonts/gilroy-regular-webfont.woff2) format('woff2'),
         url(../fonts/gilroy-regular-webfont.woff) format('woff');
    font-weight: 400;
    font-style: normal;
}
@font-face {
    font-family: Gilroy;
    src: url(../fonts/gilroy-semibold-webfont.woff2) format('woff2'),
         url(../fonts/gilroy-semibold-webfont.woff) format('woff');
    font-weight: 900;
    font-style: normal;
}
*,
*::before,
*::after {
	-webkit-box-sizing: border-box;
	        box-sizing: border-box;
}
html {
	font-size: 16px;
}
html,
body {
	/*width: 100%; - фанси дергается*/
	height: 100%;
}
body {
	margin: 0;
	position: relative;
	resize: none;
	outline: none;
	-webkit-tap-highlight-color: rgba(255, 255, 255, 0);
	-webkit-focus-ring-color: rgba(255, 255, 255, 0);
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}
ul {
	margin: 0;
	padding: 0
}
ul li {
	list-style: none;

}
address {
	font-style: normal;
}
img,
video {
	max-width: 100%;
}
img {
	border: 0;
	vertical-align: top;
}
.index-1 {
  z-index: 90;
}
.index-2 {
  z-index: 89;
}
.index-3 {
  z-index: 87;
}
.index-4 {
  z-index: 86;
}
.index-5 {
  z-index: 85;
}
.visuallyhidden {
  position: absolute!important;
  width: 1px!important;
  height: 1px!important;
  margin: -1px!important;
  padding: 0!important;
  overflow: hidden!important;
  border: 0!important;
  clip: rect(0 0 0 0)!important;
}
body {
	min-width: 1260px;
	color: #221F1F;
	font-family: Gilroy;
	font-weight: 400;
	line-height: normal;
}
button {
	font-family: inherit;
}
.modal .modal__content iframe {
	min-height: calc(80vh - 70px);
}
a {
	color: inherit;
	text-decoration: none;
}
.link-style {
	background: -webkit-gradient(linear, left bottom, left top, from(currentColor), to(currentColor)) bottom left no-repeat;
	background: linear-gradient(0deg, currentColor, currentColor) bottom left no-repeat;
	background-size: 0px 1px;
	-webkit-transition: background-size 0.3s ease;
	transition: background-size 0.3s ease
}
.link-style:hover,
	.link-style:focus,
	.link-style:active,
	.link-style.\--active {
	background-size: 100% 1px;

}
.link-style.no-default-hover {
	background: none;

}
.siteHeader__nav a,
.siteHeader__blog,
.siteHeader__lang {
	background-size: 0px 3px;
	padding-bottom: 7px
}
.siteHeader__nav a:hover,
	.siteHeader__nav a.\--active,
	.siteHeader__blog:hover,
	.siteHeader__blog.\--active,
	.siteHeader__lang:hover,
	.siteHeader__lang.\--active {
	background-size: 100% 3px;

}
.container {
	width: 1260px;
	margin: 0 auto;
	padding-left: 15px;
	padding-right: 15px;
	&\--big {
		width: 1440px;
	}
}
.container--nonIndents {
	padding-left: 0;
	padding-right: 0;
}
.container--withSpacing {
	margin-top: 80px;
	margin-bottom: 80px;
}
.sectionName {
	font-size: 2em;
	margin: 10px 0;
	font-weight: 900;
	&\--big {
		font-size: 2.5em;
	}
}
.blockName {
	font-size: 1.5em;
	margin: 10px 0;
	font-weight: 900;
}
.itemName {
	font-size: 1.25em;
	margin: 10px 0;
	font-weight: 900;
}
.none {
	display: none;
}
.remove-scroll {
	overflow: hidden;
}
.search__container{display:none;}
/*
.wow {
	visibility: hidden;
}
*/
/* ------------------------------------------------------------------------- */
.playBtn {
	display: block;
	width: 58px;
	height: 58px;
	background-image: url('/images/play.svg');
	background-size: contain;
	background-position: center;
	background-repeat: no-repeat;
	border-radius: 50%;
	cursor: pointer;
	-webkit-transition: -webkit-transform .3s ease;
	transition: -webkit-transform .3s ease;
	transition: transform .3s ease;
	transition: transform .3s ease, -webkit-transform .3s ease;
	position: relative;
}
/* ------------------------------------------------------------------------- */
.liveSignal {
	color: #f72e2e;
	width: 22px;
	height: 22px;
	padding: 5px;
	border-radius: 50%;
	border: 1px solid currentColor;
	position: relative
}
.liveSignal:after {
	content: '';
	display: block;
	width: 10px;
	height: 10px;
	border-radius: 50%;
	overflow: hidden;
	position: absolute;
	left: 50%;
	top: 50%;
	-webkit-transform: translate(-50%, -50%);
	        transform: translate(-50%, -50%);
	background-color: currentColor;
	-webkit-animation-name: signal;
	        animation-name: signal;
	-webkit-animation-duration: 1s;
	        animation-duration: 1s;
	-webkit-animation-timing-function: cubic-bezier(0.785, 0.135, 0.15, 0.86);
	        animation-timing-function: cubic-bezier(0.785, 0.135, 0.15, 0.86);
	-webkit-animation-iteration-count: infinite;
	        animation-iteration-count: infinite;

}
@-webkit-keyframes signal {
	from {
		opacity: 1;
	}
	70% {
		opacity: 0;
	}
	to {
		opacity: 1;
	}
}
@keyframes signal {
	from {
		opacity: 1;
	}
	70% {
		opacity: 0;
	}
	to {
		opacity: 1;
	}
}
/* ------------------------------------------------------------------------- */
.showOnDesktop {
	display: block;
}
.hideOnDesktop,
.showOnTablet,
.showOnMobile {
	display: none;
}
.mobile body {
	width: 100%;
	min-width: auto;

}
.mobile .link-style {
	background-size: 100% 1px;

}
@media (min-width: 992px) {
	.mobile .showOnTablet {
		display: block;

	}
	.mobile .hideOnTable,
		.mobile .showOnDesktop,
		.mobile .showOnMobile {
		display: none;

	}

}
@media (max-width: 991px) {
	.mobile .showOnTablet {
		display: block;

	}
	.mobile .hideOnTable,
		.mobile .showOnDesktop,
		.mobile .showOnMobile {
		display: none;

	}
	.mobile .container {
		width: 100%;

	}
	.mobile .container--withSpacing {
		margin-top: 40px;
		margin-bottom: 40px;

	}
	.mobile .sectionName {
		font-size: 1.5em;

	}
	.mobile .remove-scroll {
		width: 100%;
		height: 100%;
		overflow: hidden;
		position: fixed;

	}
	.mobile .siteHeader__nav a,
		.mobile .siteHeader__blog,
		.mobile .siteHeader__lang {
		padding-bottom: 0;

	}

}
@media (max-width: 478px) {
	.mobile .showOnMobile {
		display: block;

	}
	.mobile .hideOnMobile,
		.mobile .showOnDesktop,
		.mobile .showOnTablet {
		display: none;

	}
	.mobile .blockName,
		.mobile .sectionName {
		margin-bottom: 0;

	}
	.mobile .container--withSpacing {
		margin-top: 20px;
		margin-bottom: 20px;

	}

}
.formatedText .unroll {
	margin-top: 10px;
	margin-bottom: 10px;

}
.formatedText .unroll__link {
	font-size: 18px;

}
.formatedText .unroll__data {
	height: 0;
	margin: 15px 0;
	-webkit-box-sizing: border-box;
	        box-sizing: border-box;
	overflow: hidden;
	font-size: 14px;
	-webkit-transition: height .3s ease;
	transition: height .3s ease;

}
.formatedText a:not(.additionMaterial__item):not(.newsCard__head) {
	color: #009cff;
	text-decoration: underline;
	-webkit-transition: color 0.2s ease;
	transition: color 0.2s ease;

}
.formatedText a:not(.additionMaterial__item):not(.newsCard__head):visited {
	color: #7e00ff;

}
.formatedText a:not(.additionMaterial__item):not(.newsCard__head):hover {
	color: #ffae00;

}
.formatedText a:not(.additionMaterial__item):not(.newsCard__head)[target="_blank"]:not(img) {

	/* position: relative; */

}
.formatedText a:not(.additionMaterial__item):not(.newsCard__head)[target="_blank"]:not(img):after {
	content: '';
	display: inline-block;
	width: 16px;
	height: 16px;
	margin-left: 5px;
	overflow: hidden;
	position: relative;
	top: -9px;
	background-repeat: no-repeat;
	background-size: 12px 12px;
	background-position: 0 4px;
	-webkit-transition: background-image 0.2s ease;
	transition: background-image 0.2s ease;

}
.formatedText a:not(.additionMaterial__item):not(.newsCard__head)[target="_blank"]:not(img):after {
	background-image: url('/images/icon-targe-blank.svg');

}
.formatedText a:not(.additionMaterial__item):not(.newsCard__head)[target="_blank"]:not(img):hover:after {
	background-image: url('/images/icon-targe-blank-gold.svg');

}
.formatedText a:not(.additionMaterial__item):not(.newsCard__head).dynamic,
		.formatedText a:not(.additionMaterial__item):not(.newsCard__head).unroll__link {
	text-decoration: none;
	border-bottom: 1px dashed currentColor;

}
.formatedText a:not(.additionMaterial__item):not(.newsCard__head).unroll__link {
	margin-bottom: 2px;

}
.formatedText a:not(.additionMaterial__item):not(.newsCard__head).unroll__link:visited {
	color: #009cff;

}
.formatedText h1, .formatedText .h1, .formatedText h2, .formatedText .h2, .formatedText h3, .formatedText .h3, .formatedText h4, .formatedText .h4, .formatedText h5, .formatedText .h5, .formatedText h6, .formatedText .h6 {
	font-weight: 900;

}
.formatedText h1, .formatedText .h1 {
	font-size: 30px;
	text-transform: uppercase;

}
.formatedText h2, .formatedText .h2 {
	font-size: 30px;

}
.formatedText h3, .formatedText .h3 {
	font-size: 24px;

}
.formatedText h4, .formatedText .h4 {
	font-size: 20px;

}
.formatedText {

	/* & h5, & .h5 {
		font-size: 18px;
	} */

}
.formatedText h5 {
	margin: 50px 0;
	padding: 10px 40px;
	font-size: 24px;
	line-height: 1.5;
	font-weight: 400;
	position: relative;

}
.formatedText h5:before {
	content: '';
	display: block;
	width: 6px;
	height: 100%;
	position: absolute;
	left: 0;
	top: 0;

	/* background: linear-gradient(45deg, #48b873 0%, #87cd64 100%); */
	background: linear-gradient(45deg, #0da481 0%, #3bcf56 100%);

}
.formatedText h5.lines {
	margin: 50px 0;
	padding: 36px;
	position: relative;
	font-size: 18px;
	font-weight: 900;
	line-height: 1.5;
	text-align: center;

}
.formatedText h5.lines:before,
			.formatedText h5.lines:after {
	content: '';
	display: block;
	width: 70px;
	height: 1px;
	overflow: hidden;
	background: #878787;
	position: absolute;
	top: 0;
	left: 50%;
	-webkit-transform: translateX(-50%);
	        transform: translateX(-50%);

}
.formatedText h5.lines:after {
	width: 22px;
	top: auto;
	bottom: 0;

}
.formatedText h6, .formatedText .h6 {
	font-size: 14px;
	font-weight: 400;
	line-height: 1.45;

}
.formatedText h6.line, .formatedText .h6.line {
	margin-bottom: 2em;
	padding: 1em 3px 1.2em;
	position: relative;

}
.formatedText h6.line:after, .formatedText .h6.line:after {
	content: '';
	display: block;
	width: 100%;
	max-width: 400px;
	height: 1px;
	overflow: hidden;
	background: #c5c5c5;
	position: absolute;
	bottom: 0;
	left: 0;

}
.formatedText p {
	margin: 1.75em 0;
	font-size: 18px;
	line-height: 1.7;

}
.formatedText .dynamic,
	.formatedText .unroll__link {
	font-size: 18px;

}
.formatedText ul {
	list-style: none;
	font-size: 18px;
	line-height: 1.5;

}
.formatedText ul li {
	padding: 8px 0 8px 26px;
	position: relative;

}
.formatedText ul li:before {
	content: '';
	width: 15px;
	height: 3px;
	overflow: hidden;
	background: #009cff;
	position: absolute;
	left: 0;
	top: 1.1em;

}
.formatedText ul li ul {
	margin-top: 0.5em;
	margin-left: 3px;
	font-size: 16px;
	position: relative;

}
.formatedText ul li ul li:before {
	width: 8px;
	left: 10px;

}
.formatedText ul li ul li ul {
	max-width: 350px;
	margin-top: 1em;
	margin-left: 9px;

}
.formatedText ul li ul li ul li {
	padding-top: 4px;
	padding-bottom: 4px;

}
.formatedText ul li ul li ul li:before {
	width: 4px;
	height: 4px;
	background: #878787;
	top: 0.9em;
	left: 12px;

}
.formatedText ul.list--green li:before {
	background: #45b774;

}
.formatedText ol {
	padding: 0;
	list-style: none;
	font-size: 18px;
	line-height: 1.5;
	counter-reset: li;

}
.formatedText ol li {
	padding: 8px 0;

}
.formatedText ol li:before {
	counter-increment: li;
	content: counters(li, ".") " ";
	padding-right: 10px;

}
.formatedText ol li ol {
	padding-left: 17px;
	list-style: none;
	margin-top: 0.5em;
	margin-left: 3px;
	font-size: 16px;
	counter-reset: li;

}
.formatedText ol li ol li ol {
	padding-left: 36px;
	list-style: none;
	margin-top: 1em;
	margin-left: 9px;
	counter-reset: li;

}
.formatedText ol li ol li ol li {
	padding-top: 4px;
	padding-bottom: 4px;

}
.formatedText .tableWrap {
	width: 100%;
	margin-bottom: 1em;
	padding-bottom: 1em;
	overflow-x: auto;

}
.formatedText .tableWrap table:not(.blank),
		.formatedText .tableWrap table:not(.blank).table--content {
	margin: 0;

}
.formatedText table:not(.blank) {
	width: 100%;
	border: 0;
	border-collapse: collapse;
	margin: 2em 0;
	font-size: 16px;
	font-weight: 500;

}
.formatedText table:not(.blank) tr {}
.formatedText table:not(.blank) th {
	border: 1px solid #fff;
	border-bottom: 1px solid #5bbe6e;
	border-top: 1px solid #5bbe6e;
	padding: 20px 28px;
	background: #5bbe6e;
	color: #fff;
	text-align: left;

}
.formatedText table:not(.blank) th:first-child {
	border-left: 1px solid #5bbe6e;

}
.formatedText table:not(.blank) th:last-child {
	border-right: 1px solid #5bbe6e;

}
.formatedText table:not(.blank) td {
	padding: 20px 28px;
	border: 1px solid #d6eada;

}
.formatedText table:not(.blank).table--content {
	font-size: 18px;
	font-weight: 100;
	margin: 2em 0;

}
.formatedText table.blank {
	border: 0;
	border-collapse: collapse;
	margin: 0;

}
.formatedText blockquote {
	width: 470px;
	clear: both;
	float: right;
	padding: 50px 37px;
	font-size: 20px;
	line-height: 1.5;
	color: #fff;

	/* background: linear-gradient(45deg, #48b873 0%, #87cd64 100%); */
	background: linear-gradient(45deg, #0da481 0%, #3bcf56 100%);

}
.formatedText blockquote a:not(.additionMaterial__item) {
	color: #fff;
	text-decoration: none;
	border-bottom: 1px solid #fff;

}
.formatedText blockquote a:not(.additionMaterial__item):visited {
	color: #fff;

}
.formatedText blockquote a:not(.additionMaterial__item)[target="_blank"]:not(img):after {
	background-image: url('/images/icon-targe-blank-white.svg');

}
.formatedText blockquote a:not(.additionMaterial__item)[target="_blank"]:not(img):hover:after {
	background-image: url('/images/icon-targe-blank-white.svg');

}
.formatedText .image span {
	display: block;
	margin-bottom: 2em;
	padding: 1em 3px 1.2em;
	font-size: 14px;
	line-height: 1.45;
	position: relative;

}
.formatedText .image span:after {
	content: '';
	display: block;
	width: 100%;
	max-width: 400px;
	height: 1px;
	overflow: hidden;
	background: #c5c5c5;
	position: absolute;
	bottom: 0;
	left: 0;

}
.formatedText .image.left {
	float: left;
	clear: both;
	overflow: hidden;
	margin: 0 30px 10px 0;

}
.formatedText .image.left img {}
.formatedText .image.right {
	float: right;
	clear: both;
	overflow: hidden;
	margin: 0 0 10px 30px;

}
.formatedText .image.right img {}
.formatedText .image:after {
	content: "";
	display: table;
	clear: both;

}
.formatedText .image.wide {
	margin: 3em 0;

}
.formatedText .image.wide img {
	min-width: 100%;
	height: auto;

}
.formatedText .image.left + .imageTitle {
	margin-bottom: 0.5em;
	padding-top: 0;
	padding-bottom: 0;

}
.formatedText .image.left + .imageTitle:after {}
.formatedText .imageTitle {
	display: block;
	margin-bottom: 2em;
	padding: 1em 3px 1.2em;
	font-size: 14px;
	line-height: 1.45;

	/* position: relative; */

}
.formatedText .imageTitle:after {
	content: '';
	display: block;
	margin-top: 1.2em;
	max-width: 400px;
	height: 1px;
	overflow: hidden;
	background: #c5c5c5;

	/* position: absolute; */

	/* bottom: 0; */

	/* left: 0; */

}
.formatedText .contentReview {
	margin: 50px 0;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	clear: both;

}
.formatedText .contentReview__img {
	min-width: 127px;
	height: 127px;
	border-radius: 50%;
	overflow: hidden;

	/* background: linear-gradient(45deg, #48b873 0%, #87cd64 100%); */
	background: linear-gradient(45deg, #0da481 0%, #3bcf56 100%);

}
.formatedText .contentReview__img img {
	width: 127px;
	height: 127px;

}
.formatedText .contentReview__info {
	padding-left: 26px;

}
.formatedText .contentReview__name {
	margin-top: 22px;
	color: #222222;
	font-size: 18px;
	font-weight: 900;

}
.formatedText .contentReview__position {
	margin-top: 10px;
	color: #9c9c9c;
	font-size: 16px;
	font-weight: 500;

}
.formatedText .contentReview__description {
	margin-top: 30px;
	font-size: 18px;
	line-height: 1.75;
	position: relative;

}
.formatedText .contentReview__description:before {
	content: "";
	display: block;
	width: 42px;
	height: 34px;
	overflow: hidden;
	position: absolute;
	top: -8px;
	left: -9px;
	background: url('/images/quotes.png') no-repeat;

}
.formatedText .date {
	font-size: 18px;
	line-height: 1.5;

}
.formatedText .upper {
	text-transform: uppercase;

}
.formatedText .anchors {
	padding: 1.5em 0;

}
.formatedText .anchors a {
	line-height: 1.75em;

}
.formatedText .anchors a:not(:last-child) {
	margin-right: 1.5em;

}
.formatedText .iconBlock {
	padding: 40px;
	margin: 2em 0;
	background: #f2f2f2;
	color: #221F1F;

}
.formatedText .iconBlock .iconBlock__caption {
	font-size: 30px;
	font-weight: 900;
	line-height: 1.5;

}
.formatedText .iconBlock .iconBlock__group {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	    flex-wrap: wrap;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	margin-top: 1em;

}
.formatedText .iconBlock .iconBlock__item {
	width: 48%;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	margin-top: 30px;

}
.formatedText .iconBlock .iconBlock__icon {
	-ms-flex-negative: 0;
	    flex-shrink: 0;
	margin-right: 30px;

}
.formatedText .iconBlock .iconBlock__icon img {
	width: 100px;
	height: 100px;
	border-radius: 50%;
	overflow: hidden;

}
.formatedText .iconBlock .iconBlock__title {
	font-size: 22px;
	font-weight: 500;
	line-height: 1.25;

}
.formatedText .iconBlock .iconBlock__title + .iconBlock__description {
	margin-top: 1em;

}
.formatedText .iconBlock .iconBlock__description {
	font-size: 16px;
	line-height: 1.5;

}
.formatedText .emphasisLinesEqual {
	margin: 50px 0;
	padding: 50px 70px;
	position: relative;
	font-size: 18px;
	line-height: 1.8;

}
.formatedText .emphasisLinesEqual:before,
		.formatedText .emphasisLinesEqual:after {
	content: '';
	display: block;
	width: 100%;
	height: 1px;
	overflow: hidden;
	background: #c4c4c4;
	position: absolute;
	top: 0;
	left: 0;

}
.formatedText .emphasisLinesEqual:after {
	top: auto;
	bottom: 0;

}
.formatedText .quotation {
	margin: 1.75em 0;
	font-size: 18px;
	font-weight: 900;
	line-height: 1.75;
	position: relative;

}
.formatedText .quotation:before {
	content: "";
	display: block;
	width: 42px;
	height: 34px;
	overflow: hidden;
	position: absolute;
	top: -8px;
	left: -9px;
	background: url('/images/quotes.png') no-repeat;

}
.formatedText .videoBlock,
	.formatedText .videoPlug {
	max-width: 668px;
	margin: 55px auto;

}
.formatedText .iframe-box {
	margin-top: 1em;
	margin-bottom: 1em;
	position: relative;
	padding-bottom: 56.25%;

	/* 16:9 */
	height: 0;

}
.formatedText .iframe-box iframe {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;

}
.card--additionContent {
  width: calc(25% - 30px);
  margin: 15px;
	background: repeating-linear-gradient(45deg, transparent, transparent 10px, rgba(196, 196, 196, .2) 10px, rgba(196, 196, 196, .2) 20px);
	text-align: center;
}
[data-style="pageTitle"] .formatedText .anchors a {

	/* color: rgba(255,255,255, 0.7); */
	color: #fff;

	/* transition: color 0.3s ease; */

	/* &:hover {
				color: rgba(255,255,255, 1);
			} */

}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.mobile .formatedText h1, .mobile .formatedText .h1 {
		font-size: 24px;

	}
	.mobile .formatedText h2, .mobile .formatedText .h2 {
		font-size: 24px;

	}
	.mobile .formatedText h3, .mobile .formatedText .h3 {
		font-size: 20px;

	}
	.mobile .formatedText h4, .mobile .formatedText .h4 {
		font-size: 18px;

	}
	.mobile .formatedText h5, .mobile .formatedText .h5 {
		font-size: 20px;

	}
	.mobile .formatedText h5.lines {
		padding: 26px;

	}
	.mobile .formatedText blockquote {
		width: 100%;
		float: none;
		margin: 0;

	}
	.mobile .formatedText table:not(.blank) td {
		padding: 10px 20px;

	}
	.mobile .formatedText .iconBlock {
		padding: 40px 30px;

	}
	.mobile .formatedText .iconBlock .iconBlock__caption {
		font-size: 24px;
		margin-bottom: 40px;

	}
	.mobile .formatedText .iconBlock .iconBlock__group {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .formatedText .iconBlock .iconBlock__item {
		width: 100%;

		/* display: block; */
		margin-top: 60px;

	}
	.mobile .formatedText .iconBlock .iconBlock__item:first-child {
		margin-top: 0;

	}
	.mobile .formatedText .iconBlock .iconBlock__icon {
		margin: 0 25px 25px 0;

	}
	.mobile .formatedText .iconBlock .iconBlock__title {
		font-size: 24px;
		padding: 0;

	}
	.mobile .formatedText .iconBlock .iconBlock__description {}
	.mobile .formatedText .iconBlock .emphasisLinesEqual {
		margin: 40px 0;
		padding: 30px 20px;

	}
	.mobile .formatedText .image.left + .imageTitle {
		float: none;
		clear: both;

	}

}
@media (max-width: 478px) {
	.mobile .formatedText h5 {
		margin-top: 30px;
		margin-bottom: 30px;
		padding-left: 30px;
		padding-right: 20px;
		font-size: 16px;
		font-weight: 900;

	}
	.mobile .formatedText h1, .mobile .formatedText .h1 {
		font-size: 22px;

	}
	.mobile .formatedText h2, .mobile .formatedText .h2 {
		font-size: 22px;
		font-weight: 500;

	}
	.mobile .formatedText p {
		font-size: 16px;

	}
	.mobile .formatedText .dynamic,
			.mobile .formatedText .unroll__link {
		font-size: 16px;

	}
	.mobile .formatedText ul {
		font-size: 16px;

	}
	.mobile .formatedText ul li ul {
		margin-left: 0;

	}
	.mobile .formatedText ul li ul li {
		padding-left: 15px;

	}
	.mobile .formatedText ul li ul li:before {
		left: 0;

	}
	.mobile .formatedText ol {
		font-size: 16px;

	}
	.mobile .formatedText ol li ol li ol {
		padding-left: 18px;

	}
	.mobile .formatedText blockquote {
		margin-top: 30px;
		margin-bottom: 30px;
		padding: 15px 20px;
		font-size: 16px;
		line-height: 2;

	}
	.mobile .formatedText .anchors {
		padding: 0;
		margin: 1.5em 0;

	}
	.mobile .formatedText .iconBlock {
		padding: 20px 15px;

	}
	.mobile .formatedText .iconBlock .iconBlock__caption {
		font-size: 18px;
		font-weight: 900;
		margin-bottom: 30px;
		text-align: center;

	}
	.mobile .formatedText .iconBlock .iconBlock__group {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .formatedText .iconBlock .iconBlock__item {
		width: 100%;
		display: block;
		margin-top: 30px;

	}
	.mobile .formatedText .iconBlock .iconBlock__item:first-child {
		margin-top: 0;

	}
	.mobile .formatedText .iconBlock .iconBlock__icon {
		margin: 0 0 20px;
		float: none;
		clear: both;
		text-align: center;

	}
	.mobile .formatedText .iconBlock .iconBlock__icon img {
		width: 100px;
		height: 100px;

	}
	.mobile .formatedText .iconBlock .iconBlock__title {
		font-size: 18px;
		line-height: 1.5;
		padding: 0;
		text-align: center;

		/* min-height: 100px; */

	}
	.mobile .formatedText .iconBlock .iconBlock__description {

		/* margin-left: -100px; */

	}
	.mobile .formatedText .image.left {
		margin-right: 0;

	}
	.mobile .formatedText .image.right {
		margin-left: 0;

	}
	.mobile .formatedText .image.right,
				.mobile .formatedText .image.left {
		float: none;
		max-width: 100%;

	}
	.mobile .formatedText .image span {
		margin-bottom: 0;

	}
	.mobile .formatedText .contentReview {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .formatedText .contentReview__img {
		width: 127px;
		height: 127px;
		margin: 0 auto;

	}
	.mobile .formatedText .contentReview__info {
		padding-left: 0;
		text-align: center;

	}
	.mobile .formatedText .contentReview__description {
		font-size: 16px;

	}
	.mobile .formatedText .contentReview__description:before {
		top: -11px;
		left: 50%;
		margin-left: -21px;

	}
	.mobile .formatedText .emphasisLinesEqual {
		margin: 30px 0;
		padding: 20px 10px;
		font-size: 16px;

	}
	.mobile .formatedText .date {
		font-size: 14px;

	}

}
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
.siteHeader__navToggle {
	width: 55px;
	height: 55px;
	overflow: hidden;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: end;
	    -ms-flex-pack: end;
	        justify-content: flex-end ;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
}
.siteHeader__navToggle-checkbox {
	display: none;
}
.siteHeader__navToggle-icon {
	display: block;
	width: 26px;
	height: 19px;
	position: relative;
	/*z-index: 100;*/
	cursor: pointer
}
.siteHeader__navToggle-icon:before, .siteHeader__navToggle-icon:after {
	content: '';

}
.siteHeader__navToggle-icon span, .siteHeader__navToggle-icon:before, .siteHeader__navToggle-icon:after {
	display: block;
	width: 100%;
	height: 3px;
	position: absolute;
	left: 0;
	background: #009cff;
	-webkit-transition: background .2s ease-in-out;
	transition: background .2s ease-in-out;

}
.siteHeader__navToggle-icon:before {
	top: 0;

	/* transition: transform .2s ease-in-out; */

}
.siteHeader__navToggle-icon:after {
	top: 16px;

	/* transition: transform .2s ease-in-out; */

}
.siteHeader__navToggle-icon span {
	top: 8px;

	/* transition: transform 0.3s; */

}
.siteHeader__navToggle-icon:hover:before,
	.siteHeader__navToggle-icon:hover:after,
	.siteHeader__navToggle-icon:hover span {
	background: #ffae00;

}
.siteHeader__navToggle-checkbox:checked ~ .siteNav__menuLarge {
	-webkit-transform: translateX(0);
	        transform: translateX(0);
}
.siteHeader__navToggle-checkbox:checked ~ .siteNav__menuLarge .searchForm,
.siteHeader__navToggle-checkbox:checked ~ .siteNav__menuLarge .navigationGroup {
	opacity: 1;
	-webkit-transform: translateY(0);
	        transform: translateY(0);
}
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
.siteNav__menuLarge {
	height: 100vh;
	width: 100%;
	/*width: 100vw;*/
	padding-top: 80px;
	position: absolute;
	top: 0;
	bottom: 0;
	left: 0;
	right: 0;
	z-index: 90;
	visibility: hidden;
	background: #5fbcf6;
	background: \-webkit-radial-gradient(top right,#5fbcf6,#4162d2);
	background: radial-gradient(top right, #5fbcf6, #4162d2);
	background: linear-gradient(45deg, #2c56da 0%,#2c56da 27%,#00a8ff 76%,#00a8ff 100%);

	-webkit-transform: translateX(-100%);

	        transform: translateX(-100%);
	-webkit-transition: -webkit-transform 0.3s ease-in-out;
	transition: -webkit-transform 0.3s ease-in-out;
	transition: transform 0.3s ease-in-out;
	transition: transform 0.3s ease-in-out, -webkit-transform 0.3s ease-in-out
}
.siteNav__menuLarge > div {
	position: relative;

}
.siteNav__menuLarge-close {
	width: 26px;
	height: 26px;
	position: absolute;
	top: -36px;
	right: 15px;
	overflow: hidden;
	cursor: pointer
}
.siteNav__menuLarge-close:before,
	.siteNav__menuLarge-close:after {
	content:'';
	width: 100%;
	height: 3px;
	position: absolute;
	top:0;
	left:0;
	right: 0;
	bottom:0;
	margin: auto;
	background-color: #fff;
	-webkit-transition: background-color 0.3s ease-in-out;
	transition: background-color 0.3s ease-in-out;

}
.siteNav__menuLarge-close:before {
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);

}
.siteNav__menuLarge-close:after {
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);

}
.siteNav__menuLarge-close:hover:before,
	.siteNav__menuLarge-close:hover:after {
	background-color: #99d8ff;

}
/* ------------------------------------------------------------------------- */
.navigationGroup {
	opacity: 0;
	-webkit-transform: translateY(50px);
	        transform: translateY(50px);
	-webkit-transition: opacity 0.2s ease-in-out 0.3s,
				-webkit-transform 0.2s ease-in-out 0.3s;
	transition: opacity 0.2s ease-in-out 0.3s,
				-webkit-transform 0.2s ease-in-out 0.3s;
	transition: transform 0.2s ease-in-out 0.3s,
				opacity 0.2s ease-in-out 0.3s;
	transition: transform 0.2s ease-in-out 0.3s,
				opacity 0.2s ease-in-out 0.3s,
				-webkit-transform 0.2s ease-in-out 0.3s;
	height: calc(100vh - 80px);
	overflow-y: auto
}
.navigationGroup > ul {
	display: block;

	/* width: 100%; */

	/* max-height: 800px; */

	/* display: flex;
		flex-direction: column;
		flex-wrap: wrap;
		justify-content: flex-start;
		align-content: space-between; */

}
.navigationGroup > ul > li {
	display: block;
	margin: 0 18px;
	width: 270px;

}
.navigationGroup > ul > li > span {
	display: block;
	border-bottom: 1px solid rgba(255, 255, 255, .3);
	padding: 15px 0;

}
.navigationGroup > ul > li > span > a {
	font-size: 20px;
	font-weight: 500;

}
.navigationGroup > ul > li > span > a.emphasized {
	color: #ffea00;

}
.navigationGroup > ul > li > ul {
	margin: 6px 8px 20px;

}
.navigationGroup > ul > li > ul > li {
	padding: 5px 0;

}
.navigationGroup > ul > li > ul > li > a {
	font-size: 14px;
	line-height: 1;
	font-weight: 500;

}
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
.container__siteHeader-animationHeader {
	position: fixed;
	top: 200px;
	left: 100px;
	color: #000;
}
.container__siteHeader {
	background: transparent;
	-webkit-box-shadow: none;
	        box-shadow: none;
	-webkit-transition: background-color 0.3s ease-in-out,
				-webkit-transform 0.3s ease-in-out;
	transition: background-color 0.3s ease-in-out,
				-webkit-transform 0.3s ease-in-out;
	transition: background-color 0.3s ease-in-out,
				transform 0.3s ease-in-out;
	transition: background-color 0.3s ease-in-out,
				transform 0.3s ease-in-out,
				-webkit-transform 0.3s ease-in-out;
}
.siteHeader__nav {
	color: #fff;
	opacity: 1;
	-webkit-transform: translateY(0);
	        transform: translateY(0);
	-webkit-transition: opacity 0.3s ease-in-out,
				-webkit-transform 0.3s ease-in-out;
	transition: opacity 0.3s ease-in-out,
				-webkit-transform 0.3s ease-in-out;
	transition: transform 0.3s ease-in-out,
				opacity 0.3s ease-in-out;
	transition: transform 0.3s ease-in-out,
				opacity 0.3s ease-in-out,
				-webkit-transform 0.3s ease-in-out;
}
.siteHeader__brand {
	opacity: 0;
	-webkit-transform: translateY(-200%);
	        transform: translateY(-200%);
	-webkit-transition: opacity 0.3s ease-in-out,
				-webkit-transform 0.3s ease-in-out;
	transition: opacity 0.3s ease-in-out,
				-webkit-transform 0.3s ease-in-out;
	transition: transform 0.3s ease-in-out,
				opacity 0.3s ease-in-out;
	transition: transform 0.3s ease-in-out,
				opacity 0.3s ease-in-out,
				-webkit-transform 0.3s ease-in-out;
}
.siteHeader__navToggle {
	width: 0px;
	-webkit-transition: width 0.3s ease-in-out;
	transition: width 0.3s ease-in-out;
}
.search svg path {
	fill: #fff;
	-webkit-transition: fill 0.3s ease-in-out;
	transition: fill 0.3s ease-in-out;
}
.search:hover svg path {
	fill: rgba(255, 255, 255, .6);
}
.social-navigation svg {
	fill: rgba(255, 255, 255, 1);
	-webkit-transition: fill 0.3s ease-in-out;
	transition: fill 0.3s ease-in-out;
}
.container__siteHeader-animationToTop {
	-webkit-transform: translateY(-100%);
	        transform: translateY(-100%)
}
.container__siteHeader-animationToTop .siteHeader .link-style {
	text-shadow: none;

}
.container__siteHeader-animationToTop .siteHeader__brand {
	opacity: 1;
	-webkit-transform: translateY(0);
	        transform: translateY(0);

}
.container__siteHeader-animationToTop .siteHeader__nav {
	-webkit-transform: translateY(-200%);
	        transform: translateY(-200%);

}
.container__siteHeader-animationToTop .siteHeader__lang,
	.container__siteHeader-animationToTop .siteHeader__blog {
	color: #9b9b9b;

}
.container__siteHeader-animationToTop .siteHeader__lang:hover,
	.container__siteHeader-animationToTop .siteHeader__blog:hover {
	color: #ffae00;

}
.container__siteHeader-animationToTop .search svg path {
	fill: #9b9b9b;

}
.container__siteHeader-animationToTop .search:hover svg path {

	/* fill: var(--gray-ligh-2-hover); */
	fill: #ffae00;

}
.container__siteHeader-animationToTop .social-navigation a svg {
	fill: #00a8ff;

}
.container__siteHeader-animationToTop .social-navigation a:hover svg {

	/* fill: var(--social-blue-hover); */
	fill: #ffae00;

}
.container__siteHeader-animationToTop .siteHeader__navToggle {
	width: 55px;

}
/* ------------------------------------------------------------------------- */
.container__siteHeader {
	background: transparent;
	position: relative;
	z-index: 99;
	color:#fff;
}
.siteHeader__bg {
	background: #5fbcf6;
	background: \-webkit-radial-gradient(top right,#5fbcf6,#4162d2);
	background: radial-gradient(top right, #5fbcf6, #4162d2);
	background: linear-gradient(45deg, #2c56da 0%,#2c56da 27%,#00a8ff 76%,#00a8ff 100%);
	height: 0;
	width:100%;
	position: absolute;
	top:0;
}
.siteHeader {
	/*position: relative; */ /*закоментировал для того чтобы правильно спозиционирвать бургерное меню*/
	padding: 10px 15px;
	z-index: 102;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between
}
.siteHeader .link-style {
	text-shadow: 0 0 15px rgba(0, 0, 0, .35);

}
.siteHeader__nav {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-webkit-box-flex: 2;
	    -ms-flex-positive: 2;
	        flex-grow: 2;
	font-weight: 900;
	font-size: 1.25em
}
.siteHeader__nav.siteHeader__nav--noFullWidth {
	-webkit-box-pack: end;
	    -ms-flex-pack: end;
	        justify-content: flex-end;

}
.siteHeader__nav.siteHeader__nav--noFullWidth li {
	margin-right: 35px;

}
.siteHeader__nav:after {
	content: '';

}
.siteHeader__rightBar {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	max-width: 330px;
	/* max-width: 120px; */
	-webkit-box-pack: end;
	    -ms-flex-pack: end;
	        justify-content: flex-end;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
	font-weight: 900;
	font-size: 1.25em;
	z-index: 2
}
.siteHeader__rightBar > div {
	margin: 0 15px;

}
.siteHeader__rightBar > div:last-child {
	margin-right: 0;

}
.siteNav__menu {
	position: relative;
	top:0%;
	z-index: 1;
}
.siteNav__menu > * {
	display: none;
	position: absolute;
	top: 0;
	left: 0;
}
.dropMenu {
	padding: 10px 0 50px;
}
.dropMenu__item {
	padding: 15px;
	line-height: 1.4em;
	-webkit-columns: 2;
	        columns: 2;
	-webkit-column-gap: 50px;
	        column-gap: 50px;
	-webkit-column-rule: 1px solid rgba(255, 255, 255, .3);
	        column-rule: 1px solid rgba(255, 255, 255, .3)
}
.dropMenu__item:last-child {
	border-right: none;

}

.siteHeader__brand {
	position: absolute;
	align-self: center;
}

.siteHeader__brand a {
	display: block;
	margin-top: 2px;
	margin-bottom: -2px;
}

.siteHeader__brand img {
	width: 447px;
}

@media (max-width: 1270px) {
	.container {
		width: 100%;
	}
}

@media (max-width: 768px) {
	.siteHeader__brand img {
		width: 60vw;
	}
}

.siteHeader__blog {
	color: #fff
}
.siteHeader__blog:hover {
	color: currentColor;

}
.container__siteHeader--fixed {
	width: 100%;
	position: fixed;
	top: 0;
	z-index: 100;
	background-color: #fff;
  -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);
          box-shadow: 0 0 20px rgba(0, 0, 0, .2);
	-webkit-transform: translateY(0);
	        transform: translateY(0);
}
.siteHeader__ifFixedHeader,
.container__siteHeader--fixed {
	/*height: 115px;*/
	height: 77px;
}
.headerBlog__fixHelper{
  height: 115px;
}
.headerBlog {
  position: fixed;
  top: 0;
  width: 100%;
  height: 115px;
  color: #221F1F;
  background-color: #fff;
  -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);
          box-shadow: 0 0 20px rgba(0, 0, 0, .2);
  z-index: 100;
}
.container--headerBlog {
  width: 1260px;
  max-width: 1260px;
  height: 100%;
  font-size: 14px;
}
.headerBlog__container {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: justify;
      -ms-flex-pack: justify;
          justify-content: space-between;
  height: 100%;
}
.headerBlog__logoImg,
.headerBlog__logoTitle {
  display: inline-block;
  vertical-align: middle;
}
.headerBlog__logo {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  position: relative;
  width: 100%;
  padding-left: 15px;
  overflow: hidden;
  border-left: 1px solid #e5e5e5;
  z-index: 200;
}
.headerBlog__logoImg {
  position: relative;
  cursor: pointer;
  z-index: 101
}
.headerBlog__logoImg img {
	width: 202.5px;
	height: 49.5px;

}
.headerBlog__logoTitle {
  margin-left: 30px;
  padding-right: 10px;
  font-size: 1.25em;
  font-weight: 500;
  color: #221F1F;
}
.headerBlog__other {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
}
.headerBlog__socials,
.headerBlog__icon {
  border-left: 1px solid #e5e5e5;
}
/* ----- Скрытый блок ЛОГО ----- */
.headerBlog__logoHover {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  -webkit-transform: translateX(-102%);
          transform: translateX(-102%);
  background: -webkit-gradient(linear, left bottom, left top, from(#0da481), to(#3bcf56));
  background: linear-gradient(0deg, #0da481 0%, #3bcf56 100%);
  -webkit-transition: -webkit-transform .3s;
  transition: -webkit-transform .3s;
  transition: transform .3s;
  transition: transform .3s, -webkit-transform .3s;
  z-index: 105
}
.headerBlog__logoHover a {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;
	width: 50%;
	padding: 0 15px;
	font-size: 1.25em;
	font-weight: 500;
	color: #fff;

}
.headerBlog__logoHover a:first-of-type {
	width: 60%;
	border-right: 1px solid rgba(255, 255, 255, .2);

}
.headerBlog__logoHover a:nth-of-type(2) {
	width: 40%;

}
.headerBlog__logoHover a:hover span {
	background-size: 100% 1px;

}
.headerBlog__logoHover.\--active {
	-webkit-transform: translateX(0%);
	        transform: translateX(0%);

}
/* ----- Ссылки на страницы ----- */
.headerBlog__links {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
}
.headerBlog__link {
  margin: 5px;
  font-size: 1.125em;
  font-weight: 500;
  -webkit-transition: color .2s;
  transition: color .2s
}
.headerBlog__link:hover {
	color: #ffae00 !important;

}
.headerBlog__link.\--active {
  color: #ffae00
}
.headerBlog__link.\--active a {
	cursor: default;

}
.headerBlog__link:not(:last-of-type) {
  margin-right: 10px;
}
/* ----- Социальный блок ----- */
.headerBlog__socials {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -ms-flex-item-align: stretch;
      align-self: stretch;
  padding: 0 20px
}
.headerBlog__socials .social-navigation {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	margin: auto 0;

}
.headerBlog__socials .social-navigation a svg {
  fill: #00a8ff;
}
.headerBlog__socials .social-navigation a:hover svg {
  fill: #ffae00;
}
/* ----- Блок с иконками ----- */
.headerBlog__icons {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
}
.headerBlog__icon {
  width: 100px;
  height: 115px;
  cursor: pointer
}
.headerBlog__icon:last-of-type {
	border-right: 1px solid #e5e5e5;

}
.headerBlog__icon:hover .subscribe__svg {
	stroke: #ffae00;

}
.headerBlog__icon:hover .headerBlog__svg--rss {
	fill: #ffae00;
	stroke: #ffae00;

}
.headerBlog__icon:hover.headerBlog__icon--search svg path {
	fill: #ffae00;

}
.headerBlog__icon.\--opened {
	cursor: auto;

}
.headerBlog__icon--search {
  position: static
}
.headerBlog__icon--search .search {
	width: 100%;
	height: 100%;
	margin: 0;

}
.headerBlog__icon--search .search .searchForm--singelForm {
	background: -webkit-gradient(linear, left bottom, left top, from(#0da481), to(#3bcf56));
	background: linear-gradient(0deg, #0da481 0%, #3bcf56 100%);
	z-index: 202;

}
.headerBlog__icon--search .search .siteHeader__searchToggle-icon {
	position: relative;
	width: 100%;
	height: 100%;

}
.headerBlog__icon--search .search svg {
	position: absolute;
	top: 50%;
	left: 50%;
	-webkit-transform: translate(-50%,-50%);
	        transform: translate(-50%,-50%);
	width: 22px;
	height: 22px;

}
.headerBlog__icon--search .search svg path {
	fill: #9b9b9b;

}
.headerBlog__icon--search .search .searchForm__input {
	font-size: 24px;

}
.headerBlog__iconLink {
  position: relative;
  display: block;
  height: 100%;
}
.headerBlog__svg {
  position: absolute;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%,-50%);
          transform: translate(-50%,-50%);
}
.headerBlog__svg--rss {
  width: 25px;
  height: 25px;
  fill: #9b9b9b;
  stroke: #9b9b9b;
  stroke-width: 2px;
  -webkit-transition: fill .2s ease-in-out, stroke .2s ease-in-out;
  transition: fill .2s ease-in-out, stroke .2s ease-in-out;
}
/* ----- Стили для мобильной шапки ----- */
.headerBlog__menu {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  margin: 0 15px;
}
.headerBlog__menuTrigger {
  display: none;
}
.headerBlog__menuBurger {
  display: block;
  position: relative;
  width: 26px;
  height: 19px;
  -webkit-transition: opacity .3s;
  transition: opacity .3s;
  cursor: pointer;
  z-index: 201;
}
/* ----- Скрываем бургер при открытом лого ----- */
.headerBlog__logo.\--active +
.headerBlog__logoTitle +
.headerBlog__socials +
.headerBlog__icons +
.headerBlog__menu
.headerBlog__menuBurger {
  opacity: 0;
  visibility: hidden;
}
.headerBlog__menuBurger span,
.headerBlog__menuBurger:before,
.headerBlog__menuBurger:after {
  position: absolute;
  width: 100%;
  height: 3px;
  background-color: #009cff;
  will-change: transform;
  -webkit-transition: background-color .3s ease-in-out,
              top .3s ease-in-out,
              opacity .3s ease-in-out,
              -webkit-transform .3s ease-in-out;
  transition: background-color .3s ease-in-out,
              top .3s ease-in-out,
              opacity .3s ease-in-out,
              -webkit-transform .3s ease-in-out;
  transition: transform .3s ease-in-out,
              background-color .3s ease-in-out,
              top .3s ease-in-out,
              opacity .3s ease-in-out;
  transition: transform .3s ease-in-out,
              background-color .3s ease-in-out,
              top .3s ease-in-out,
              opacity .3s ease-in-out,
              -webkit-transform .3s ease-in-out;
}
.headerBlog__menuBurger:before,
.headerBlog__menuBurger:after {
  content: '';
  display: block;
}
.headerBlog__menuBurger:before {
  top: 0;
}
.headerBlog__menuBurger span {
  top: 8px;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.headerBlog__menuBurger:after {
  top: 16px;
}
.headerBlog__menuHidden {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-box-pack: end;
      -ms-flex-pack: end;
          justify-content: flex-end;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: -webkit-gradient(linear, left bottom, left top, from(#0da481), to(#3bcf56));
  background: linear-gradient(0deg, #0da481 0%, #3bcf56 100%);
  will-change: transform;
  -webkit-transform: translateX(100%);
          transform: translateX(100%);
  -webkit-transition: -webkit-transform .3s ease-in-out;
  transition: -webkit-transform .3s ease-in-out;
  transition: transform .3s ease-in-out;
  transition: transform .3s ease-in-out, -webkit-transform .3s ease-in-out;
  z-index: 200
}
.headerBlog__menuHidden .headerBlog__socialBurger {
	display: none;

}
.headerBlog__menuHidden-bg {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  width: 100%;
  height: 100vh;
  opacity: 0;
  visibility: hidden;
  background-color: #1e1e1e;
  -webkit-transition: opacity .3s ease-in-out;
  transition: opacity .3s ease-in-out;
  z-index: -1;
}
.headerBlog__menuHidden > * {
	opacity: 0;
	-webkit-transform: translateY(7px);
	        transform: translateY(7px);
	-webkit-transition: opacity .3s ease-in-out .25s, -webkit-transform .3s ease-in-out .25s;
	transition: opacity .3s ease-in-out .25s, -webkit-transform .3s ease-in-out .25s;
	transition: opacity .3s ease-in-out .25s, transform .3s ease-in-out .25s;
	transition: opacity .3s ease-in-out .25s, transform .3s ease-in-out .25s, -webkit-transform .3s ease-in-out .25s;

}
.headerBlog__menuHidden .headerBlog__links {
	display: -webkit-inline-box;
	display: -ms-inline-flexbox;
	display: inline-flex;

}
.headerBlog__menuHidden .headerBlog__menuHiddenWrap {
	padding: 10px 85px 10px 20px;

}
.headerBlog__menuHidden .headerBlog__link {
	font-size: 18px;
	color: #fff;

}
/* ----- Анимации бургера ----- */
.headerBlog__menuTrigger:checked +
.headerBlog__menuBurger +
.headerBlog__menuHidden {
  -webkit-transform: translateX(0);
          transform: translateX(0);
}
.headerBlog__menuTrigger:checked +
.headerBlog__menuBurger +
.headerBlog__menuHidden +
.headerBlog__menuHidden-bg {
  visibility: visible;
  opacity: .87;
  z-index: 50;
}
.headerBlog__menuTrigger:checked + .headerBlog__menuBurger span,
.headerBlog__menuTrigger:checked + .headerBlog__menuBurger:before,
.headerBlog__menuTrigger:checked + .headerBlog__menuBurger:after {
  background-color: #fff;
}
.headerBlog__menuTrigger:checked + .headerBlog__menuBurger span {
  opacity: 0;
  -webkit-transform: scale(0);
          transform: scale(0);
}
.headerBlog__menuTrigger:checked + .headerBlog__menuBurger:before {
  top: 8px;
  -webkit-transform: rotate(-45deg);
          transform: rotate(-45deg);
}
.headerBlog__menuTrigger:checked + .headerBlog__menuBurger:after {
  top: 8px;
  -webkit-transform: rotate(45deg);
          transform: rotate(45deg);
}
.headerBlog__menuTrigger:checked +
label.headerBlog__menuBurger +
.headerBlog__menuHidden > * {
  opacity: 1;
  -webkit-transform: translateY(0);
          transform: translateY(0);
}
/* -------------------------------------------------------------------------- */
/* ----- Адаптив ----- */
@media (min-width: 1600px) {
  .container--headerBlog {
    width: 1600px;
    max-width: 1600px;
    font-size: 16px;
  }
  .headerBlog__logo {
    padding-left: 50px;
  }
  .headerBlog__logoImg img {
    height: 55px;
    width: 225px;
  }
  .headerBlog__logoTitle {
    margin-left: 50px;
    padding-right: 30px;
  }
  .headerBlog__links {
    padding: 0 50px;
  }
  .headerBlog__link + .headerBlog__link {
    margin-left: 30px;
  }
  .headerBlog__socials {
    padding: 0 30px;
  }
  .headerBlog__icon {
    width: 115px;
  }
}
/* ----- Мобилка ----- */
.mobile .container,
  .mobile .container--headerBlog {
	width: 100%;

}
.mobile .headerBlog__logo {
	position: static;
	width: auto;
	border: none;

}
.mobile .headerBlog__logoTitle {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;

}
.mobile .headerBlog__socials {
	padding: 0 12px;
	border: none;

}
.mobile .headerBlog__icon {
	width: 55px;
	height: 55px;

}
.mobile .headerBlog__icon:first-of-type {
	border-left: none;

}
.mobile .headerBlog__icon:last-of-type {
	border-right: none;

}
.mobile .headerBlog__logoHover a:first-of-type {
	width: 50%;
	border-right: 1px solid rgba(255, 255, 255, .2);

}
.mobile .headerBlog__logoHover a:nth-of-type(2) {
	width: 36%;
	border-right: 1px solid rgba(255, 255, 255, .2);

}
.mobile .headerBlog__logoHover a:nth-of-type(3) {
	width: 14%;

}
.mobile .headerBlog__logoHover .headerBlog__logoHoverClose {
	width: 100%;
	height: 100%;
	overflow: hidden;
	position: relative;

}
.mobile .headerBlog__logoHover .headerBlog__logoHoverClose span {
	display: block;
	width: 26px;
	height: 26px;
	position: absolute;
	top: 50%;
	margin: 0 auto;
	-webkit-transform: translateY(-50%);
	        transform: translateY(-50%);

}
.mobile .headerBlog__logoHover .headerBlog__logoHoverClose span:before,
        .mobile .headerBlog__logoHover .headerBlog__logoHoverClose span:after {
	content: '';
	display: block;
	position: absolute;
	top: 12px;
	left: 0;
	height: 3px;
	width: 100%;
	background-color: #fff;

}
.mobile .headerBlog__logoHover .headerBlog__logoHoverClose span:before {
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);

}
.mobile .headerBlog__logoHover .headerBlog__logoHoverClose span:after {
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);

}
.mobile .headerBlog__logoHover .headerBlog__logoHoverClose span > span {
	display: none;

}
@media (max-width: 991px) {
	.mobile .headerBlog__logo {
		min-width: 191px;

	}
	.mobile .headerBlog__logo.\--active ~ .headerBlog__icons {
		display: none;

	}
	.mobile .headerBlog__logoImg {
		min-width: 176px;

	}
	.mobile .headerBlog__logoImg {
		padding: 36px 0;

	}
	.mobile .headerBlog__logoImg img {
		width: 176px;
		height: 43px;

	}
	.mobile .headerBlog__logoTitle {
		margin-left: 15px;
		padding-right: 5px;
		font-size: 16px;

	}
	.mobile .headerBlog .social-navigation li:not(:first-child) {
		margin-left: 5px;

	}

}
@media (max-width: 730px) {
	.mobile .headerBlog .subscribe .container--nonIndents {
		position: relative;

	}
	.mobile .headerBlog__links {
		-ms-flex-wrap: wrap;
		    flex-wrap: wrap;

	}
	.mobile .subscribe__container:before,
    .mobile .subscribe__formClose {
		display: none;

	}
	.mobile .subscribe__box {
		position: static;

	}
	.mobile .subscribe__form,
    .mobile .subscribe__description {
		width: 100%;

	}
	.mobile .subscribe__description {
		position: absolute;
		left: 0;
		right: 0;
		bottom: 0;
		padding-top: 30px;
		padding-bottom: 30px;
		-webkit-transform: translateY(100%);
		        transform: translateY(100%);

	}
	.mobile .subscribe__formSubmit {
		margin-right: 0;

	}

}
@media (max-width: 685px) {
	.mobile .headerBlog__logoTitle {
		display: none;

	}

}
@media (max-width: 660px) {
	.mobile .headerBlog__link {
		font-size: 14px;

	}
	.mobile .headerBlog__logoImg {
		padding: 0;

	}
	.mobile .headerBlog__logoHover a {
		font-size: 14px;

	}
	.mobile .headerBlog__logoHover a span {
		max-width: 90%;

	}

}
@media (max-width: 575px) {
	.mobile .headerBlog__socials {
		display: none;

	}
	.mobile .headerBlog__menuHidden {
		-webkit-box-pack: start;
		    -ms-flex-pack: start;
		        justify-content: flex-start;
		-webkit-box-orient: horizontal;
		-webkit-box-direction: normal;
		    -ms-flex-direction: row;
		        flex-direction: row;

	}
	.mobile .headerBlog__menuHidden .headerBlog__socialBurger {
		display: block;

	}
	.mobile .headerBlog__menuHidden .headerBlog__socialBurger .social-navigation li:not(:first-child) {
		margin-left: 15px;

	}

}
@media (max-width: 478px) {
	.mobile .headerBlog__fixHelper,
    .mobile .headerBlog {
		height: 65px;

	}
	.mobile .headerBlog__logoImg {
		padding: 35px 0;

	}
	.mobile .headerBlog__logoHover a {
		font-size: 14px;

	}
	.mobile .headerBlog__logoHover a span {
		max-width: 90%;

	}
	.mobile .headerBlog__menuHidden {
		height: 120px;
		-webkit-box-align: start;
		    -ms-flex-align: start;
		        align-items: flex-start;

	}
	.mobile .headerBlog__menuHidden .headerBlog__socialBurger {
		margin-bottom: 15px;

	}

}
@media (max-width: 445px) {
	.mobile .headerBlog__logo {

		/* min-width: 122px; */
		padding-left: 0;

	}
	.mobile .headerBlog__menu {
		margin-right: 0;

	}
	.mobile {

		/* & .headerBlog__logoImg {
      min-width: 122px;
    }
    & .headerBlog__logoImg img {
      width: 122px;
      height: 30px;
    } */

	}
	.mobile .headerBlog__icon {
		width: 42px;
		height: 42px;

	}
	.mobile .headerBlog__menuHidden .headerBlog__menuHiddenWrap {
		padding-right: 60px;

	}

}
@media (max-width: 380px) {
	.mobile .headerBlog__logo {
		margin-right: 4px;
		min-width: auto;

	}
	.mobile .headerBlog__logoImg {
		padding: 35px 0;
		padding: 0;
		width: auto;
		min-width: auto;

	}
	.mobile .headerBlog__logoImg img {
		max-width: 120px;

	}
	.mobile .headerBlog__svg--rss {
		width: 20px;
		height: 20px;

	}
	.mobile .subscribe__svg {
		width: 25px;
		height: 16px;

	}
	.mobile .siteHeader__searchToggle-icon svg {
		width: 18px;
		height: 18px;

	}

}
@media (max-width: 360px) {
	.mobile .headerBlog__logo {
		margin-right: 4px;

	}
	.mobile .headerBlog__menu {
		margin-left: 4px;

	}

}
footer.overall {
	padding: 100px 0 60px;
	background: #009cff;
	color: #fff;
	font-size: 14px;
	line-height: 1.75
}
footer.overall .container {}
footer.overall .masterGroup {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	width: 100%;

}
footer.overall .masterGroup > div {
	max-width: 25%;
	padding-right: 20px;

}
footer.overall .masterGroup > div:last-child {
	padding-right: 0;

}
footer.overall .masterGroup .contactGroup {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-flex: 2;
	    -ms-flex-positive: 2;
	        flex-grow: 2;
	-ms-flex-pack: distribute;
	    justify-content: space-around;
	max-width: 50%;
	padding-right: 0;

}
footer.overall .masterGroup .contactGroup > div {
	max-width: 50%;
	padding-right: 20px;

}
footer.overall .masterGroup .contactGroup > div:last-child {
	padding-right: 0;

}
footer.overall .masterGroup + .slaveGroup {
	border-top: 1px solid #00b3ff;
	margin-top: 40px;
	padding-top: 26px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;

}
footer.overall .slaveGroup {
	position: relative;

}
footer.overall .coopyright span {
	font-size: 18px;

}
footer.overall .navigationFooter {
	line-height: 1.35;

}
footer.overall .navigationFooter ul {
	margin-top: 3px;

}
footer.overall .navigationFooter ul li {
	margin: 6px 0;

}
footer.overall .navigationFooter ul li:first-child {
	margin-top: 0;

}
footer.overall .creatorLogo {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;

}
footer.overall .toTop {
	display: block;
	width: 28px;
	height: 28px;
	border-radius: 50%;
	overflow: hidden;
	background: #fff;
	text-align: center;
	-webkit-box-shadow: 0 0 9px rgba(0, 0, 0, .21);
	        box-shadow: 0 0 9px rgba(0, 0, 0, .21);
	-webkit-transition: background 0.3s ease-in-out 0s,
								-webkit-box-shadow 0.3s ease-in-out 0s;
	transition: background 0.3s ease-in-out 0s,
								-webkit-box-shadow 0.3s ease-in-out 0s;
	transition: box-shadow 0.3s ease-in-out 0s,
								background 0.3s ease-in-out 0s;
	transition: box-shadow 0.3s ease-in-out 0s,
								background 0.3s ease-in-out 0s,
								-webkit-box-shadow 0.3s ease-in-out 0s;
	margin-left: 20px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;

}
footer.overall .toTop:hover {
	background: #99d8ff;
	-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
	        box-shadow: 0 0 0 rgba(0, 0, 0, 0);

}
footer.overall .toTop svg {
	display: block;
	width: 12px;
	height: 6px;
	fill: #009cff;

}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.mobile footer.overall {
		padding-top: 60px;
		padding-bottom: 50px;
		padding-left: 15px;
		padding-right: 15px;

	}
	.mobile footer.overall .masterGroup > div {
		max-width: 33.33%;

	}
	.mobile footer.overall .masterGroup .contactGroup {
		max-width: 33.33%;
		-webkit-box-flex: 0;
		    -ms-flex-positive: 0;
		        flex-grow: 0;
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile footer.overall .masterGroup .contactGroup > div {
		max-width: 100%;

	}
	.mobile footer.overall .masterGroup .contactGroup > div:not(:first-child) {
		margin-top: 15px;

	}

}
@media (max-width: 478px) {
	.mobile footer.overall {
		padding: 20px 0;

	}
	.mobile footer.overall .masterGroup {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile footer.overall .masterGroup > div {
		max-width: 100%;

	}
	.mobile footer.overall .masterGroup > div:not(:first-child) {
		margin-top: 15px;

	}
	.mobile footer.overall .masterGroup .contactGroup {
		max-width: 100%;

	}
	.mobile footer.overall .masterGroup .contactGroup > div {
		max-width: 100%;

	}
	.mobile footer.overall .masterGroup + .slaveGroup {
		margin-top: 20px;
		padding-top: 15px;

	}

}
.social-navigation {
	margin: 10px 0;
	font-size: 0
}
.social-navigation li {
	display: inline-block;
	width: 32px;
	height: 32px;
	overflow: hidden;

}
.social-navigation li:not(:first-child) {
	margin-left: 10px;

}
.social-navigation a svg {
	width: 32px;
	height: 32px;
	fill: #fff;
	-webkit-transition: fill 0.2s ease-in-out;
	transition: fill 0.2s ease-in-out;

}
.social-navigation a:hover svg {
	fill: rgba(255, 255, 255, .6);

	/* fill: linear-gradient(45deg,#0da481 0%,#0da481 30%,#92d061 70%, #92d061 100%); */

}
[data-style="cardTags"] {
	font-size: 0;
}
[data-style="cardTags"] li {
	display: inline-block;
	margin: 6px 0;
	padding-right: 0.5em;
	color: #221F1F;
	font-size: 12px;
	line-height: 1;
	text-decoration: underline
}
[data-style="cardTags"] li:last-child {
	padding-right: 0;

}
[data-style="cardTags"] li {

	/* &:hover {
		text-decoration: none;
	} */

}
[data-style="breadcrumbs"] li {
	display: inline-block
}
[data-style="breadcrumbs"] li:after {
	content: '/';
	padding: 0 0 0 4px;

}
[data-style="breadcrumbs"] li:last-of-type:after {
	display: none;

}
[data-style="breadcrumbs"] li a {
	text-decoration: underline
}
[data-style="breadcrumbs"] li a:hover {
	text-decoration: none;

}
/**
 * Swiper 4.1.6
 * Most modern mobile touch slider and framework with hardware accelerated transitions
 * http://www.idangero.us/swiper/
 *
 * Copyright 2014-2018 Vladimir Kharlampidi
 *
 * Released under the MIT License
 *
 * Released on: February 11, 2018
 */
.swiper-container {
  margin: 0 auto;
  position: relative;
  overflow: hidden;
  list-style: none;
  padding: 0;
  /* Fix of Webkit flickering */
  z-index: 1;
}
.swiper-container-no-flexbox .swiper-slide {
  float: left;
}
.swiper-container-vertical > .swiper-wrapper {
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -ms-flex-direction: column;
  flex-direction: column;
}
.swiper-wrapper {
  position: relative;
  width: 100%;
  height: 100%;
  z-index: 1;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-transition-property: -webkit-transform;
  transition-property: -webkit-transform;
  transition-property: transform;
  transition-property: transform, -webkit-transform;
  -webkit-box-sizing: content-box;
  box-sizing: content-box;
}
.swiper-container-android .swiper-slide,
.swiper-wrapper {
  -webkit-transform: translate3d(0px, 0, 0);
  transform: translate3d(0px, 0, 0);
}
.swiper-container-multirow > .swiper-wrapper {
  -ms-flex-wrap: wrap;
  flex-wrap: wrap;
}
.swiper-container-free-mode > .swiper-wrapper {
  -webkit-transition-timing-function: ease-out;
  transition-timing-function: ease-out;
  margin: 0 auto;
}
.swiper-slide {
  -ms-flex-negative: 0;
  flex-shrink: 0;
  width: 100%;
  height: 100%;
  position: relative;
  -webkit-transition-property: -webkit-transform;
  transition-property: -webkit-transform;
  transition-property: transform;
  transition-property: transform, -webkit-transform;
}
.swiper-invisible-blank-slide {
  visibility: hidden;
}
/* Auto Height */
.swiper-container-autoheight,
.swiper-container-autoheight .swiper-slide {
  height: auto;
}
.swiper-container-autoheight .swiper-wrapper {
  -webkit-box-align: start;
  -ms-flex-align: start;
  align-items: flex-start;
  -webkit-transition-property: height, -webkit-transform;
  transition-property: height, -webkit-transform;
  transition-property: transform, height;
  transition-property: transform, height, -webkit-transform;
}
/* 3D Effects */
.swiper-container-3d {
  -webkit-perspective: 1200px;
  perspective: 1200px;
}
.swiper-container-3d .swiper-wrapper,
.swiper-container-3d .swiper-slide,
.swiper-container-3d .swiper-slide-shadow-left,
.swiper-container-3d .swiper-slide-shadow-right,
.swiper-container-3d .swiper-slide-shadow-top,
.swiper-container-3d .swiper-slide-shadow-bottom,
.swiper-container-3d .swiper-cube-shadow {
  -webkit-transform-style: preserve-3d;
  transform-style: preserve-3d;
}
.swiper-container-3d .swiper-slide-shadow-left,
.swiper-container-3d .swiper-slide-shadow-right,
.swiper-container-3d .swiper-slide-shadow-top,
.swiper-container-3d .swiper-slide-shadow-bottom {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  z-index: 10;
}
.swiper-container-3d .swiper-slide-shadow-left {
  background-image: -webkit-gradient(linear, right top, left top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, 0)));
  background-image: linear-gradient(to left, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
}
.swiper-container-3d .swiper-slide-shadow-right {
  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, 0)));
  background-image: linear-gradient(to right, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
}
.swiper-container-3d .swiper-slide-shadow-top {
  background-image: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, 0)));
  background-image: linear-gradient(to top, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
}
.swiper-container-3d .swiper-slide-shadow-bottom {
  background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, 0)));
  background-image: linear-gradient(to bottom, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
}
/* IE10 Windows Phone 8 Fixes */
.swiper-container-wp8-horizontal,
.swiper-container-wp8-horizontal > .swiper-wrapper {
  -ms-touch-action: pan-y;
  touch-action: pan-y;
}
.swiper-container-wp8-vertical,
.swiper-container-wp8-vertical > .swiper-wrapper {
  -ms-touch-action: pan-x;
  touch-action: pan-x;
}
.swiper-button-prev,
.swiper-button-next {
  position: absolute;
  top: 50%;
  width: 27px;
  height: 44px;
  margin-top: -22px;
  z-index: 10;
  cursor: pointer;
  background-size: 27px 44px;
  background-position: center;
  background-repeat: no-repeat;
}
.swiper-button-prev.swiper-button-disabled,
.swiper-button-next.swiper-button-disabled {
  opacity: 0.35;
  cursor: auto;
  pointer-events: none;
}
.swiper-button-prev,
.swiper-container-rtl .swiper-button-next {
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");
  left: 10px;
  right: auto;
}
.swiper-button-next,
.swiper-container-rtl .swiper-button-prev {
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");
  right: 10px;
  left: auto;
}
.swiper-button-prev.swiper-button-white,
.swiper-container-rtl .swiper-button-next.swiper-button-white {
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E");
}
.swiper-button-next.swiper-button-white,
.swiper-container-rtl .swiper-button-prev.swiper-button-white {
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E");
}
.swiper-button-prev.swiper-button-black,
.swiper-container-rtl .swiper-button-next.swiper-button-black {
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E");
}
.swiper-button-next.swiper-button-black,
.swiper-container-rtl .swiper-button-prev.swiper-button-black {
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E");
}
.swiper-button-lock {
  display: none;
}
.swiper-pagination {
  position: absolute;
  text-align: center;
  -webkit-transition: 300ms opacity;
  transition: 300ms opacity;
  -webkit-transform: translate3d(0, 0, 0);
  transform: translate3d(0, 0, 0);
  z-index: 10;
}
.swiper-pagination.swiper-pagination-hidden {
  opacity: 0;
}
/* Common Styles */
.swiper-pagination-fraction,
.swiper-pagination-custom,
.swiper-container-horizontal > .swiper-pagination-bullets {
  bottom: 10px;
  left: 0;
  width: 100%;
}
/* Bullets */
.swiper-pagination-bullets-dynamic {
  overflow: hidden;
  font-size: 0;
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet {
  -webkit-transform: scale(0.33);
  transform: scale(0.33);
  position: relative;
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active {
  -webkit-transform: scale(1);
  transform: scale(1);
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main {
  -webkit-transform: scale(1);
  transform: scale(1);
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev {
  -webkit-transform: scale(0.66);
  transform: scale(0.66);
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev {
  -webkit-transform: scale(0.33);
  transform: scale(0.33);
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next {
  -webkit-transform: scale(0.66);
  transform: scale(0.66);
}
.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next {
  -webkit-transform: scale(0.33);
  transform: scale(0.33);
}
.swiper-pagination-bullet {
  width: 8px;
  height: 8px;
  display: inline-block;
  border-radius: 100%;
  background: #000;
  opacity: 0.2;
}
button.swiper-pagination-bullet {
  border: none;
  margin: 0;
  padding: 0;
  -webkit-box-shadow: none;
  box-shadow: none;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
}
.swiper-pagination-clickable .swiper-pagination-bullet {
  cursor: pointer;
}
.swiper-pagination-bullet-active {
  opacity: 1;
  background: #007aff;
}
.swiper-container-vertical > .swiper-pagination-bullets {
  right: 10px;
  top: 50%;
  -webkit-transform: translate3d(0px, -50%, 0);
  transform: translate3d(0px, -50%, 0);
}
.swiper-container-vertical > .swiper-pagination-bullets .swiper-pagination-bullet {
  margin: 6px 0;
  display: block;
}
.swiper-container-vertical > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic {
  top: 50%;
  -webkit-transform: translateY(-50%);
  transform: translateY(-50%);
  width: 8px;
}
.swiper-container-vertical > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet {
  display: inline-block;
  -webkit-transition: 200ms top, 200ms -webkit-transform;
  transition: 200ms top, 200ms -webkit-transform;
  transition: 200ms transform, 200ms top;
  transition: 200ms transform, 200ms top, 200ms -webkit-transform;
}
.swiper-container-horizontal > .swiper-pagination-bullets .swiper-pagination-bullet {
  margin: 0 4px;
}
.swiper-container-horizontal > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic {
  left: 50%;
  -webkit-transform: translateX(-50%);
  transform: translateX(-50%);
  white-space: nowrap;
}
.swiper-container-horizontal > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet {
  -webkit-transition: 200ms left, 200ms -webkit-transform;
  transition: 200ms left, 200ms -webkit-transform;
  transition: 200ms transform, 200ms left;
  transition: 200ms transform, 200ms left, 200ms -webkit-transform;
}
.swiper-container-horizontal.swiper-container-rtl > .swiper-pagination-bullets-dynamic .swiper-pagination-bullet {
  -webkit-transition: 200ms right, 200ms -webkit-transform;
  transition: 200ms right, 200ms -webkit-transform;
  transition: 200ms transform, 200ms right;
  transition: 200ms transform, 200ms right, 200ms -webkit-transform;
}
/* Progress */
.swiper-pagination-progressbar {
  background: rgba(0, 0, 0, .25);
  position: absolute;
}
.swiper-pagination-progressbar .swiper-pagination-progressbar-fill {
  background: #007aff;
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  -webkit-transform: scale(0);
  transform: scale(0);
  -webkit-transform-origin: left top;
  transform-origin: left top;
}
.swiper-container-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill {
  -webkit-transform-origin: right top;
  transform-origin: right top;
}
.swiper-container-horizontal > .swiper-pagination-progressbar {
  width: 100%;
  height: 4px;
  left: 0;
  top: 0;
}
.swiper-container-vertical > .swiper-pagination-progressbar {
  width: 4px;
  height: 100%;
  left: 0;
  top: 0;
}
.swiper-pagination-white .swiper-pagination-bullet-active {
  background: #ffffff;
}
.swiper-pagination-progressbar.swiper-pagination-white {
  background: rgba(255, 255, 255, .25);
}
.swiper-pagination-progressbar.swiper-pagination-white .swiper-pagination-progressbar-fill {
  background: #ffffff;
}
.swiper-pagination-black .swiper-pagination-bullet-active {
  background: #000000;
}
.swiper-pagination-progressbar.swiper-pagination-black {
  background: rgba(0, 0, 0, .25);
}
.swiper-pagination-progressbar.swiper-pagination-black .swiper-pagination-progressbar-fill {
  background: #000000;
}
.swiper-pagination-lock {
  display: none;
}
/* Scrollbar */
.swiper-scrollbar {
  border-radius: 10px;
  position: relative;
  -ms-touch-action: none;
  background: rgba(0, 0, 0, .1);
}
.swiper-container-horizontal > .swiper-scrollbar {
  position: absolute;
  left: 1%;
  bottom: 3px;
  z-index: 50;
  height: 5px;
  width: 98%;
}
.swiper-container-vertical > .swiper-scrollbar {
  position: absolute;
  right: 3px;
  top: 1%;
  z-index: 50;
  width: 5px;
  height: 98%;
}
.swiper-scrollbar-drag {
  height: 100%;
  width: 100%;
  position: relative;
  background: rgba(0, 0, 0, .5);
  border-radius: 10px;
  left: 0;
  top: 0;
}
.swiper-scrollbar-cursor-drag {
  cursor: move;
}
.swiper-scrollbar-lock {
  display: none;
}
.swiper-zoom-container {
  width: 100%;
  height: 100%;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -ms-flex-pack: center;
  justify-content: center;
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
  text-align: center;
}
.swiper-zoom-container > img,
.swiper-zoom-container > svg,
.swiper-zoom-container > canvas {
  max-width: 100%;
  max-height: 100%;
  -o-object-fit: contain;
  object-fit: contain;
}
.swiper-slide-zoomed {
  cursor: move;
}
/* Preloader */
.swiper-lazy-preloader {
  width: 42px;
  height: 42px;
  position: absolute;
  left: 50%;
  top: 50%;
  margin-left: -21px;
  margin-top: -21px;
  z-index: 10;
  -webkit-transform-origin: 50%;
  transform-origin: 50%;
  -webkit-animation: swiper-preloader-spin 1s steps(12, end) infinite;
  animation: swiper-preloader-spin 1s steps(12, end) infinite;
}
.swiper-lazy-preloader:after {
  display: block;
  content: '';
  width: 100%;
  height: 100%;
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
  background-position: 50%;
  background-size: 100%;
  background-repeat: no-repeat;
}
.swiper-lazy-preloader-white:after {
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
}
@-webkit-keyframes swiper-preloader-spin {
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}
@keyframes swiper-preloader-spin {
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}
/* a11y */
.swiper-container .swiper-notification {
  position: absolute;
  left: 0;
  top: 0;
  pointer-events: none;
  opacity: 0;
  z-index: -1000;
}
.swiper-container-fade.swiper-container-free-mode .swiper-slide {
  -webkit-transition-timing-function: ease-out;
  transition-timing-function: ease-out;
}
.swiper-container-fade .swiper-slide {
  pointer-events: none;
  -webkit-transition-property: opacity;
  transition-property: opacity;
}
.swiper-container-fade .swiper-slide .swiper-slide {
  pointer-events: none;
}
.swiper-container-fade .swiper-slide-active,
.swiper-container-fade .swiper-slide-active .swiper-slide-active {
  pointer-events: auto;
}
.swiper-container-cube {
  overflow: visible;
}
.swiper-container-cube .swiper-slide {
  pointer-events: none;
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
  z-index: 1;
  visibility: hidden;
  -webkit-transform-origin: 0 0;
  transform-origin: 0 0;
  width: 100%;
  height: 100%;
}
.swiper-container-cube .swiper-slide .swiper-slide {
  pointer-events: none;
}
.swiper-container-cube.swiper-container-rtl .swiper-slide {
  -webkit-transform-origin: 100% 0;
  transform-origin: 100% 0;
}
.swiper-container-cube .swiper-slide-active,
.swiper-container-cube .swiper-slide-active .swiper-slide-active {
  pointer-events: auto;
}
.swiper-container-cube .swiper-slide-active,
.swiper-container-cube .swiper-slide-next,
.swiper-container-cube .swiper-slide-prev,
.swiper-container-cube .swiper-slide-next + .swiper-slide {
  pointer-events: auto;
  visibility: visible;
}
.swiper-container-cube .swiper-slide-shadow-top,
.swiper-container-cube .swiper-slide-shadow-bottom,
.swiper-container-cube .swiper-slide-shadow-left,
.swiper-container-cube .swiper-slide-shadow-right {
  z-index: 0;
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
}
.swiper-container-cube .swiper-cube-shadow {
  position: absolute;
  left: 0;
  bottom: 0px;
  width: 100%;
  height: 100%;
  background: #000;
  opacity: 0.6;
  -webkit-filter: blur(50px);
  filter: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg"><filter id="filter"><feGaussianBlur stdDeviation="50" /></filter></svg>#filter');
  filter: blur(50px);
  z-index: 0;
}
.swiper-container-flip {
  overflow: visible;
}
.swiper-container-flip .swiper-slide {
  pointer-events: none;
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
  z-index: 1;
}
.swiper-container-flip .swiper-slide .swiper-slide {
  pointer-events: none;
}
.swiper-container-flip .swiper-slide-active,
.swiper-container-flip .swiper-slide-active .swiper-slide-active {
  pointer-events: auto;
}
.swiper-container-flip .swiper-slide-shadow-top,
.swiper-container-flip .swiper-slide-shadow-bottom,
.swiper-container-flip .swiper-slide-shadow-left,
.swiper-container-flip .swiper-slide-shadow-right {
  z-index: 0;
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
}
.swiper-container-coverflow .swiper-wrapper {
  /* Windows 8 IE 10 fix */
  -ms-perspective: 1200px;
}
[data-style="slider"] {
	width: 100%;
	height: 75vh;
	min-height: 550px;
	max-height:600px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	overflow: hidden
}
[data-style="slider"] .sectionName {
	margin: 50px 0;

}
[data-style="slider"] p {
	margin: 50px 0;
	font-size: 1.125em;

}
[data-style="slider"] .swiper-slide {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: end;
	    -ms-flex-pack: end;
	        justify-content: flex-end;

}
[data-style="slider"] .swiper-pagination-bullets {
	left: calc(50% + 40px) !important;
	bottom: 40px !important;
	width: auto !important;

}
[data-style="slider"] .swiper-pagination-bullets .swiper-pagination-bullet {
	width: 26px;
	height: 26px;
	padding: 3px;
	border: 0px solid transparent;
	border-radius: 1000px;
	position: relative;
	opacity: .6;
	-webkit-transition: all .2s ease;
	transition: all .2s ease;
	cursor: pointer;
	background: transparent;

}
[data-style="slider"] .swiper-pagination-bullets .swiper-pagination-bullet:hover,
			[data-style="slider"] .swiper-pagination-bullets .swiper-pagination-bullet.swiper-pagination-bullet-active {
	border-color: #fff;
	border-width: 3px;
	padding: 0px;
	opacity: 1;

}
[data-style="slider"] .swiper-pagination-bullets .swiper-pagination-bullet:after {
	content: '';
	width: 14px;
	height:14px;
	background: #fff;
	display: block;
	border-radius: 1000px;
	position: absolute;
	top: 0;
	left: 0;
	bottom: 0;
	right: 0;
	margin: auto;
	-webkit-transition: all .2s ease;
	transition: all .2s ease;

}
[data-style="sliderImage"] {
	width: 100%;
	height: 100%;
	background-position: left top;
	background-size: cover;
	background-repeat: no-repeat;
	-webkit-transform-origin: center;
	        transform-origin: center;
	-webkit-transition: all .9s ease;
	transition: all .9s ease;
	position: absolute;
	z-index: 1;
}
[data-style="sliderContent"] {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: start;
	    -ms-flex-pack: start;
	        justify-content: flex-start;
	-webkit-box-align: end;
	    -ms-flex-align: end;
	        align-items: flex-end;
	width: 50%;
	height: 100%;
	-webkit-transform-origin: center;
	        transform-origin: center;
	-webkit-transition: all .9s ease;
	transition: all .9s ease;
	position: relative;
	z-index: 3
}
[data-style="sliderContent"]::after {
	content: '';
	width: 100%;
	height: 100%;
	background: linear-gradient(45deg, #0da481, #eff04b);
	position: absolute;
	top: 0;
	left: 0;
	z-index: 1;
	opacity: .9;

}
[data-style="sliderContentInner"] {
	padding-left: 45px;
	padding-right: 45px;
	color: #fff;
	-webkit-transform-origin: center;
	        transform-origin: center;
	-webkit-transition: all .9s ease;
	transition: all .9s ease;
	margin-bottom: 120px;
	position: relative;
	z-index: 2;
}
/* ------------------------------------------------------------------------- */
.mobile [data-style="slider"] {
	height: 60vh;

}
.mobile [data-style="sliderContentInner"] .sectionName {
	font-size: 1.85em;

}
@media (max-width: 991px) {
	.mobile [data-style="slider"] {
		height: auto;
		min-height: auto;
		max-height: none;
		background-color: gray;

		/* max-height: calc(100% - 115px); */

	}
	.mobile [data-style="slider"] .swiper-slide {
		height: auto;
		min-height: 380px;
		max-height: none;
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		padding-top: 180px;

	}
	.mobile [data-style="slider"] .swiper-wrapper {
		height: auto;
		max-height: none;

	}
	.mobile [data-style="slider"] .swiper-pagination-bullets {
		left: 50%!important;
		bottom: 20px!important;
		-webkit-transform: translateX(-50%);
		        transform: translateX(-50%);

	}
	.mobile [data-style="slider"] .sectionName,
			.mobile [data-style="slider"] p {
		margin: 10px 0;

	}
	.mobile {

		/* & [data-style="sliderImage"],
		& [data-style="sliderContent"] {
			flex-grow: 1;
		}

		& [data-style="sliderImage"] {
			flex-basis: 60%;
			position: relative;
			height: 0;
			padding-bottom: 52.25%;
			max-height: 360px;
		} */

	}
	.mobile [data-style="sliderContent"] {
		width: 100%;
		height: auto;
		-webkit-box-align: start;
		    -ms-flex-align: start;
		        align-items: flex-start;

	}
	.mobile [data-style="sliderContent"]::after {
		opacity: .5;

	}
	.mobile [data-style="sliderContentInner"] {
		width: 100%;
		padding: 25px 45px 54px;
		margin-bottom: 0px;
		text-shadow: 0px 1px 1px #000;

	}

}
@media (max-width: 478px) {
	.mobile [data-style="sliderContentInner"] {
		padding: 15px 15px 54px;

	}
	.mobile [data-style="sliderContentInner"] .sectionName {
		font-size: 1.4em;

	}

}
[data-style~="inputText"] {
	display: block;
	position: relative;
	height: 3.5em;
	font-size: 1em;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	cursor: pointer;
}
.inputText__input {
	outline: none;
	border: none;
	width: 100%;
	padding: 15px 0 10px;
	height:1.4em;
	background: transparent;
	font-family: inherit;
	font-size: inherit;
	color: inherit;
}
.inputText__placeholder {
	position: absolute;
	font-weight: 500;
	font-size: .875em;
	opacity: .6;
	left: 0;
	top: 0;
	bottom: 0;
	margin: auto;
	height: 1.2em;
	-webkit-transition: all .2s ease;
	transition: all .2s ease;
	-webkit-transform-origin: 0 0;
	        transform-origin: 0 0;
}
.inputText__error {
	display: none;
  font-size: 13px;
  text-align: left;
  color: #f72e2e;
	position: absolute;
	left: 0;
	bottom: 0;
	-webkit-transform: translateY(100%);
	        transform: translateY(100%);
}
[data-style~="inputText"] > input {
  opacity: 0;
  -webkit-transition: opacity .25s;
  transition: opacity .25s;
}
[data-style~="inputText"].\--hasValue > input,
[data-style~="inputText"].\--hasValue input:active,
[data-style~="inputText"] input:focus {
  opacity: 1;
}
[data-style~="inputText"].\--hasValue > input + span,
[data-style~="inputText"].\--hasValue input:active + span,
[data-style~="inputText"] input:focus + span {
	top: 0;
	-webkit-transform: scale(.75) translateY(-1.2em);
	        transform: scale(.75) translateY(-1.2em);
}
[data-style~="inputText"]:before,
	[data-style~="inputText"]:after {
	content: '';
	display: block;
	height: 2px;
	position: absolute;
	bottom: .4em;
	background-color: currentColor;
	-webkit-transition: all .3s ease;
	transition: all .3s ease;

}
[data-style~="inputText"]:before {
	width: 100%;
	left: 0;
	opacity: 0.7;

}
[data-style~="inputText"]:after {
	width: 0px;

	/* background: rgb(233, 225, 20); */
	left: 25%;
	opacity: 1;

}
[data-style~="inputText"].\--hasValue:after {
	width: 100%;
	left: 0%;

}
.hasError:before {
	background-color: #f72e2e;

}
.hasError .inputText__error {
	display: block;

	/* animation: secondFade 1s; */

}
[data-style~="inputSelect"] {
	display: block;
	position: relative;
	height: 3.5em;
	font-size: 1em;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	cursor: pointer;
}
.inputSelect__input {
	outline: none;
	border: none;
	width: 100%;
	padding: 6px 10px 19px 0;
	height:1.4em;
	background: transparent;
	font-size: inherit;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.inputSelect__placeholder {
	position: absolute;
	font-weight: 500;
	font-size: .875em;
	opacity: 0.75;
	left: 0;
	top: 0;
	bottom: 0;
	margin: auto;
	height: 1.2em;
	-webkit-transition: all .2s ease;
	transition: all .2s ease;
	-webkit-transform-origin: 0 0;
	        transform-origin: 0 0;
}
.inputSelect__iconDown {
	width: 28px;
	min-width: 28px;
	height: 28px;
	min-height: 28px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center
	/* opacity: 0.6; */
}
.inputSelect__iconDown svg {
	width: 14px;
	height: 8px;
	fill: #fff;
	stroke: #fff;
	stroke-width: 1px;
	-webkit-transition: all .2s ease;
	transition: all .2s ease;
	-webkit-transform: rotate(180deg);
	        transform: rotate(180deg);

}
[data-style~="inputSelect"].\--opened .inputSelect__iconDown svg {
	-webkit-transform: rotate(0);
	        transform: rotate(0);

}
[data-style~="inputSelect"].\--hasValue > .inputSelect__placeholder {
	top: 0;
	-webkit-transform: scale(.75) translateY(-1.2em);
	        transform: scale(.75) translateY(-1.2em);
}
.inputSelect {
  position: relative
}
.inputSelect.inputSelect--index-1 {
	z-index: 90;

}
.inputSelect.inputSelect--index-2 {
	z-index: 89;

}
.inputSelect.inputSelect--index-3 {
	z-index: 87;

}
.inputSelect.inputSelect--index-4 {
	z-index: 86;

}
.inputSelect.inputSelect--index-5 {
	z-index: 85;

}
.inputSelect__list {
  display: block;
	z-index: 10;
  position: absolute;
  width: 100%;
  top: 100%;
	left: 0;
  height:0;
  overflow: hidden;
  background: #fff;
  color: #221F1F;
  -webkit-box-shadow: 0 3px 15px 0 rgba(0, 0, 0, .2);
          box-shadow: 0 3px 15px 0 rgba(0, 0, 0, .2);
}
.inputSelect__option {
  display: block;
  padding: 15px;
  font-size: 18px;
  border-bottom: 1px solid #d6d6d6
}
.inputSelect__option:nth-last-of-type(1) {
	border-bottom: none;

}
.inputSelect__option:hover {
	background: #f0f0f0;

}
[data-style~="inputSelect"]:before,
	[data-style~="inputSelect"]:after {
	content: '';
	display: block;
	height: 2px;
	position: absolute;
	bottom: .4em;
	background: currentColor;
	-webkit-transition: all .3s ease;
	transition: all .3s ease;

}
[data-style~="inputSelect"]:before {
	width: 100%;
	left: 0;

	/* opacity: 0.7; */

}
[data-style~="inputSelect"]:after {
	width: 0px;

	/* background: rgb(233, 225, 20); */
	left: 25%;

	/* opacity: 1; */

}
[data-style~="inputSelect"].\--hasValue:after {
	width: 100%;
	left: 0%;

}
@media (max-width: 991px) {
	.mobile {}

}
@media (max-width: 478px) {
	.mobile .inputSelect__option {
		font-size: 16px;
		font-weight: 500;

	}

}
[data-style~="textarea"] {
	display: block;
	position: relative;
	height: calc(11.25em + 15px);
	font-size: 1em;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	cursor: pointer;
}
.textarea__input {
	outline: none;
	border: none;
	width: 100%;
	padding: 15px 0 10px;
	position: relative;
	top: .1em;
	height: calc(100% - 1.2em);
	background: transparent;
	font-family: inherit;
	font-size: inherit;
	color: inherit;
	resize: none;
}
.textarea__placeholder {
	position: absolute;
	font-weight: 500;
	font-size: .875em;
	opacity: .6;
	left: 0;
	top: .8em;
	margin: auto;
	height: 1.2em;
	-webkit-transition: all .2s ease;
	transition: all .2s ease;
	-webkit-transform-origin: 0 0;
	        transform-origin: 0 0;
}
[data-style~="textarea"].\--hasValue > textarea + span,
[data-style~="textarea"].\--hasValue textarea:active + span,
[data-style~="textarea"] textarea:focus + span {
	-webkit-transform: scale(.75) translateY(-1.2em);
	        transform: scale(.75) translateY(-1.2em);
}
[data-style~="textarea"]:before,
	[data-style~="textarea"]:after {
	content: '';
	display: block;
	height: 2px;
	position: absolute;
	bottom: .4em;
	background: currentColor;
	-webkit-transition: all .3s ease;
	transition: all .3s ease;

}
[data-style~="textarea"]:before {
	width: 100%;
	left: 0;
	opacity: 0.7;

}
[data-style~="textarea"]:after {
	width: 0px;

	/* background: rgb(233, 225, 20); */
	left: 25%;
	opacity: 1;

}
[data-style~="textarea"].\--hasValue:after {
	width: 100%;
	left: 0%;

}
.textarea__error {
	display: none;
  font-size: 13px;
  text-align: left;
  color: #f72e2e;
	position: absolute;
	left: 0;
	bottom: 0;
	-webkit-transform: translateY(100%);
	        transform: translateY(100%);
}
.hasError:before {
	background-color: #f72e2e;

}
.hasError .textarea__error {
	display: block;

	/* animation: secondFade 1s; */

}
.loadFileDrugNDrop__formStyle {
  -webkit-box-shadow: 0 3px 15px 0 rgba(0, 0, 0, .2);
          box-shadow: 0 3px 15px 0 rgba(0, 0, 0, .2);
}
.loadFileDrugNDrop__formStyle-transition {
	-webkit-transition: -webkit-box-shadow .8s ease;
	transition: -webkit-box-shadow .8s ease;
	transition: box-shadow .8s ease;
	transition: box-shadow .8s ease, -webkit-box-shadow .8s ease;
}
.loadFileDrugNDrop__label {
	padding: 30px 40px;
	border: 3px dotted;
	display: block;
	position: relative;
	font-size: 0;
	cursor: pointer;
	-webkit-transition: -webkit-box-shadow .3s ease;
	transition: -webkit-box-shadow .3s ease;
	transition: box-shadow .3s ease;
	transition: box-shadow .3s ease, -webkit-box-shadow .3s ease;
  width: calc(100% - 30px);
  margin: 15px
}
.loadFileDrugNDrop__label.\--active {
	background: #dff2e2 url(/images/static/loadFileDragNDrop.gif) center center/33px 26px no-repeat;
	color: transparent;
	-webkit-box-shadow: 0 3px 15px 0 rgba(0, 0, 0, .2);
	        box-shadow: 0 3px 15px 0 rgba(0, 0, 0, .2);

}
.loadFileDrugNDrop__label:hover {
	border-style: solid;
	border-color: #fff;
	background: #fff;

	/* @apply --boxShadow; */

}
.loadFileDrugNDrop__label:hover span,
		.loadFileDrugNDrop__label:hover strong {
	color: #009cff;

}
.loadFileDrugNDrop__input {
	display: none;
}
.loadFileDrugNDrop__placeholder {
	position: absolute;
	width:100%;
	height: 100%;
	top:0;
	left:0
	/* padding: 20px; */
	/* display: flex; */
	/* justify-content: center; */
	/* align-items: center; */
}
.loadFileDrugNDrop__placeholder strong {
	display: block;
	padding-left: 10px;
	padding-right: 10px;
	padding-top: 10px;
	font-size: 18px;
	font-weight: 900;
	text-align: center;

}
.loadFileDrugNDrop__placeholder span {
	display: block;
	padding-left: 10px;
	padding-right: 10px;
	padding-top: 3px;
	color: #fff;
	font-size: 14px;
	font-weight: 400;
	text-align: center;

}
.loadFileDrugNDrop__file {
	overflow: hidden;
	font-size: 1rem;
	color: #009cff;
	-webkit-transition: all .3s ease;
	transition: all .3s ease;
}
.loadFileDrugNDrop__file-content {
	position: relative;
	background: rgba(255, 255, 255, .6);
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	-webkit-transition: all .3s ease;
	transition: all .3s ease;
  width: calc(100% - 30px);
  margin: 15px;
  -webkit-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, .25);
          box-shadow: 0 2px 10px 0 rgba(0, 0, 0, .25);

	margin-top: 7.5px;
	margin-bottom: 7.5px;
}
.loadFileDrugNDrop__file-text {
	padding: 20px;
	font-weight: 500;
	position: relative;
	z-index: 2;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
}
.loadFileDrugNDrop__file-remove {
	width: 30px;
	min-width: 30px;
	height:30px;
	position: relative;
	margin: 15px;
	z-index: 2;
	cursor: pointer;
	-webkit-transition: all .3s ease;
	transition: all .3s ease
}
.loadFileDrugNDrop__file-remove:before,
	.loadFileDrugNDrop__file-remove:after {
	content:'';
	width: 24px;
	height: 2px;
	position: absolute;
	left: 0;
	top: 0;
	right: 0;
	bottom: 0;
	margin: auto;
	background: #000;
	background: currentColor;

}
.loadFileDrugNDrop__file-remove:before {
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);

}
.loadFileDrugNDrop__file-remove:after {
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);

}
.loadFileDrugNDrop__file-remove:hover {
	-webkit-transform: scale(1.1);
	        transform: scale(1.1);

}
.loadFileDrugNDrop__file-textProgress {
	position: relative;
	z-index: 2;
	white-space: nowrap;
	min-width: 240px;
	text-align: right;
}
.loadFileDrugNDrop__file-progress {
	position: absolute;
	bottom: 0;
	left: 0;
	width:0;
	height: 100%;
	background: #000;
	background: #fff;
	z-index: 1;
	-webkit-transition: width .4s ease;
	transition: width .4s ease;
}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.mobile .loadFileDrugNDrop__label {
		padding-top: 40px;
		padding-bottom: 40px;

	}

}
@media (max-width: 478px) {
	.mobile .loadFileDrugNDrop__label {
		padding-top: 45px;
		padding-bottom: 45px;

	}

}
.links-tags {
	margin: 40px 0;
	font-size: 0
}
.links-tags li {
	display: inline-block;
	padding: 0 0.5em 0 0;
	font-size: 16px;
	font-weight: 500;
	color: #221F1F;

}
.links-tags li:first-child {
	padding-left: 0;
	padding-right: 5px;

}
.links-tags a {
	color: #221F1F;
	text-decoration: underline;

}
.links-tags .theme-red:hover {
	color: #e83930;

}
.links-tags .theme-green:hover {
	color: #009353;

}
.links-tags .theme-green-2:hover {
	color: #47bd6a;

}
.links-tags .theme-blue:hover {
	color: #0534ff;

}
.links-tags .theme-blue-2:hover {
	color: #4359e0;

}
.links-tags .theme-purple:hover {
	color: #7b35cb;

}
.links-tags .theme-purple-2:hover {
	color: #7830ca;

}
.links-tags .theme-black:hover {
	color: #000;

}
.links-tags .theme-orange:hover {
	color: #fb7720;

}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.links-tags {
		margin-top: 20px;
		margin-bottom: 20px;
	}
}
@media (max-width: 478px) {
	.links-tags {
		margin-top: 10px;
		margin-bottom: 10px;
	}
}
.events__array {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	    flex-wrap: wrap;
}
.events__item {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: stretch;
	    -ms-flex-align: stretch;
	        align-items: stretch;
	padding: 15px;
}
.eventsCardMain__wrap {
	display: block;
	width: 100%;
	height: 480px;
	overflow: hidden;
	background: #fff;
	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	        box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	position: relative;
	cursor: pointer
}
.eventsCardMain__wrap:hover .eventsCardMain__imageWrap span {
	-webkit-transform: scale(1.1);
	        transform: scale(1.1);

}
.eventsCardMain__wrap:hover .eventsCardMain__title span {
	background-size: 100% 1px;

}
.eventsCardMain__image {
	position: relative;
	background-size: cover
}
.eventsCardMain__image .eventsCardMain__icon {
	width: 60px;
	height: 60px;
	border-radius: 50%;
	background: #fff;
	-webkit-box-shadow: 0 0 9px rgba(0, 0, 0, .16);
	        box-shadow: 0 0 9px rgba(0, 0, 0, .16);
	position: absolute;

}
.eventsCardMain__image .eventsCardMain__icon svg {
	width: 28px;
	height: 28px;
	position: absolute;
	top: 50%;
	left: 50%;
	-webkit-transform: translate(-50%, -50%);
	        transform: translate(-50%, -50%);

}
.eventsCardMain__imageWrap {
	height: 100%;
	overflow: hidden
}
.eventsCardMain__imageWrap span {
	display: block;
	height: 100%;
	background-repeat: no-repeat;
	background-size: cover;
	-webkit-transition: -webkit-transform 0.3s ease;
	transition: -webkit-transform 0.3s ease;
	transition: transform 0.3s ease;
	transition: transform 0.3s ease, -webkit-transform 0.3s ease;

}
.eventsCardMain__icon {
	width: 28px;
	height: 28px
}
.eventsCardMain__icon svg {
	width: 28px;
	height: 28px;

}
.eventsCardMain__text {
	padding: 30px 40px 40px;
}
.eventsCardMain__subtitle {
	font-size: 0
}
.eventsCardMain__subtitle span {
	display: inline-block;
	font-size: 10px;
	font-weight: 500;
	line-height: 28px;
	text-transform: uppercase;
	vertical-align: top;

}
.eventsCardMain__subtitle .eventsCardMain__icon {
	display: inline-block;
	vertical-align: top;
	margin-right: 10px;

}
.eventsCardMain__title {
	font-size: 1.35em;
	font-weight: 500;
	line-height: 1.3
}
.eventsCardMain__title span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.eventsCardMain__subtitle + .eventsCardMain__title {
	margin-top: 20px;
}
.eventsCardMain__date {
	font-size: 14px;
	color: #666666;
}
.eventsCardMain__title + .eventsCardMain__date {
	margin-top: 30px;
}
.events__item-bigSize {
	width: 66.66%;
}
.events__item-smallSize {
	width: 33.33%;
}
.events__item-imageRight .eventsCardMain__wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;

}
.events__item-imageRight .eventsCardMain__image {
	width: 48%;
	-webkit-box-ordinal-group: 3;
	    -ms-flex-order: 2;
	        order: 2;
	position: relative;

}
.events__item-imageRight .eventsCardMain__text {
	width: 52%;
	-webkit-box-ordinal-group: 2;
	    -ms-flex-order: 1;
	        order: 1;

}
.events__item-imageRight .eventsCardMain__text .eventsCardMain__title {
	padding-right: 30px;

}
.events__item-imageRight .eventsCardMain__icon {
	top: 43px;
	left: -30px;

}
.events__item-imageLeft .eventsCardMain__wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;

}
.events__item-imageLeft .eventsCardMain__image {
	width: 48%;
	position: relative;

}
.events__item-imageLeft .eventsCardMain__text {
	width: 52%;
	padding-left: 60px;

}
.events__item-imageLeft .eventsCardMain__icon {
	top: 43px;
	right: -30px;

}
.events__item-imageTop .eventsCardMain__wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;

}
.events__item-imageTop .eventsCardMain__image {
	width: 100%;
	height: 55%;

}
.events__item-imageTop .eventsCardMain__text {
	padding-top: 40px;

}
.events__item-imageTop .eventsCardMain__icon {
	bottom: -30px;
	left: 40px;

}
.events__item-imageBottom .eventsCardMain__wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;

}
.events__item-imageBottom .eventsCardMain__image {
	width: 100%;
	height: 55%;
	-webkit-box-ordinal-group: 3;
	    -ms-flex-order: 2;
	        order: 2;

}
.events__item-imageBottom .eventsCardMain__text {
	padding-bottom: 60px;
	-webkit-box-flex: 2;
	    -ms-flex-positive: 2;
	        flex-grow: 2;
	-webkit-box-ordinal-group: 2;
	    -ms-flex-order: 1;
	        order: 1;

}
.events__item-imageBottom .eventsCardMain__icon {
	top: -30px;
	left: 40px;

}
.events__item-video .eventsCardMain__image:before {
	content: '';
	display: block;
	width: 60px;
	height: 60px;
	overflow: hidden;
	background: url('/images/play.svg') no-repeat;
	background-size: 60px 60px;
	position: absolute;
	top: 43px;
	z-index: 10;

}
.events__item-imageLeft .events__item-video .eventsCardMain__image:before {
	right: 58px;

}
.events__item-imageRight .events__item-video .eventsCardMain__image:before {
	left: 58px;

}
.events__item-imageBottom .events__item-video .eventsCardMain__image:before {
	top: 48px;
	left: 40px;

}
.events__item-imageTop .events__item-video .eventsCardMain__image:before {
	top: auto;
	bottom: 48px;
	left: 40px;

}
.events__item-imageBottom.events__item-imageSmall .eventsCardMain__image {
	height: 30%;

}
/* ------------------------------------------------------------------------- */
/* Темы для оформления карточек новостей и событий */
.theme-red,
.theme-green,
.theme-green-2,
.theme-blue,
.theme-blue-2,
.theme-purple,
.theme-purple-2,
.theme-black,
.theme-orange {
	-webkit-transition: color 0.3s ease;
	transition: color 0.3s ease;
}
.theme-red .eventsCardMain__subtitle span,
	.theme-red:hover .eventsCardMain__title {
	color: #e83930;

}
.theme-red svg {
	fill: #e94037;

}
.theme-green .eventsCardMain__subtitle span,
	.theme-green:hover .eventsCardMain__title {
	color: #009353;

}
.theme-green svg {
	fill: #009353;

}
.theme-green-2 .eventsCardMain__subtitle span,
	.theme-green-2:hover .eventsCardMain__title {
	color: #47bd6a;

}
.theme-green-2 svg {
	fill: #47bd6a;

}
.theme-blue .eventsCardMain__subtitle span,
	.theme-blue:hover .eventsCardMain__title {
	color: #0534ff;

}
.theme-blue svg {
	fill: #055cff;

}
.theme-blue-2 .eventsCardMain__subtitle span,
	.theme-blue-2:hover .eventsCardMain__title {
	color: #4359e0;

}
.theme-blue-2 svg {
	fill: #4359e0;

}
.theme-purple .eventsCardMain__subtitle span,
	.theme-purple:hover .eventsCardMain__title {
	color: #7b35cb;

}
.theme-purple svg {
	fill: #7b35cb;

}
.theme-purple-2 .eventsCardMain__subtitle span,
	.theme-purple-2:hover .eventsCardMain__title {
	color: #7830ca;

}
.theme-purple-2 svg {
	fill: #7830ca;

}
.theme-black .eventsCardMain__subtitle span,
	.theme-black:hover .eventsCardMain__title {
	color: #000;

}
.theme-black svg {
	fill: #000;

}
.theme-orange .eventsCardMain__subtitle span,
	.theme-orange:hover .eventsCardMain__title {
	color: #fb7720;

}
.theme-orange svg {
	fill: #fb7720;

}
/* ------------------------------------------------------------------------- */
@media (min-width: 992px) {
	.mobile .eventsCardMain__title {
		font-size: 1.2em;

	}

}
@media (max-width: 991px) {
	.mobile .eventsCardMain__wrap {
		height: auto;
		padding-bottom:45px;
	}
	.mobile .events__item-bigSize,
		.mobile .events__item-smallSize {
		-webkit-box-flex: 1;
		    -ms-flex: 1 1 50%;
		        flex: 1 1 50%;
		min-width: 285px;

	}
	.mobile .eventsCardMain__text {
		padding-left: 28px;
		padding-right: 28px;

	}
	.mobile .eventsCardMain__title {
		font-size: 1.2em;

	}
	.mobile .events__item-imageTop .eventsCardMain__image {
		-webkit-box-ordinal-group: 3;
		    -ms-flex-order: 2;
		        order: 2;

	}
	.mobile .events__item-imageTop .eventsCardMain__text {
		-webkit-box-flex: 2;
		    -ms-flex-positive: 2;
		        flex-grow: 2;
		-webkit-box-ordinal-group: 2;
		    -ms-flex-order: 1;
		        order: 1;

	}
	.mobile .events__item-imageTop .eventsCardMain__icon {
		top: -30px;
		left: 40px;

	}
	.mobile .events__item-imageRight .eventsCardMain__wrap, .mobile .events__item-imageLeft .eventsCardMain__wrap {
		padding-top:45px;
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .events__item-imageRight .eventsCardMain__image, .mobile .events__item-imageLeft .eventsCardMain__image {
		width: 100%;
		position: relative;

	}
	.mobile .events__item-imageRight .eventsCardMain__text, .mobile .events__item-imageLeft .eventsCardMain__text {
		-webkit-box-flex: 2;
		    -ms-flex-positive: 2;
		        flex-grow: 2;
		width: 100%;

	}
	.mobile .events__item-imageRight .eventsCardMain__text .eventsCardMain__title, .mobile .events__item-imageLeft .eventsCardMain__text .eventsCardMain__title {
		padding-right: 0;

	}
	.mobile .events__item-imageRight .eventsCardMain__icon, .mobile .events__item-imageLeft .eventsCardMain__icon {
		top: -30px;
		left: 40px;

	}
	.mobile .events__item-imageRight .events__item-video .eventsCardMain__image:before, .mobile .events__item-imageLeft .events__item-video .eventsCardMain__image:before {
		display: none;

	}
	.mobile .eventsCardMain__image {

		/* max-height: 110px; */
		max-height: 165px;

	}

}
@media (max-width: 478px) {
	.mobile .events__item-bigSize,
		.mobile .events__item-smallSize {}
	.mobile .events__item {
		padding-top: 10px;
		padding-bottom: 10px;

	}
	.mobile .eventsCardMain__title {
		font-size: 1em;
		line-height: 1.3;

	}
	.mobile .eventsCardMain__subtitle + .eventsCardMain__title {
		margin-top: 15px;

	}
	.mobile .eventsCardMain__title + .eventsCardMain__date {
		margin-top: 20px;

	}
	.mobile .eventsCardMain__text,
		.mobile .events__item-imageBottom .eventsCardMain__text {
		padding-bottom: 60px;

	}

}
.blog__tagsFilter {
  margin: 60px 0 40px;
  padding-bottom: 50px;
  border-bottom: 1px solid #f0f3fc;
}
.tagsFilter {
  -webkit-transition: height .3s;
  transition: height .3s;
  overflow: hidden;
}
.tagsFilter__container {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -ms-flex-wrap: wrap;
      flex-wrap: wrap;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
}
.tagsFilter__item {
  position: relative;
  margin-bottom: 10px;
  padding: 15px;
  border-radius: 100px;
  background-color: #e5e5e5;
  overflow: hidden;
  cursor: pointer
}
.tagsFilter__item:hover {
	background: linear-gradient(45deg, #0da481, #87cd64);

}
.tagsFilter__item:not(:last-of-type) {
	margin-right: 10px;

}
.tagsFilter__item:before,
  .tagsFilter__item:after {
	content: '';
	display: block;
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	border-radius: 100px;

}
.tagsFilter__item:before {
	margin: 2px;
	background: #fff;
	z-index: 1;

}
.tagsFilter__item:after {
	width: 0;
	background: linear-gradient(45deg, #0da481, #87cd64);
	-webkit-transition: width .3s;
	transition: width .3s;
	z-index: 2;

}
.tagsFilter__item.active {
  background: linear-gradient(45deg, #0da481, #87cd64)
}
.tagsFilter__item.active .tagsFilter__itemBox span:first-of-type,
  .tagsFilter__item.active .tagsFilter__itemName {
	color: #fff;

}
.tagsFilter__item.active .tagsFilter__itemCount {
	opacity: 0;

}
.tagsFilter__item.active .tagsFilter__itemClose {
	display: block;

}
.tagsFilter__item.active:after {
	width: 100%;

}
.tagsFilter__itemBox {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  position: relative;
  font-size: 0.875em;
  font-weight: 500;
  z-index: 3
}
.tagsFilter__itemBox span:first-of-type {
	color: #0da481;
	-webkit-transition: color .3s;
	transition: color .3s;

}
.tagsFilter__itemName {
  margin-left: 5px;
  margin-right: 30px;
  color: #1f1f1f;
  -webkit-transition: color .3s;
  transition: color .3s;
}
.tagsFilter__itemCount {
  opacity: 1;
  color: #c5c5c5;
  -webkit-transition: color .3s;
  transition: color .3s;
}
.tagsFilter__itemClose {
  display: none;
  position: absolute;
  top: 50%;
  right: 0;
  -webkit-transform: translateY(-50%);
          transform: translateY(-50%)
}
.tagsFilter__itemClose .tagsFilter__itemCloseBars {
	position: relative;
	width: 15px;
	height: 15px;

}
.tagsFilter__itemClose .tagsFilter__itemCloseBars:before,
    .tagsFilter__itemClose .tagsFilter__itemCloseBars:after {
	content: '';
	position: absolute;
	top: 50%;
	left: 50%;
	display: block;
	width: 100%;
	height: 1px;
	background-color: #fff;

}
.tagsFilter__itemClose .tagsFilter__itemCloseBars:before {
	-webkit-transform: translate(-50%,-50%)
                  rotate(45deg);
	        transform: translate(-50%,-50%)
                  rotate(45deg);

}
.tagsFilter__itemClose .tagsFilter__itemCloseBars:after {
	-webkit-transform: translate(-50%,-50%)
                  rotate(-45deg);
	        transform: translate(-50%,-50%)
                  rotate(-45deg);

}
.blog__tagsBtn {
  height: 0;
  opacity: 0;
  margin-top: 0px;
  -webkit-transition: opacity .3s, margin-top .3s ease-in-out;
  transition: opacity .3s, margin-top .3s ease-in-out
}
.blog__tagsBtn.\--show {
	height: auto;
	margin-top: 60px;
	opacity: 1;

}
.blog__tagsBtn .buttonMore {
  margin: 0;
}
@media (max-width: 991px) {
	.mobile .blog__tagsFilter {
		margin: 40px 0;
		padding-bottom: 10px;

	}
	.mobile .blog__tagsBtn.\--show {
		margin-top: 40px;

	}

}
@media (max-width: 478px) {
	.mobile .tagsFilter {
		-webkit-transition: height .7s;
		transition: height .7s;

	}
	.mobile .blog__tagsBtn.\--show {
		margin-top: 30px;

	}

}
.cardsFilter {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -ms-flex-wrap: wrap;
      flex-wrap: wrap;
  -webkit-box-pack: end;
      -ms-flex-pack: end;
          justify-content: flex-end;
  margin: 50px 0;
}
.cardsFilter__item {
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
  position: relative;
  padding: 15px 20px 16px 18px;
  border-radius: 100px;
  overflow: hidden;
  cursor: pointer
}
.cardsFilter__item + .cardsFilter__item {
	margin-left: 12px;

}
.cardsFilter__item:before,
  .cardsFilter__item:after {
	content: '';
	display: block;
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	border-radius: 100px;

}
.cardsFilter__item:before {
	margin: 2px;
	background-color: #fff;
	z-index: 1;

}
.cardsFilter__item:after {
	width: 0;
	background-color: #009bfe;
	-webkit-transition: width .3s;
	transition: width .3s;
	z-index: 2;

}
.cardsFilter__item:hover {
	background-color: #009bfe;

}
.cardsFilter__item.active .cardsFilter__itemSort span {
	background-color: #fff;

}
.cardsFilter__item.active .cardsFilter__itemName {
	color: #fff;

}
.cardsFilter__item.active:after {
	width: 100%;

}
.cardsFilter__itemBox {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  position: relative;
  z-index: 3;
}
.cardsFilter__itemSort {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: justify;
      -ms-flex-pack: justify;
          justify-content: space-between;
  width: 20px;
  height: 16px;
  margin-right: 15px
}
.cardsFilter__itemSort span {
	width: 0%;
	height: 1px;
	background-color: #009bfe;
	-webkit-transition: width .3s, background-color .3s;
	transition: width .3s, background-color .3s;

}
.cardsFilter__itemSort.\--down span:first-of-type {
	width: 100%;

}
.cardsFilter__itemSort.\--down span:nth-of-type(2) {
	width: 80%;

}
.cardsFilter__itemSort.\--down span:nth-of-type(3) {
	width: 60%;

}
.cardsFilter__itemSort.\--down span:last-of-type {
	width: 40%;

}
.cardsFilter__itemSort.\--up span:first-of-type {
	width: 40%;

}
.cardsFilter__itemSort.\--up span:nth-of-type(2) {
	width: 60%;

}
.cardsFilter__itemSort.\--up span:nth-of-type(3) {
	width: 80%;

}
.cardsFilter__itemSort.\--up span:last-of-type {
	width: 100%;

}
.cardsFilter__itemName {
  font-size: 1.125em;
  font-weight: 500;
  color: #009bfe;
  -webkit-transition: color .3s;
  transition: color .3s;
}
@media (max-width: 991px) {
	.mobile .cardsFilter {
		-webkit-box-pack: justify;
		    -ms-flex-pack: justify;
		        justify-content: space-between;
		margin-bottom: 40px;

	}
	.mobile .cardsFilter__item + .cardsFilter__item {
		margin: 0px;

	}

}
@media (max-width: 478px) {
	.mobile .cardsFilter {
		-webkit-box-align: start;
		    -ms-flex-align: start;
		        align-items: flex-start;
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .cardsFilter__item + .cardsFilter__item {
		margin-top: 12px;
		margin-left: 0;

	}

}
[data-style="pageTitle"] {
	padding: 80px 0;
	background-color: #009cff;
	color: #fff;
	background-position: center center;
	background-size: cover;
	background-repeat: no-repeat;
	min-height: 365px
}
[data-style="pageTitle"] .sectionName {
	margin: 40px 0;

}
[data-style="pageTitle"] p {
	color: inherit;
	line-height: 1.8em;

}
@media (min-width: 992px) {
	.mobile [data-style="pageTitle"] {
		min-height: 292px;
		padding-top: 40px;

	}

}
@media (max-width: 991px) {
	.mobile [data-style="pageTitle"] {
		min-height: 195px;
		padding-top: 20px;

	}
	.mobile [data-style="pageTitle"] .sectionName {
		margin-top: 20px;
		margin-bottom: 20px;

	}

}
@media (max-width: 478px) {
	.mobile [data-style="breadcrumbs"] {
		display: none;

	}
	.mobile [data-style="pageTitle"] {
		min-height: 100px;

	}
	.mobile [data-style="pageTitle"] .sectionName {
		margin-top: 0;
		margin-bottom: 0;

	}
	.mobile .pageTitle__description {
		display: none;

	}

}
.cardNews__title {
  font-weight: 600;
  font-size: 28px;
  color: #2b2b2b;
  padding-left: 20px;
  margin-bottom: 26px;
}
.container .cardNews__title {
  padding-left: 0;
  font-size: 2em;
  font-weight: 900;
}
.cardNews__container {
  margin: 50px 0 30px;
}
.cardNews {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
      -ms-flex-direction: column;
          flex-direction: column;
  margin-bottom: 30px;
  -webkit-box-shadow: 0 3px 15px 0 rgba(0, 0, 0, .2);
          box-shadow: 0 3px 15px 0 rgba(0, 0, 0, .2);
}
.cardNews__pic {
  display: block;
  position: relative;
  overflow: hidden
}
.cardNews__pic:hover .cardNews__picImg {
	-webkit-transform: scale(1.1);
	        transform: scale(1.1);

}
.cardNews__pic:hover + .cardNews__info .cardNews__infoTitle a {
	background-size: 100% 1px;

}
.cardNews__picImg {
  height: 200px;
  background-size: cover;
  background-repeat: no-repeat;
  background-position: 50% 50%;
  -webkit-transition: -webkit-transform .3s;
  transition: -webkit-transform .3s;
  transition: transform .3s;
  transition: transform .3s, -webkit-transform .3s;
  will-change: transform;
}
.cardNews__info {
  padding: 25px 20px 30px;
}
.cardNews__infoAuthor-name,
.cardNews__infoDate,
.cardNews__infoTitle,
.cardNews__infoDescription {
  color: #221F1F;
}
.cardNews__infoAuthor-name,
.cardNews__infoDate,
.cardNews__infoIcons-count {
  font-size: 0.875em;
}
.cardNews__infoAuthor-name,
.cardNews__infoDescription,
.cardNews__infoTag {
  font-weight: 500;
}
.cardNews__infoAuthor {
  margin: 0 0 10px;
}
.cardNews__infoAuthor-icon {
  margin-right: 8px;
  width: 13px;
  height: 16px
}
.cardNews__infoAuthor-icon svg {
	fill: none;
	stroke: #231f20;
	stroke-width: 1.1px;
	stroke-miterlimit: 10;

}
.cardNews__infoAuthor-name span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.cardNews__infoAuthor-name:hover span {
	background-size: 100% 1px;

}
.cardNews__infoAuthor-icon,
.cardNews__infoAuthor-name {
  display: inline-block;
  vertical-align: middle;
}
.cardNews__infoDate {
  margin: 10px 0;
}
.cardNews__infoTitle {
  margin: 10px 0
}
.cardNews__infoTitle a {
	font-size: 1.25em;
	font-weight: 600;

}
.cardNews__infoDescription {
  margin: 10px 0 20px;
  font-size: 1em;
}
.cardNews__infoTags {
  margin: 20px 0 30px;
}
.cardNews__infoTag {
  font-size: 0.75em;
  text-decoration: underline;
  color: #9c9c9c
}
.cardNews__infoTag:not(:last-child) {
	margin-right: 10px;

}
.cardNews__infoIcons {
  margin: 30px 0 0;
}
/* --- Вариации карточки --- */
.cardNews.reverse.vertical {
  -webkit-box-orient: vertical;
  -webkit-box-direction: reverse;
      -ms-flex-direction: column-reverse;
          flex-direction: column-reverse;
}
.cardNews.reverse.horizontal {
  -webkit-box-orient: horizontal;
  -webkit-box-direction: reverse;
      -ms-flex-direction: row-reverse;
          flex-direction: row-reverse
}
.cardNews.reverse.horizontal .cardNews__pic {
	min-width: calc(50% + 15px);

}
.cardNews.reverse.horizontal .cardNews__picImg {
	height: auto;
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;

}
.cardNews.horizontal {
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
      -ms-flex-direction: row;
          flex-direction: row
}
.cardNews.horizontal .cardNews__pic {
	min-width: calc(50% + 15px);

}
.cardNews.horizontal .cardNews__picImg {
	height: auto;
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;

}
.cardNews.color-green .cardNews__infoAuthor-icon svg {
	fill: none;
	stroke: #009353;

}
.cardNews.color-green .cardNews__pic:hover + .cardNews__info .cardNews__infoTitle a {
	color: #009353;

}
.cardNews.color-green .cardNews__infoTitle:hover {
	color: #009353;

}
.cardNews.color-blue .cardNews__infoAuthor-icon svg {
	fill: none;
	stroke: #009cff;

}
.cardNews.color-blue .cardNews__pic:hover + .cardNews__info .cardNews__infoTitle a {
	color: #009cff;

}
.cardNews.color-blue .cardNews__infoTitle:hover {
	color: #009cff;

}
.cardNews.withoutShadow {
  -webkit-box-shadow: none;
          box-shadow: none;
}
.cardNews.theme-blue .cardNews__pic, .cardNews.theme-green .cardNews__pic {
	display: none;

}
.cardNews.theme-blue .cardNews__infoAuthor-icon svg, .cardNews.theme-green .cardNews__infoAuthor-icon svg {
	fill: none;
	stroke: #fff;

}
.cardNews.theme-blue .cardNews__infoAuthor-name,
  .cardNews.theme-blue .cardNews__infoDate,
  .cardNews.theme-blue .cardNews__infoTitle,
  .cardNews.theme-blue .cardNews__infoDescription,
  .cardNews.theme-blue .cardNews__infoTags a,
  .cardNews.theme-blue .articleStats__count,
  .cardNews.theme-green .cardNews__infoAuthor-name,
  .cardNews.theme-green .cardNews__infoDate,
  .cardNews.theme-green .cardNews__infoTitle,
  .cardNews.theme-green .cardNews__infoDescription,
  .cardNews.theme-green .cardNews__infoTags a,
  .cardNews.theme-green .articleStats__count {
	color: #fff;

}
.cardNews.theme-blue .cardNews__infoDescription, .cardNews.theme-green .cardNews__infoDescription {
	opacity: .6;

}
.cardNews.theme-blue .articleStats__svg, .cardNews.theme-green .articleStats__svg {
	fill: none;
	stroke: #fff;

}
.cardNews.theme-blue {
  background-color: #1c96e4;
}
.cardNews.theme-green {
  background: linear-gradient(45deg, #1aa87e, #7ac967);
}
.cardNews.w1x3 {
  width: calc(33.33333% - 20px);
}
.cardNews.w2x3 {
  width: calc(66.66667% - 10px);
}
.cardNews__container + .pagination {
  margin: 0 0 90px;
}
@media (max-width: 991px) {
	.mobile .cardNews__container {
		margin: 50px 0 30px;

	}
	.mobile .cardNews__title + .cardNews__container {
		margin-top: 15px;

	}
	.mobile .cardNews.w1x3,
    .mobile .cardNews.theme-blue.w1x3,
    .mobile .cardNews.theme-green.w1x3 {
		width: calc(50% - 20px);

	}
	.mobile .cardNews.w2x3 {
		width: 100%;

	}
	.mobile .cardNews__container + .pagination {
		margin-bottom: 70px;

	}

}
@media (max-width: 478px) {
	.mobile .container .cardNews__title {
		font-size: 1.5em;

	}
	.mobile .cardNews__title {
		font-size: 24px;
		padding-left: 0;
		margin-bottom: 15px;

	}
	.mobile .cardNews__infoTitle a {
		font-size: 16px;

	}
	.mobile .cardNews__infoDescription {
		font-size: 14px;

	}
	.mobile .cardNews.w1x3,
    .mobile .cardNews.w2x3,
    .mobile .cardNews.theme-blue.w1x3,
    .mobile .cardNews.theme-green.w1x3 {
		width: 100%;

	}
	.mobile .cardNews.horizontal,
    .mobile .cardNews.reverse.vertical,
    .mobile .cardNews.reverse.horizontal {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .cardNews__container + .pagination {
		margin-bottom: 50px;

	}

}
.articleStats {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-box-pack: end;
      -ms-flex-pack: end;
          justify-content: flex-end;
}
.articleStats__item + .articleStats__item {
	margin-left: 15px;

}
.articleStats__icon,
.articleStats__count {
  display: inline-block;
  vertical-align: middle;
}
.articleStats__count {
  margin-left: 5px;
  color: #231f20;
}
.articleStats__svg {
  fill: none;
  stroke: #231f20;
  stroke-miterlimit: 10;
}
/* .articleStats__svg--repost {
  clip-path: url(#SVGID_2_);
} */
.alphabet__array {
	display: -webkit-inline-box;
	display: -ms-inline-flexbox;
	display: inline-flex;
	-ms-flex-wrap: wrap;
	    flex-wrap: wrap;
	padding: 10px 2px;
	overflow: hidden;
}
.alphabet__item {
	width: 25px;
	height: 25px;
	margin: 0 2px;
	text-align: center;
	border-radius: 50%;
	cursor: pointer;
	-webkit-user-select: none;
	   -moz-user-select: none;
	    -ms-user-select: none;
	        user-select: none;
	-webkit-transition: -webkit-box-shadow .25s;
	transition: -webkit-box-shadow .25s;
	transition: box-shadow .25s;
	transition: box-shadow .25s, -webkit-box-shadow .25s;
}
.alphabet__item:not(.alphabet__item--disabled):hover {
  -webkit-box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);
          box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);
}
.alphabet__item--disabled {
	cursor: default
}
.alphabet__item--disabled .alphabet__link {
	text-decoration: none;
	color: #d6d6d6;
	cursor: default;

}
.alphabet__item--active {
	background: #009cff;
}
.alphabet__item--active .alphabet__link {
	color: #fff;
}
.alphabet__link {
	color: #009cff;
	font-size: 17px;
	line-height: 25px;
	font-weight: 500;
	text-transform: uppercase;
}
.forPhoto {
	position: fixed;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	top:0;
	z-index: 1000;
	background: rgba(0, 0, 0, .9);
	height: 100%;
	width: 100%;
}
.gallery-top {
	width: 100%;
	height: 12vh;
	border-bottom: 1px solid rgba(255, 255, 255, .2)
}
.gallery-top .swiper-wrapper {
	height: auto;

}
.gallery-top .swiper-slide {
	max-width: 140px;
	max-height: 12vh;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;

}
.gallery-top .swiper-slide-active {
	background: linear-gradient(45deg, #0da481 0%, #0da481 30%, #3bcf56 70%, #3bcf56 100%);

}
.forPhoto__slide {
	min-width: 40%;
	min-height: 50%;
	background: rgba(0, 0, 0, .5);
	border-radius: 3px;
	position: relative;
	cursor: pointer;

	display: -webkit-box;

	display: -ms-flexbox;

	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;

	max-width: 90%;
	max-height: 90%
}
.forPhoto__slide img {
	max-width: 100%;
	max-height: 100%;

}
.gallery-bottom {
	width: 100%;
	height: 88vh
}
.gallery-bottom .swiper-slide {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;

}
.gallery-bottom img {
	max-height: 79vh;
	max-width: 90vw;

}
@media (max-width: 480px) {
	.gallery-bottom {
		font-size: .75rem
	}
	.gallery-bottom .forPhoto__slide {
		min-width: 80%;
		min-height: 80%;

	}
}
.forPhoto__content {
	position: absolute;
	color: #fff;
	width: 100%;
	padding: 20px;
	bottom: 0;
	left: 0;
	background: rgba(0, 0, 0, .5);
}
.forPhoto__close {
	color:#fff;
	position: absolute;
	right: 2vh;
	top: 2vh;
	z-index: 100;
	width: 40px;
	height: 40px;
	border-radius: 100px;
	border: 3px solid currentColor;
	-webkit-transition: color .12s ease;
	transition: color .12s ease;
	cursor: pointer
}
.forPhoto__close:hover {
	color: rgba(255, 255, 255, .7);
}
.forPhoto__close:before,
	.forPhoto__close:after {
	content:'';
	width: calc(100% - 12px);
	height: 3px;
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	margin: auto;
	background: currentColor;
}
.forPhoto__close:before {
  -webkit-transform: rotate(45deg);
          transform: rotate(45deg);
}
.forPhoto__close:after {
  -webkit-transform: rotate(-45deg);
          transform: rotate(-45deg);
}
.PDFViewer .modal__close {
	padding: 8px 20px;
	border-radius: 3px;
	color: #fff;
	text-transform: uppercase;
	font-weight: 500;
	cursor: pointer;
	background: linear-gradient(45deg, #0da481 0%, #0da481 30%, #3bcf56 70%, #3bcf56 100%);

}
.PDFViewer .modal__close:hover {
	color: inherit;

}
.PDFViewer .fullScreen {
	padding: 7px 20px;
	border: 1px solid;
	cursor: pointer;

}
.PDFViewer .fullScreen:hover {
	background:#333;
	color:#fff;

}
[data-ball-click] {
	position: fixed;
	overflow: hidden;
	left: 0;
	top:0;
	display:none;
	border-radius: 10000px;
	z-index: 101;
}
[data-ball-click] > div {
	width: 100vw;
	height: 100vh;
	position:relative;
	left:0;
	top:0;
	background: url(../images/videoFace-blank.png) no-repeat;
	background-size: cover;
}
[data-ball-click] iframe {
	position: absolute;
}
[data-ball-click] .container {
	/* padding-left: 0 !important;
	padding-right: 0 !important; */
	position: relative;
}
[data-ball-close] {
	color:#fff;
	position: absolute;
	right: 15px;
	top: 120px;
	z-index: 100;
	width: 40px;
	height: 40px;
	border-radius: 100px;
	border: 3px solid currentColor;
	-webkit-transition: color .12s ease;
	transition: color .12s ease;
	cursor: pointer
}
[data-ball-close]:hover {
	color: rgba(255, 255, 255, .7);

}
[data-ball-close]:before,
	[data-ball-close]:after {
	content:'';
	width: calc(100% - 12px);
	height: 3px;
	position: absolute;
	top: 0;
	right: 0;
	left: 0;
	bottom: 0;
	margin: auto;
	background: currentColor;

}
[data-ball-close]:before {
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);

}
[data-ball-close]:after {
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);

}
[data-ball-click] .video {
	height: 100%;
	width: 100%;
	position: absolute;
	top: 0;
	left: 0;
	-o-object-fit: cover;
	   object-fit: cover;
}
[data-ball-click] .video__progress {
	z-index: 100;
	position: fixed;
	bottom: 0;
	height: 10px;
	background: #fff;
	width: 100%;
	cursor: pointer;
}
[data-ball-click] .video__progress-actual {
	height:100%;
	position: relative;
	background: #ffae00;
	width:0%;
}
[data-ball-click] .video__controls {
	position: absolute;
	bottom: 15px;
	right: 15px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center
}
[data-ball-click] .video__controls > * {
	margin: 10px;
	cursor: pointer;
	opacity: .7;
	-webkit-transition: opacity .19s ease;
	transition: opacity .19s ease;

}
[data-ball-click] .video__controls > *:hover {
	opacity: 1;

}
[data-ball-click] .video__stop {
	width: 30px;
	height: 30px;
	background: url(../images/icon-pause1.svg) 50% 50%/contain no-repeat
}
[data-ball-click] .video__stop.video__stop--stopped {
	background: url(../images/icon-play1.svg) 50% 50%/contain no-repeat;

}
[data-ball-click] .video__mute {
  position: relative;
	width: 30px;
	height: 30px;
	background: url(../images/icon-mute1.svg) 50% 50%/contain no-repeat
}
[data-ball-click] .video__mute:after {
	content:'';
	width:0%;
	height: 1px;
	background: #fff;
	position: absolute;
	top:0;
	left:0;
	right: 0;
	bottom: 0;
	margin: auto;
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);
	-webkit-transition: all .3s ease;
	transition: all .3s ease;

}
[data-ball-click] .video__mute.video__mute--muted {
	opacity: 1;

}
[data-ball-click] .video__mute.video__mute--muted:after {
	width: 120%;

}
[data-ball-click] .video__time {
	color: #fff
}
[data-ball-click] .video__time .video__actualTime-minutes,
	[data-ball-click] .video__time .video__actualTime-seconds,
	[data-ball-click] .video__time .video__fullTime-minutes,
	[data-ball-click] .video__time .video__fullTime-seconds {
	width: 21px;
	display: inline-block;

}
.news__section .sectionName {
	padding-left: 15px;
	padding-right: 15px;
	margin-bottom: 30px;

}
.news__array {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	    flex-wrap: wrap;
	margin: 30px 0
}
.news__array .newsCard {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: stretch;
	    -ms-flex-align: stretch;
	        align-items: stretch;
	padding: 15px;

	/* flex: 1 1 25%; */

	/* min-width: 285px; */
	width: 25%;

	/* min-height: 336px; */
	min-height: 320px;

}
.news__array .newsCard.x2 {
	width: 50%;

	/* flex-basis: 50%; */

}
.news__array .newsCard.x2 .newsCard__source:before {
	content: attr(data-title);
	padding-right: 0.25em;
	text-decoration: none;

}
.news__array .newsCard.x3 {
	width: 75%;

}
.news__array .newsCard.x4 {
	width: 100%;

}
.newsCard__wrap {
	/* display: block; */
	width: 100%;
	padding: 28px;
	/* min-height: 336px; */
	min-height: 320px;
	background: #fff;
	position: relative;
  -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
          box-shadow: 0 0 20px rgba(0, 0, 0, .25);

	display: -webkit-box;

	display: -ms-flexbox;

	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
}
.newsCard__image {
	margin: -28px -28px 0;
	min-height: 168px;
	position: relative;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	z-index: 0;
	/* align-items: stretch; */
	overflow: hidden
}
.newsCard__image > span {
	width: 100%;
	position: relative;
	background-repeat: no-repeat;
	background-size: cover;
	-webkit-transition: -webkit-transform 0.3s ease;
	transition: -webkit-transform 0.3s ease;
	transition: transform 0.3s ease;
	transition: transform 0.3s ease, -webkit-transform 0.3s ease;
	opacity: 0.6;

}
.newsCard__image:after {
	content: '';
	display: block;
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	z-index: -1;

}
.newsCard__image .newsCard__type-icon svg {
	fill: #fff;

	/* position: relative;
		z-index: 10; */

}
.newsCard__image .newsCard__type .newsCard__type-caption {
	color: #fff;

	/* position: relative;
		z-index: 10; */

}
.newsCard__image:hover > span {
	-webkit-transform: scale(1.1);
	        transform: scale(1.1);

}
.newsCard__image:hover ~ .newsCard__text .newsCard__head span {
	background-size: 100% 1px;

}
.newsCard__type {
	position: absolute;
	top: 32px;
	left: 25px;
	font-size: 0;
}
.newsCard__type-icon {
	display: inline-block;
	width: 28px;
	height: 28px;
	overflow: hidden;
	position: relative;
	vertical-align: top
}
.newsCard__type-icon svg {
	width: 28px;
	height: 28px;

}
.newsCard__type-caption {
	display: inline-block;
	padding-left: 13px;
	font-size: 10px;
	font-weight: 900;
	line-height: 32px;
	text-transform: uppercase;
	vertical-align: top;
}
.newsCard__date,
.newsCard__author {
	margin-bottom: 0.5em;
	color: #666666;
	font-size: 14px;
	font-weight: 500;
}
.newsCard__fileType {
	padding-left: 0.5em
}
.newsCard__fileType:before {
	content: '|';
	color: #666666;
	padding-right: 0.5em;

}
.newsCard__image ~ .newsCard__text {
	margin-top: 25px;
}
.newsCard__text {
	margin-top: 58px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1
}
.newsCard__text div:last-child {
	margin-bottom: 0;

}
.newsCard__head {
	margin: 0.5em 0;
	font-size: 16px;
	font-weight: 500;
	line-height: 1.5
}
.newsCard__head span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.newsCard__head:hover span {
	background-size: 100% 1px;

}
.newsCard__source {
	display: inline-block;
	color: #666666;
	font-size: 14px;
	margin: 0.5em 0;
	/* & a {
		text-decoration: underline;
		transition: all 0.3s ease;
		&:hover {
			color: #000;
			text-decoration: none;
		}
	} */
}
.newsCard__location {
	color: #9c9c9c;
	font-size: 12px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1
}
.newsCard__location div {
	padding: 10px 0 5px;
	-ms-flex-item-align: end;
	    align-self: flex-end;

}
.newsCard__audioFile {
	margin: 20px 0 10px;
	height: 26px;
}
.newsCard__tag {
	margin: 0.5em 0 0;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1
}
.newsCard__tag ul {
	-ms-flex-item-align: end;
	    align-self: flex-end;

}
.newsCard__group {}
.newsCard__video .newsCard__image:before {
	content: '';
	display: block;
	width: 45px;
	height: 45px;
	overflow: hidden;
	background: url('/images/play.svg') no-repeat;
	background-size: 45px 45px;
	position: absolute;
	bottom: 25px;
	left: 25px;
	z-index: 10;

}
.newsCard__event {
	position: relative
}
.newsCard__event .newsCard__image ~ .newsCard__text .newsCard__date {
	margin: 0 30px;
	position: absolute;
	top: 98px;
	left: 0;
	color: #fff;
	font-size: 18px;
	font-weight: 500;
	line-height: 1.35;

}
.newsCard__event .newsCard__image ~ .newsCard__text .newsCard__head {
	margin-top: 0;

}
.newsCard__event .add-to-calendar {
	display: block;
	width: 27px;
	height: 27px;
	border: 1px solid #dcdcdc;
	border-radius: 50%;
	position: absolute;
	bottom: 26px;
	right: 20px;
	z-index: 20;
	-webkit-transition: background-color 0.3s ease, color 0.3s ease-in-out;
	transition: background-color 0.3s ease, color 0.3s ease-in-out;

}
.newsCard__event .add-to-calendar:hover {
	border-color: #7b35cb;
	background-color: #7b35cb;

}
.newsCard__event .add-to-calendar > span {
	height: 28px;
	padding: 0 10px;
	border-radius: 14px;
	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	        box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	background: #fff;
	position: absolute;
	right: -16px;
	color: #353535;
	font-size: 14px;
	line-height: 28px;
	white-space: nowrap;
	top: -47px;
	visibility: hidden;
	opacity: 0;
	-webkit-transition: opacity 0.25s ease,
						top 0.25s ease;
	transition: opacity 0.25s ease,
						top 0.25s ease;

}
.newsCard__event .add-to-calendar > span:before {
	content: '';
	display: block;
	width: 6px;
	height: 6px;
	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	        box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	overflow: hidden;
	background: #fff;
	position: absolute;
	bottom: -3px;
	right: 25px;
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);

}
.newsCard__event .add-to-calendar > span:after {
	content: '';
	display: block;
	width: 25px;
	height: 7px;
	overflow: hidden;
	background: #fff;
	position: absolute;
	bottom: 0px;
	right: 15px;

}
.newsCard__event .add-to-calendar:hover span  {
	visibility: visible;
	opacity: 1;
	top: -40px;

}
.newsCard__event .add-to-calendar:before,
		.newsCard__event .add-to-calendar:after {
	content: '';
	display: block;
	overflow: hidden;
	position: absolute;
	background: #7b35cb;

}
.newsCard__event .add-to-calendar:before {
	margin: 12px 7px;
	width: 11px;
	height: 1px;

}
.newsCard__event .add-to-calendar:after {
	margin: 7px 12px;
	width: 1px;
	height: 11px;

}
.newsCard__event .add-to-calendar:hover:before,
		.newsCard__event .add-to-calendar:hover:after {
	background: #fff;

}
.newsCard__photo .newsCard__image .newsCard__type {
	top: auto;
	bottom: 25px;
	left: 25px;

}
.newsCard__photo .newsCard__type-caption {
	font-size: 28px;
	font-weight: 500;
	line-height: 1;

}
.newsCard--view1.x2 .newsCard__wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: horizontal;
	-webkit-box-direction: normal;
	    -ms-flex-direction: row;
	        flex-direction: row;

}
.newsCard--view1.x2 .newsCard__image {
	width: 50%;
	margin: -28px 0 -28px -28px;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;

}
.newsCard--view1.x2 .newsCard__image + .newsCard__text {
	width: 50%;
	margin-top: 0;
	padding-left: 30px;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;

}
.newsCard--view2 {
	min-height: 295px !important
}
.newsCard--view2 .newsCard__wrap {
	min-height: 295px;

}
.newsCard--view2 {

	/* & .newsCard__source {
		font-size: 12px;
	} */

}
.newsCard--view2 .newsCard__group {}
.newsCard--view2 .newsCard__image {
	margin: 0;
	min-height: auto;

}
.newsCard--view2 .newsCard__image img {
	width: auto;
	height: auto;
	margin-top: 60px;
	margin-bottom: 0;
	margin-left: auto;
	margin-right: auto;

}
.newsCard--view2 .newsCard__image + .newsCard__text {
	margin-top: 30px;

}
.newsCard--view2 .newsCard__image:after {
	display: none;

}
.newsCard--view2 .newsCard__text {
	margin-top: 45px;

}
.newsCard--view2.x2 .newsCard__group {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: horizontal;
	-webkit-box-direction: normal;
	    -ms-flex-direction: row;
	        flex-direction: row;

}
.newsCard--view2.x2 .newsCard__image {
	min-height: 172px;
	width: 50%;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-ms-flex-negative: 0;
	    flex-shrink: 0;

}
.newsCard--view2.x2 .newsCard__image img {
	margin-top: 30px;

}
.newsCard--view2.x2 .newsCard__image + .newsCard__text {
	margin-top: 10px;
	margin-left: 15px;

}
/* ------------------------------------------------------------------------- */
.newsPortfolio {
  width: calc(25% - 30px);
  margin: 15px;
	padding: 12px 0;
}
.newsPortfolio__list li {
	margin: 42px 0;

}
.newsPortfolio__list li:first-child {
	margin-top: 0;

}
.newsPortfolio__list li:last-child {
	margin-bottom: 0;

}
.newsPortfolio__link {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
}
.newsPortfolio__img {
	-ms-flex-negative: 0;
	    flex-shrink: 0;
	width: 48px;
	height: 48px;
	overflow: hidden;
	border-radius: 50%;
	background-color: #fff;
	-webkit-transition: background-color 0.3s ease;
	transition: background-color 0.3s ease;
  -webkit-box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);
          box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16)
}
.newsPortfolio__img svg {
	width: 48px;
	height: 48px;
	fill: #009cff;
	-webkit-transition: fill 0.3s ease;
	transition: fill 0.3s ease;

}
.newsPortfolio__title {
	padding-left: 15px;
	color: #221F1F;
	font-size: 16px;
	font-weight: 500;
	line-height: 1.5;
	-webkit-transition: color 0.3 ease;
	transition: color 0.3 ease
}
.newsPortfolio__title span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.newsPortfolio__link:hover .newsPortfolio__img {
	background-color: #009cff;

}
.newsPortfolio__link:hover .newsPortfolio__img svg {
	fill: #fff;

}
.newsPortfolio__link:hover .newsPortfolio__title {
	color: #009cff;

}
.newsPortfolio__link:hover .newsPortfolio__title span {
	background-size: 100% 1px;

}
/* ------------------------------------------------------------------------- */
/* Темы для оформления карточек новостей и событий */
.theme-red,
.theme-green,
.theme-green-2,
.theme-blue,
.theme-blue-2,
.theme-purple,
.theme-purple-2,
.theme-black,
.theme-orange {
	/* transition: color 0.3s ease; */
}
.theme-red a.newsCard__head:hover,
	.theme-red a:hover ~ .newsCard__text .newsCard__head,
	.theme-red .newsCard__type-caption,
	.theme-red .eventsCard__subtitle span,
	.theme-red:hover .eventsCard__title {
	color: #e83930;

}
.theme-red svg {
	fill: #e94037;

}
.theme-red .newsCard__image:after {
	background-color: #e83930;

}
.theme-green a.newsCard__head:hover,
	.theme-green a:hover ~ .newsCard__text .newsCard__head,
	.theme-green .newsCard__type-caption,
	.theme-green .eventsCard__subtitle span,
	.theme-green:hover .eventsCard__title {
	color: #009353;

}
.theme-green svg {
	fill: #009353;

}
.theme-green .newsCard__image:after {
	background-color: #0ba380;

}
.theme-green-2 a.newsCard__head:hover,
	.theme-green-2 a:hover ~ .newsCard__text .newsCard__head,
	.theme-green-2 .newsCard__type-caption,
	.theme-green-2 .eventsCard__subtitle span,
	.theme-green-2:hover .eventsCard__title {
	color: #47bd6a;

}
.theme-green-2 svg {
	fill: #47bd6a;

}
.theme-green-2 .newsCard__image:after {
	background-color: #353835;

}
.theme-blue a.newsCard__head:hover,
	.theme-blue a:hover ~ .newsCard__text .newsCard__head,
	.theme-blue .newsCard__type-caption,
	.theme-blue .eventsCard__subtitle span,
	.theme-blue:hover .eventsCard__title {
	color: #0534ff;

}
.theme-blue svg {
	fill: #055cff;

}
.theme-blue .newsCard__image:after {
	background-color: #3b5fd7;

}
.theme-blue-2 a.newsCard__head:hover,
	.theme-blue-2 a:hover ~ .newsCard__text .newsCard__head,
	.theme-blue-2 .newsCard__type-caption,
	.theme-blue-2 .eventsCard__subtitle span,
	.theme-blue-2:hover .eventsCard__title {
	color: #4359e0;

}
.theme-blue-2 svg {
	fill: #4359e0;

}
.theme-blue-2 .newsCard__image:after {
	background-color: #353835;

}
.theme-purple a.newsCard__head:hover,
	.theme-purple a:hover ~ .newsCard__text .newsCard__head,
	.theme-purple .newsCard__type-caption,
	.theme-purple .eventsCard__subtitle span,
	.theme-purple:hover .eventsCard__title {
	color: #7b35cb;

}
.theme-purple svg {
	fill: #7b35cb;

}
.theme-purple .newsCard__image:after {
	background-color: #d200ff;

}
.theme-purple-2 a.newsCard__head:hover,
	.theme-purple-2 a:hover ~ .newsCard__text .newsCard__head,
	.theme-purple-2 .newsCard__type-caption,
	.theme-purple-2 .eventsCard__subtitle span,
	.theme-purple-2:hover .eventsCard__title {
	color: #7830ca;

}
.theme-purple-2 svg {
	fill: #7830ca;

}
.theme-purple-2 .newsCard__image:after {
	background-color: #353835;

}
.theme-black a.newsCard__head:hover,
	.theme-black a:hover ~ .newsCard__text .newsCard__head,
	.theme-black .newsCard__type-caption,
	.theme-black .eventsCard__subtitle span,
	.theme-black:hover .eventsCard__title {
	color: #000;

}
.theme-black svg {
	fill: #000;

}
.theme-black .newsCard__image:after {
	background-color: #353835;

}
.theme-orange a.newsCard__head:hover,
	.theme-orange a:hover ~ .newsCard__text .newsCard__head,
	.theme-orange .newsCard__type-caption,
	.theme-orange .eventsCard__subtitle span,
	.theme-orange:hover .eventsCard__title {
	color: #fb7720;

}
.theme-orange svg {
	fill: #fb7720;

}
.theme-orange .newsCard__image:after {
	background-color: #fb7720;

}
/* ------------------------------------------------------------------------- */
@media (max-width: 1279px) {
	.mobile {}

}
.mobile {

	/* подчеркиваные и цветные ссылки для тач устройств */

}
.mobile .theme-red a.newsCard__head,
		.mobile .theme-red .eventCard__head,
		.mobile .theme-red .eventsCard__title,
		.mobile .theme-red .eventsCardMain__title {
	color: #e83930;

}
.mobile .theme-green a.newsCard__head,
		.mobile .theme-green .eventCard__head,
		.mobile .theme-green .eventsCard__title,
		.mobile .theme-green .eventsCardMain__title {
	color: #009353;

}
.mobile .theme-green-2 a.newsCard__head,
		.mobile .theme-green-2 .eventCard__head,
		.mobile .theme-green-2 .eventsCard__title,
		.mobile .theme-green-2 .eventsCardMain__title {
	color: #47bd6a;

}
.mobile .theme-blue a.newsCard__head,
		.mobile .theme-blue .eventCard__head,
		.mobile .theme-blue .eventsCard__title,
		.mobile .theme-blue .eventsCardMain__title {
	color: #0534ff;

}
.mobile .theme-blue-2 a.newsCard__head,
		.mobile .theme-blue-2 .eventCard__head,
		.mobile .theme-blue-2 .eventsCard__title,
		.mobile .theme-blue-2 .eventsCardMain__title {
	color: #4359e0;

}
.mobile .theme-purple a.newsCard__head,
		.mobile .theme-purple .eventCard__head,
		.mobile .theme-purple .eventsCard__title,
		.mobile .theme-purple .eventsCardMain__title {
	color: #7b35cb;

}
.mobile .theme-purple-2 a.newsCard__head,
		.mobile .theme-purple-2 .eventCard__head,
		.mobile .theme-purple-2 .eventsCard__title,
		.mobile .theme-purple-2 .eventsCardMain__title {
	color: #7830ca;

}
.mobile .theme-black a.newsCard__head,
		.mobile .theme-black .eventCard__head,
		.mobile .theme-black .eventsCard__title,
		.mobile .theme-black .eventsCardMain__title {
	color: #000;

}
.mobile .theme-orange a.newsCard__head,
		.mobile .theme-orange .eventCard__head,
		.mobile .theme-orange .eventsCard__title,
		.mobile .theme-orange .eventsCardMain__title {
	color: #fb7720;

}
.mobile .newsPortfolio__title {
	color: #009cff;

}
.mobile .newsCard__head span, .mobile .eventCard__head span, .mobile .eventsCard__title span, .mobile .eventsCardMain__title span, .mobile .newsPortfolio__title span {
	background-size: 100% 1px;

}
.mobile {

	/*  */

}
.mobile .newsCard--view1.x2 .newsCard__wrap {
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	padding: 0;

}
.mobile .newsCard--view1.x2 .newsCard__image {
	width: 100%;
	margin: 0;

}
.mobile .newsCard--view1.x2 .newsCard__text {
	width: 100%;
	padding: 28px;

}
.mobile .newsCard--view2.x2 .newsCard__group {
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;

}
.mobile .newsCard--view2.x2 .newsCard__image + .newsCard__text {
	margin-top: 20px;
	margin-left: 0;

}
.mobile .newsCard__audio .newsCard__group {
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;

}
.mobile .newsCard__audio .newsCard__image + .newsCard__text {
	margin-top: 20px;
	margin-left: 0;

}
.mobile .newsPortfolio {

	/* width: 33.33%; */
	width: calc(33.33333% - 30px);
	margin: 15px;

}
@media (min-width: 992px) {
	.mobile .news__array .newsCard,
			.mobile .news__array .newsCard.x2 {
		width: 33.33%;

	}
	.mobile .news__array .newsCard.x3,
			.mobile .news__array .newsCard.x4 {
		width: 100%;

	}
	.mobile .news__array .newsCard.x2 {}

}
@media (max-width: 991px) {
	.mobile .news__array .newsCard {
		width: 50%;

		/* @apply --width1x2; */

	}
	.mobile .news__array .newsCard.x2 {

		/* flex-basis: 100%; */
		width: 50%;

		/* @apply --width1x2; */

	}
	.mobile .news__array .newsCard.x3,
			.mobile .news__array .newsCard.x4 {
		width: 100%;

		/* @apply --width; */

	}
	.mobile .newsPortfolio {
		width: calc(50% - 30px);
		margin: 15px;

	}

}
@media (max-width: 478px) {
	.mobile .news__array .newsCard {
		padding-top: 10px;
		padding-bottom: 10px;

	}
	.mobile .news__array .newsCard,
			.mobile .news__array .newsCard.x2,
			.mobile .news__array .newsCard.x3,
			.mobile .news__array .newsCard.x4 {
		width: 100%;

		/* @apply --width; */

		/* flex-basis: 100%; */

	}
	.mobile .newsPortfolio {
		width: calc(100% - 30px);
		margin: 15px;

	}
	.mobile .newsPortfolio__list {
		display: -webkit-box;
		display: -ms-flexbox;
		display: flex;
		-ms-flex-wrap: wrap;
		    flex-wrap: wrap;
		margin: -15px;

	}
	.mobile .newsPortfolio__list li {
		display: -webkit-box;
		display: -ms-flexbox;
		display: flex;
		width: calc(50% - 30px);
		margin: 15px;
		min-width: 260px;
		-webkit-box-flex: 1;
		    -ms-flex-positive: 1;
		        flex-grow: 1;

	}

}
/* ------------------------------------------------------------------------- */
.newsFilter {
	margin: 0;
	font-size: 0
}
.newsFilter li {
	display: inline-block;
	padding: 6px 3px;
	padding-right: 18px;
	font-size: 16px;
	font-weight: 500;
	color: #221F1F;

}
.newsFilter li:last-child {
	padding-right: 0;

}
.newsFilter li.newsFilter__hiddenFilter {
	visibility: hidden;
	overflow: hidden;
	width: 0;
	height: 0;
	padding: 0;
	margin: 0;

}
.newsFilter label {
	display: block;
	cursor: pointer;

}
.newsFilter input {
	display: none;

}
.newsFilter .newsFilter__link,
	.newsFilter .newsFilter__label {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;

}
.newsFilter .newsFilter__link:hover .newsFilter__title, .newsFilter .newsFilter__label:hover .newsFilter__title {
	border-bottom: 1px dashed currentColor;

}
.newsFilter .newsFilter__icon {
	display: block;
	width: 28px;
	height: 28px;
	margin-right: 10px;
	border-radius: 50%;
	-webkit-box-shadow: 0 0 9px rgba(0, 0, 0, .21);
	        box-shadow: 0 0 9px rgba(0, 0, 0, .21);
	overflow: hidden;
	background-color: #fff;
	position: relative;
	-webkit-transition: all 0.3s ease;
	transition: all 0.3s ease;

}
.newsFilter .newsFilter__icon svg {
	display: block;
	width: 17px;
	height: 17px;
	position: absolute;
	top: 50%;
	left: 50%;
	-webkit-transform: translate(-50%, -50%);
	        transform: translate(-50%, -50%);
	-webkit-transition: color 0.3s ease;
	transition: color 0.3s ease;

}
.newsFilter input:checked ~ .newsFilter__icon {
	-webkit-box-shadow: none;
	        box-shadow: none;

}
.newsFilter .newsFilter__title {
	display: block;
	border-bottom: 1px solid transparent;
	-webkit-transition: all 0.3s ease;
	transition: all 0.3s ease;

}
.newsFilter .theme-red svg {
	fill: #e83930;

}
.newsFilter .theme-red input:checked ~ .newsFilter__icon {
	background: #e83930;

}
.newsFilter .theme-red input:checked ~ .newsFilter__icon svg {
	fill: #fff;

}
.newsFilter .theme-red:hover span,
		.newsFilter .theme-red input:checked ~ .newsFilter__title {
	color: #e83930;

}
.newsFilter .theme-green svg {
	fill: #009353;

}
.newsFilter .theme-green input:checked ~ .newsFilter__icon {
	background: #009353;

}
.newsFilter .theme-green input:checked ~ .newsFilter__icon svg {
	fill: #fff;

}
.newsFilter .theme-green:hover span,
		.newsFilter .theme-green input:checked ~ .newsFilter__title {
	color: #009353;

}
.newsFilter .theme-green-2 svg {
	fill: #47bd6a;

}
.newsFilter .theme-green-2 input:checked ~ .newsFilter__icon {
	background: #47bd6a;

}
.newsFilter .theme-green-2 input:checked ~ .newsFilter__icon svg {
	fill: #fff;

}
.newsFilter .theme-green-2:hover span,
		.newsFilter .theme-green-2 input:checked ~ .newsFilter__title {
	color: #47bd6a;

}
.newsFilter .theme-blue svg {
	fill: #0534ff;

}
.newsFilter .theme-blue input:checked ~ .newsFilter__icon {
	background: #0534ff;

}
.newsFilter .theme-blue input:checked ~ .newsFilter__icon svg {
	fill: #fff;

}
.newsFilter .theme-blue:hover span,
		.newsFilter .theme-blue input:checked ~ .newsFilter__title {
	color: #0534ff;

}
.newsFilter .theme-blue-2 svg {
	fill: #4359e0;

}
.newsFilter .theme-blue-2 input:checked ~ .newsFilter__icon {
	background: #4359e0;

}
.newsFilter .theme-blue-2 input:checked ~ .newsFilter__icon svg {
	fill: #fff;

}
.newsFilter .theme-blue-2:hover span,
		.newsFilter .theme-blue-2 input:checked ~ .newsFilter__title {
	color: #4359e0;

}
.newsFilter .theme-purple svg {
	fill: #7b35cb;

}
.newsFilter .theme-purple input:checked ~ .newsFilter__icon {
	background: #7b35cb;

}
.newsFilter .theme-purple input:checked ~ .newsFilter__icon svg {
	fill: #fff;

}
.newsFilter .theme-purple:hover span,
		.newsFilter .theme-purple input:checked ~ .newsFilter__title {
	color: #7b35cb;

}
.newsFilter .theme-purple-2 svg {
	fill: #7830ca;

}
.newsFilter .theme-purple-2 input:checked ~ .newsFilter__icon {
	background: #7830ca;

}
.newsFilter .theme-purple-2 input:checked ~ .newsFilter__icon svg {
	fill: #fff;

}
.newsFilter .theme-purple-2:hover span,
		.newsFilter .theme-purple-2 input:checked ~ .newsFilter__title {
	color: #7830ca;

}
.newsFilter .theme-black svg {
	fill: #000;

}
.newsFilter .theme-black input:checked ~ .newsFilter__icon {
	background: #000;

}
.newsFilter .theme-black input:checked ~ .newsFilter__icon svg {
	fill: #fff;

}
.newsFilter .theme-black:hover span,
		.newsFilter .theme-black input:checked ~ .newsFilter__title {
	color: #000;

}
.newsFilter .theme-orange svg {
	fill: #fb7720;

}
.newsFilter .theme-orange input:checked ~ .newsFilter__icon {
	background: #fb7720;

}
.newsFilter .theme-orange input:checked ~ .newsFilter__icon svg {
	fill: #fff;

}
.newsFilter .theme-orange:hover span,
		.newsFilter .theme-orange input:checked ~ .newsFilter__title {
	color: #fb7720;

}
.newsFilter--marginVertical15 {
	margin-top: 15px;
	margin-bottom: 15px;
}
.newsFilterSelect .newsFilter__hiddenFilter {
	display: none;

}
.newsFilterSelect .newsFilter__title {
	color: #221F1F;

}
.newsFilterSelect .switchSelect__trigger {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;

}
.newsFilterSelect .switchSelect__trigger input {
	display: none;

}
.newsFilterSelect .switchSelect__trigger .newsFilter__icon {
	margin-right: 15px;

}
.newsFilterSelect .switchSelect__trigger .newsFilter__icon svg {
	max-height: 20px;
	max-width: 20px;

}
.newsFilterSelect .switchSelect__trigger .newsFilter__label {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;

}
.newsFilterSelect .newsFilter {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;

}
.newsFilterSelect .newsFilter .switchSelect__item {
	padding: 5px 15px;
	margin-bottom: 1px;

}
.newsFilterSelect .newsFilter .switchSelect__item:hover {
	background: transparent;

}
.newsFilterSelect .newsFilter .switchSelect__item:last-child {
	margin-bottom: 0;

}
.newsFilterSelect .newsFilter .switchSelect__item.switchSelect__item--isSelected {
	background: #f0f0f0;

}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.mobile .newsFilter {
		text-align: center;
        display: -webkit-box;
        display: -ms-flexbox;
        display: flex;
	}
	.mobile .newsFilter li {
		padding-top: 10px;
		padding-bottom: 10px;
		padding-right: 30px;
		text-align: left;
        white-space: nowrap;
	}

}
/* ------------------------------------------------------------------------- */
.buttonMore {
	margin-top: 80px;
	margin-bottom: 80px;
	text-align: center;
}
.buttonMore-link {
	display: inline-block;
	padding: 19px 53px;
	border: 2px solid black;
	font-size: 16px;
	font-weight: 500;
	white-space: nowrap;
	text-decoration: underline;
	cursor: pointer;
	-webkit-transition: all 0.2s ease;
	transition: all 0.2s ease;

	border-color: #009cff;
	color: #009cff;
	background-color: transparent
}
.buttonMore-link:hover {
	border-color: #009cff;
	color: #fff;
	background-color: #009cff;

}
/* ------------------------------------------------------------------------- */
.buttonMore--theme-red .buttonMore-link {
	border-color: #e83930;
	color: #e83930;
	background-color: transparent;

}
.buttonMore--theme-red .buttonMore-link:hover {
	border-color: #e83930;
	color: #fff;
	background-color: #e83930;

}
.buttonMore--theme-green .buttonMore-link {
	border-color: #009353;
	color: #009353;
	background-color: transparent;

}
.buttonMore--theme-green .buttonMore-link:hover {
	border-color: #009353;
	color: #fff;
	background-color: #009353;

}
.buttonMore--theme-green-2 .buttonMore-link {
	border-color: #47bd6a;
	color: #47bd6a;
	background-color: transparent;

}
.buttonMore--theme-green-2 .buttonMore-link:hover {
	border-color: #47bd6a;
	color: #fff;
	background-color: #47bd6a;

}
.buttonMore--theme-blue .buttonMore-link {
	border-color: #0534ff;
	color: #0534ff;
	background-color: transparent;

}
.buttonMore--theme-blue .buttonMore-link:hover {
	border-color: #0534ff;
	color: #fff;
	background-color: #0534ff;

}
.buttonMore--theme-blue-2 .buttonMore-link {
	border-color: #4359e0;
	color: #4359e0;
	background-color: transparent;

}
.buttonMore--theme-blue-2 .buttonMore-link:hover {
	border-color: #4359e0;
	color: #fff;
	background-color: #4359e0;

}
.buttonMore--theme-purple .buttonMore-link {
	border-color: #7b35cb;
	color: #7b35cb;
	background-color: transparent;

}
.buttonMore--theme-purple .buttonMore-link:hover {
	border-color: #7b35cb;
	color: #fff;
	background-color: #7b35cb;

}
.buttonMore--theme-purple-2 .buttonMore-link {
	border-color: #7830ca;
	color: #7830ca;
	background-color: transparent;

}
.buttonMore--theme-purple-2 .buttonMore-link:hover {
	border-color: #7830ca;
	color: #fff;
	background-color: #7830ca;

}
.buttonMore--theme-black .buttonMore-link {
	border-color: #000;
	color: #000;
	background-color: transparent;

}
.buttonMore--theme-black .buttonMore-link:hover {
	border-color: #000;
	color: #fff;
	background-color: #000;

}
.buttonMore--theme-orange .buttonMore-link {
	border-color: #fb7720;
	color: #fb7720;
	background-color: transparent;

}
.buttonMore--theme-orange .buttonMore-link:hover {
	border-color: #fb7720;
	color: #fff;
	background-color: #fb7720;

}
.buttonMore--theme-white .buttonMore-link {
	border-color: #fff;
	color: #fff;
	background-color: transparent;

}
.buttonMore--theme-white .buttonMore-link:hover {
	color: #009cff;
	background-color: #fff;

}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.mobile .buttonMore {
		margin-top: 40px;
		margin-bottom: 40px;

	}
	.mobile .buttonMore-link:hover {
		border-color: #009cff;
		color: #009cff;
		background-color: transparent;

	}
	.mobile .buttonMore--theme-red .buttonMore-link:hover {
		border-color: #e83930;
		background-color: transparent;
		color: #e83930;

	}
	.mobile .buttonMore--theme-green .buttonMore-link:hover {
		border-color: #009353;
		background-color: transparent;
		color: #009353;

	}
	.mobile .buttonMore--theme-green-2 .buttonMore-link:hover {
		border-color: #47bd6a;
		background-color: transparent;
		color: #47bd6a;

	}
	.mobile .buttonMore--theme-blue .buttonMore-link:hover {
		border-color: #0534ff;
		background-color: transparent;
		color: #0534ff;

	}
	.mobile .buttonMore--theme-blue-2 .buttonMore-link:hover {
		border-color: #4359e0;
		background-color: transparent;
		color: #4359e0;

	}
	.mobile .buttonMore--theme-purple .buttonMore-link:hover {
		border-color: #7b35cb;
		background-color: transparent;
		color: #7b35cb;

	}
	.mobile .buttonMore--theme-purple-2 .buttonMore-link:hover {
		border-color: #7830ca;
		background-color: transparent;
		color: #7830ca;

	}
	.mobile .buttonMore--theme-black .buttonMore-link:hover {
		border-color: #000;
		background-color: transparent;
		color: #000;

	}
	.mobile .buttonMore--theme-orange .buttonMore-link:hover {
		border-color: #fb7720;
		background-color: transparent;
		color: #fb7720;

	}
	.mobile .buttonMore--theme-white .buttonMore-link:hover {
		border-color: #fff;
		background-color: transparent;
		color: #fff;

	}

}
@media (max-width: 478px) {
	.mobile .buttonMore {
		margin-top: 20px;
		margin-bottom: 20px;

	}

}
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
.pageTags__group {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	margin: 80px 0;
	border: 1px solid #d6d6d6;
}
.pageTags__column {
	width: 50%;
	padding: 40px
}
.pageTags__column + .pageTags__column {
	border-left: 1px solid #d6d6d6;

}
.pageTags__array {
	margin-top: 40px;
	margin-bottom: 40px;
}
.pageTags__title {}
/* ------------------------------------------------------------------------- */
.pageTags {
	font-size: 0;
}
.pageTags--verticalSpace {
	margin-top: 80px;
	margin-bottom: 80px;
}
.pageTags__list {
	display: inline-block;
	margin-left: -1px;
	margin-top: -1px;
}
.pageTags__link {
	display: inline-block;
	padding-left: 17px;
	padding-right: 17px;
	padding-top: 3px;
	padding-bottom: 3px;
	border: 1px solid #d6d6d6;
	color: #9c9c9c;
	font-size: 16px;
	-webkit-transition: all 0.2s ease;
	transition: all 0.2s ease
}
.pageTags__link:hover {
	-webkit-box-shadow: 0 0 9px rgba(120, 48, 202, .4);
	        box-shadow: 0 0 9px rgba(120, 48, 202, .4);
	border-color: transparent;
	z-index: 3;
	position: relative;
	background: #45b774;
	color: #fff;

}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.mobile .pageTags__group {
		margin-top: 60px;
		margin-bottom: 60px;

	}
	.mobile .pageTags__group {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .pageTags__column {
		width: 100%;

	}
	.mobile .pageTags__column + .pageTags__column {
		border-top: 1px solid #d6d6d6;
		border-left: 0;

	}

}
@media (max-width: 478px) {
	.mobile .pageTags__group {
		margin-top: 30px;
		margin-bottom: 30px;
		border: none;

	}
	.mobile .pageTags__column {
		padding-left: 0;
		padding-right: 0;
		padding-bottom: 0;

	}
	.mobile .pageTags__column:first-child {
		padding-top: 0;

	}
	.mobile .pageTags__title {
		margin: 0;

	}
	.mobile .pageTags__array {
		margin-top: 25px;

	}
	.mobile .pageTags__link {
		font-size: 14px;

	}

}
/* ------------------------------------------------------------------------- */
.cardContactPressCenter {
	margin-top: 80px;
	margin-bottom: 80px;
	background: #fff;
	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	        box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: nowrap;
	    flex-wrap: nowrap;
	-webkit-box-align: stretch;
	    -ms-flex-align: stretch;
	        align-items: stretch;
}
.cardContactPressCenter-left {
	width: 50%;
	min-height: 418px;
  background: linear-gradient(45deg, #0da481 0%, #0da481 30%, #3bcf56 70%, #3bcf56 100%);
	position: relative;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-webkit-box-pack: end;
	    -ms-flex-pack: end;
	        justify-content: flex-end;
	padding: 40px
}
.cardContactPressCenter-left div:first-child {
	margin-top: 0;

}
.cardContactPressCenter-left div:last-child {
	margin-bottom: 0;

}
.cardContactPressCenter-bg {
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	z-index: 0;
	background-size: cover;
	background-repeat: no-repeat;
}
.cardContactPressCenter-title,
.cardContactPressCenter-position,
.cardContactPressCenter-name,
.cardContactPressCenter-telephone,
.cardContactPressCenter-fax,
.cardContactPressCenter-email {
	position: relative;
	z-index: 1;
	color: #fff;
	font-weight: 500;
}
.cardContactPressCenter-title {
	margin: 20px 0;
	font-size: 30px;
}
.cardContactPressCenter-position {
	margin: -15px 0 0;
	font-size: 24px;
}
.cardContactPressCenter-name {
	margin: 7px 0 30px;
	font-size: 24px;
}
.cardContactPressCenter-telephone {
	margin: 7px 0;
	font-size: 18px
}
.cardContactPressCenter-telephone > a {
	white-space: nowrap;

}
.cardContactPressCenter-fax {
	margin: 7px 0;
	font-size: 18px
}
.cardContactPressCenter-fax > a {
	white-space: nowrap;

}
.cardContactPressCenter-email {
	margin: 7px 0;
	font-size: 18px
}
.cardContactPressCenter-email > a {
	white-space: nowrap;
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.cardContactPressCenter-email > a:hover {
	background-size: 100% 1px;

}
.cardContactPressCenter-right {
	width: 50%;
	padding: 50px;

	display: -webkit-box;

	display: -ms-flexbox;

	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
}
.cardContactPressCenter-linkGroup {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
	/* justify-content: space-around; */
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
}
.cardContactPressCenter-linkItem {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-item-align: start;
	    align-self: flex-start;
}
.cardContactPressCenter-linkItem:hover .cardContactPressCenter-linkItemTitle {
	background-size: 100% 1px;

}
.cardContactPressCenter-linkItem:hover .cardContactPressCenter-linkItemImg img {
	-webkit-transform: scale(1.2);
	        transform: scale(1.2);

}
.cardContactPressCenter-linkItemImg {
	display: block;
	width: 80px;
	height: 80px;
	border-radius: 50%;
	-webkit-box-shadow: 0 0 40px rgba(0, 0, 0, .2);
	        box-shadow: 0 0 40px rgba(0, 0, 0, .2);
	overflow: hidden;
  background: linear-gradient(45deg, #0da481 0%, #0da481 30%, #3bcf56 70%, #3bcf56 100%);
	-ms-flex-negative: 0;
	    flex-shrink: 0;
}
.cardContactPressCenter-linkItemImg img {
	-webkit-transition: -webkit-transform 0.3s ease;
	transition: -webkit-transform 0.3s ease;
	transition: transform 0.3s ease;
	transition: transform 0.3s ease, -webkit-transform 0.3s ease;
}
.cardContactPressCenter-linkItemTitle {
	margin-left: 22px;
	color: #525252;
	font-size: 20px;
	font-weight: 900;
	-ms-flex-item-align: center;
	    align-self: center;
	background: -webkit-gradient(linear, left bottom, left top, from(currentColor), to(currentColor)) bottom left no-repeat;
	background: linear-gradient(0deg, currentColor, currentColor) bottom left no-repeat;
	background-size: 0px 1px;
	-webkit-transition: background-size 0.3s ease;
	transition: background-size 0.3s ease;
}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.mobile .cardContactPressCenter {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .cardContactPressCenter-left,
		.mobile .cardContactPressCenter-right {
		width: 100%;

	}
	.mobile .cardContactPressCenter-right {
		padding: 30px 20px;

	}
	.mobile .cardContactPressCenter-linkGroup {
		-ms-flex-wrap: wrap;
		    flex-wrap: wrap;
		-webkit-box-orient: horizontal;
		-webkit-box-direction: normal;
		    -ms-flex-direction: row;
		        flex-direction: row;

	}
	.mobile .cardContactPressCenter-linkItem {
		-webkit-box-flex: 1;
		    -ms-flex: 1 1 33.33%;
		        flex: 1 1 33.33%;
		min-width: 200px;
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;
		margin: 15px 0;

	}

}
@media (max-width: 478px) {
	.mobile .cardContactPressCenter-left {
		padding: 20px;

	}
	.mobile .cardContactPressCenter-linkItem {
		-webkit-box-flex: 1;
		    -ms-flex: 1 1 100%;
		        flex: 1 1 100%;
		min-width: auto;
		-webkit-box-pack: start;
		    -ms-flex-pack: start;
		        justify-content: flex-start;

	}

}
/* ------------------------------------------------------------------------- */
.selectDateRange {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
}
.selectDateRange__item {
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
	position: relative
}
.selectDateRange__item::before,
	.selectDateRange__item::after {
	content: '';
	display: block;
	width: 40px;
	height: 60%;
	background-color: #f6f6f6;
	position: absolute;
	z-index: 25;
	top: 50%;
	left: 0;
	opacity: 0;

}
.selectDateRange__item::after {
	background-color: #fff;
	left: auto;
	right: 0;

}
.selectDateRange__item + .selectDateRange__item {
	margin-left: 10px;

}
.selectDateRange__item.isOpened::before,
		.selectDateRange__item.isOpened::after {
	opacity: 1;

}
.selectDateRange__item.isOpened .selectDateRange__itemIcon svg {
	-webkit-transform: rotate(0deg);
	        transform: rotate(0deg);

}
.selectDateRange__item.isOpened .selectDateRange__itemPanelWrap {
	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);
	        box-shadow: 0 0 20px rgba(0, 0, 0, .2);

}
.selectDateRange__item.isOpened .selectDateRange__itemDecorShadow {
	opacity: 1;

}
.selectDateRange__itemDecorShadow {
	width: 100%;
	height: 70%;
	opacity: 0;
	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);
	        box-shadow: 0 0 20px rgba(0, 0, 0, .2);
	position: absolute;
	top: 50%;
	z-index: 20;
}
.selectDateRange__itemToggleBtn {
	width: 100%;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	padding-right: 32px;
	min-width: 175px;
	height: 38px;
	border-radius: 19px;
	background: #f6f6f6;
	border: none;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	outline: none;
	position: relative;
	z-index: 30;
	color: #666666;
	background: #fafafa;
  -webkit-box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);
          box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);
}
.selectDateRange__itemTitle {
	padding: 0 13px;
	color: #525252;
	font-size: 16px;
	font-weight: 500;
	white-space: nowrap
}
.selectDateRange__itemTitle .placeholder {
	opacity: .75;

}
.selectDateRange__itemIcon {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	width: 28px;
	height: 28px;
	overflow: hidden;
	border-radius: 50%;
	background-color: #fff;
	-webkit-box-shadow: 0 0 9px rgba(0, 0, 0, .16);
	        box-shadow: 0 0 9px rgba(0, 0, 0, .16);
	position: absolute;
	top: 5px;
	right: 5px;
}
.selectDateRange__itemIcon svg {
	fill: #33b178;
	stroke: #33b178;
	stroke-width: 1px;
	-webkit-transition: all .2s ease;
	transition: all .2s ease;
	-webkit-transform: rotate(180deg);
	        transform: rotate(180deg);
	margin: auto;
}
.selectDateRange__itemIcon svg polygon {
	fill: #2aae7a;
}
.selectDateRange__item--active .selectDateRange__itemIcon {
	background-color: #009cff;

}
.selectDateRange__item--active .selectDateRange__itemIcon svg polygon {
	fill: #fff;

}
.selectDateRange__start {
	z-index: 2;
}
.selectDateRange__end {
	z-index: 1;
}
.selectDateRange__itemPanelWrap {
	border-radius: 20px;
	border-top-left-radius: 0;
	background-color: #f6f6f6;
	position: absolute;
	top: 100%;
	left: 0;
	z-index: 22;
	height: 0;
	overflow: hidden;
	-webkit-transition: height .3s ease;
	transition: height .3s ease;
	-webkit-transition-property: height, -webkit-box-shadow;
	transition-property: height, -webkit-box-shadow;
	transition-property: height, box-shadow;
	transition-property: height, box-shadow, -webkit-box-shadow;
}
.selectDateRange__itemPanel {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	height: 192px;
	width: 440px;
	background: #fff;
	-webkit-transition: opacity .3s ease;
	transition: opacity .3s ease;
}
.selectDateRange__years {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	/* flex-grow: 1; */
	min-width: 135px;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-ms-flex-wrap: wrap;
	    flex-wrap: wrap;
	padding: 21px 10px;
	background-color: #f6f6f6;
	position: relative
}
.selectDateRange__years span {
	width: 50%;
	padding: 8px 0;
	font-size: 16px;
	font-weight: 500;
	text-align: center;
	cursor: pointer;

}
.selectDateRange__years span:hover {
	color: #555555;

}
.selectDateRange__months {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-ms-flex-wrap: wrap;
	    flex-wrap: wrap;
	padding: 21px 21px
}
.selectDateRange__months span {
	width: 33.3%;
	padding: 8px 0;
	font-size: 16px;
	font-weight: 500;
	cursor: pointer;
	-webkit-transition: color 0.2s ease;
	transition: color 0.2s ease;

}
.selectDateRange__months span:hover {
	color: #555555;

}
.selectDateRange__itemPanel .el {
	cursor: pointer
}
.selectDateRange__itemPanel .el.active,
	.selectDateRange__itemPanel .el.locked {
	cursor: default;

}
.selectDateRange__itemPanel .el.active {
	color: #45b774;

}
.selectDateRange__itemPanel .el.active:hover {
	color: #45b774;

}
.selectDateRange__itemPanel .el.locked {
	color: #aaaaaa;

}
.selectDateRange__itemPanel .el.locked:hover {
	color: #aaaaaa;

}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.mobile .selectDateRange {
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;

	}
	.mobile .selectDateRange__itemDecorShadow {
		display: none;

	}
	.mobile .selectDateRange__item::before,
			.mobile .selectDateRange__item::after {
		display: none;

	}
	.mobile .selectDateRange__itemPanelWrap {
		width: 100%;
		border-radius: 0 0 20px 20px;
		padding-top: 19px;
		top: 50%;

	}
	.mobile .selectDateRange__itemPanel {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		width: 100%;
		height: auto;

	}
	.mobile .selectDateRange__years {
		max-width: 100%;
		min-width: 0;
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;
		-webkit-box-orient: horizontal;
		-webkit-box-direction: normal;
		    -ms-flex-flow: row wrap;
		        flex-flow: row wrap;
		padding: 0;

	}
	.mobile .selectDateRange__years .el {
		display: block;
		width: auto;
		padding: 15px 10px;

	}
	.mobile .selectDateRange__months {
		max-width: 100%;
		-webkit-box-orient: horizontal;
		-webkit-box-direction: normal;
		    -ms-flex-direction: row;
		        flex-direction: row;
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;
		padding: 10px;

	}
	.mobile .selectDateRange__months .el {
		text-align: center;
		padding: 10px;
		width: auto;

	}

}
@media (max-width: 478px) {
	.mobile .selectDateRange {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		-webkit-box-align: start;
		    -ms-flex-align: start;
		        align-items: flex-start;

	}
	.mobile .selectDateRange__item {
		width: 100%;

	}
	.mobile .selectDateRange__item + .selectDateRange__item {
		margin-top: 20px;
		margin-left: 0;

	}

}
/* ------------------------------------------------------------------------- */
/* .switchPanelAndSearchFilter {
	margin-top: -30px;
	box-shadow: 0 0 20px rgba(0,0,0,0.25);
	& .switchPanel {
		margin-top: 0;
		box-shadow: none;
	}
} */
.switchPanel {
	margin-top: -30px;
	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	        box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	position: relative;
  background: -webkit-gradient(linear, left top, right top, from(#0da481), to(#3bcf56));
  background: linear-gradient(90deg, #0da481 0%, #3bcf56 100%);
}
.switchPanel__links {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	height: 155px;
}
.switchPanel__links-item {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
	/* width: 33.33%; */
	height: 155px;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	background: #fff;
	z-index: 10
}
.switchPanel__links-item:not(.switchPanel__links-item--active) {
	border-left: 1px solid #efefef;

}
.switchPanel__links-item:hover:not(.switchPanel__links-item--active) .switchPanel__title {
	background-size: 100% 1px;

}
.switchPanel__links-item:hover:not(.switchPanel__links-item--active) .switchPanel__icon {
	-webkit-transform: scale(1.15);
	        transform: scale(1.15);

}
.switchPanel__wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	height: 60px;
}
.switchPanel__icon {
	margin-right: 23px;
	width: 65px;
	height: 60px;
	overflow: hidden;
	-ms-flex-item-align: end;
	    align-self: flex-end;
	-webkit-transition: -webkit-transform 0.3s ease;
	transition: -webkit-transform 0.3s ease;
	transition: transform 0.3s ease;
	transition: transform 0.3s ease, -webkit-transform 0.3s ease
}
.switchPanel__icon svg {
	width: 65px;
	height: 60px;
	fill: #ff4e00;

}
.switchPanel__title {
	color: #221F1F;
	font-size: 20px;
	font-weight: 500;
	-ms-flex-item-align: end;
	    align-self: flex-end;
	background: -webkit-gradient(linear, left bottom, left top, from(currentColor), to(currentColor)) bottom left no-repeat;
	background: linear-gradient(0deg, currentColor, currentColor) bottom left no-repeat;
	background-size: 0px 1px;
	-webkit-transition: background-size 0.3s ease;
	transition: background-size 0.3s ease;
}
.switchPanel__links-item--active {
	background: transparent
}
.switchPanel__links-item--active.newsHeader-item + .newsHeader-item {
	border-left: 0;

}
.switchPanel__links-item--active:after {
	content: '';
	display: block;
	width: 100%;
	height: 30px;
	overflow: hidden;
	position: absolute;
	left: 0;
	bottom: 100%;
	right: 0;
	z-index: 0;
	background: -webkit-gradient(linear, left top, right top, from(#0da481), to(#3bcf56));
	background: linear-gradient(90deg, #0da481 0%, #3bcf56 100%);
	background-clip: content-box;

}
.switchPanel__links-item--active .switchPanel__title {
	color: #fff;

}
.switchPanel__links-item--active .switchPanel__icon svg {
	fill: #fff;

}
.switchPanel__links-item--active.switchPanel__links-item:hover {
	cursor: default;

}
.switchPanel__links-item--active.switchPanel__links-item:hover .newsHeader-title {
	background-size: 0px 1px;

}
.switchPanel__links-item--active.switchPanel__links-item:hover .switchPanel__icon {
	-webkit-transform: scale(1);
	        transform: scale(1);

}
.switchPanel__links[data-menu-length="2"] .switchPanel__links-item {
	width: 50%;

}
.switchPanel__links[data-menu-length="2"] .switchPanel__links-item--active:nth-child(1):after {
	padding-right: 50%;

}
.switchPanel__links[data-menu-length="2"] .switchPanel__links-item--active:nth-child(2):after {
	padding-left: 50%;

}
.switchPanel__links[data-menu-length="3"] .switchPanel__links-item {
	width: 33.33%;

}
.switchPanel__links[data-menu-length="3"] .switchPanel__links-item--active:nth-child(1):after {
	padding-right: 66.66%;

}
.switchPanel__links[data-menu-length="3"] .switchPanel__links-item--active:nth-child(2):after {
	padding-left: 33.33%;
	padding-right: 33.33%;

}
.switchPanel__links[data-menu-length="3"] .switchPanel__links-item--active:nth-child(3):after {
	padding-left: 66.66%;
	background-clip: content-box;

}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.mobile .switchPanel {}
	.mobile .switchPanel__wrap {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		height: auto;

	}
	.mobile .switchPanel__icon {
		-ms-flex-item-align: center;
		    align-self: center;
		margin-right: 0;
		margin-bottom: 15px;

	}
	.mobile .switchPanel__title {
		font-size: 16px;

	}

}
@media (max-width: 478px) {
	.mobile .switchPanel {
		height: 100px;

	}
	.mobile .switchPanel__links {
		height: 100px;

	}
	.mobile .switchPanel__wrap {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		height: auto;

	}
	.mobile .switchPanel__links-item {
		height: 100px;

	}
	.mobile .switchPanel__icon {
		width: 40px;
		height: 34px;
		-ms-flex-item-align: center;
		    align-self: center;
		margin-right: 0;
		margin-bottom: 15px;

	}
	.mobile .switchPanel__icon svg {
		width: 40px;
		height: 34px;

	}
	.mobile .switchPanel__title {
		font-size: 12px;

	}

}
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
.awesomplete [hidden] {
    display: none;
}
.awesomplete .visually-hidden {
    position: absolute;
    clip: rect(0, 0, 0, 0);
}
.awesomplete {
    display: inline-block;
    position: relative;
}
.awesomplete > input {
    display: block;
}
.awesomplete > ul {
    position: absolute;
    left: 0;
    z-index: 1;
    min-width: 100%;
    -webkit-box-sizing: border-box;
            box-sizing: border-box;
    list-style: none;
    padding: 0;
    margin: 0;
    background: #fff;
}
.awesomplete > ul:empty {
    display: none;
}
.awesomplete > ul {
	border-radius: .3em;
	margin: .2em 0 0;
	background: hsla(0, 0%, 100%, .9);
	background: -webkit-gradient(linear, left top, right bottom, from(white), to(hsla(0, 0%, 100%, .8)));
	background: linear-gradient(to bottom right, white, hsla(0, 0%, 100%, .8));
	border: 1px solid rgba(0, 0, 0, .3);
	-webkit-box-shadow: .05em .2em .6em rgba(0, 0, 0, .2);
	        box-shadow: .05em .2em .6em rgba(0, 0, 0, .2);
	text-shadow: none;
}
@supports ((-webkit-transform: scale(0)) or (transform: scale(0))) {
	.awesomplete > ul {
		-webkit-transition: .3s cubic-bezier(.4,.2,.5,1.4);
		transition: .3s cubic-bezier(.4,.2,.5,1.4);
		-webkit-transform-origin: 1.43em -.43em;
		        transform-origin: 1.43em -.43em;
	}

	.awesomplete > ul[hidden],
	.awesomplete > ul:empty {
		opacity: 0;
		-webkit-transform: scale(0);
		        transform: scale(0);
		display: block;
		-webkit-transition-timing-function: ease;
		        transition-timing-function: ease;
	}
}
/* Pointer */
.awesomplete > ul:before {
		content: "";
		position: absolute;
		top: -.43em;
		left: 1em;
		width: 0; height: 0;
		padding: .4em;
		background: white;
		border: inherit;
		border-right: 0;
		border-bottom: 0;
		-webkit-transform: rotate(45deg);
		transform: rotate(45deg);
	}
.awesomplete > ul > li {
		position: relative;
		padding: .2em .5em;
		cursor: pointer;
	}
.awesomplete > ul > li:hover {
		background: hsl(200, 40%, 80%);
		color: black;
	}
.awesomplete > ul > li[aria-selected="true"] {
		background: hsl(205, 40%, 40%);
		color: white;
	}
.awesomplete mark {
			background: hsl(65, 100%, 50%);
		}
.awesomplete li:hover mark {
			background: hsl(68, 100%, 41%);
		}
.awesomplete li[aria-selected="true"] mark {
			background: hsl(86, 100%, 21%);
			color: inherit;
		}
.search {
	margin: 0 30px;
}
.search svg {
	display: block;
	width: 20px;
	height: 20px;
	fill: currentColor;
	cursor: pointer;
}
.awesomplete {
  width: 100%
}
.awesomplete > ul {
	color: #221F1F;
	background: #fff;
	border-radius: 0%;
	border: none;
	-webkit-box-shadow: 0 3px 15px 0 rgba(0, 0, 0, .2);
	        box-shadow: 0 3px 15px 0 rgba(0, 0, 0, .2);

}
.awesomplete > ul::before {
	display: none;

}
.awesomplete > ul > li {
	border-bottom: 1px solid #d6d6d6;
	padding: 15px;
	color: #221F1F;
	font-size: 18px;
	font-weight: 400;

}
.awesomplete > ul > li:last-child {
	border-bottom: none;

}
.awesomplete > ul > li mark {
	color: #009cff;
	font-weight: bold;
	background: transparent;

}
.awesomplete > ul > li[aria-selected="true"],
      .awesomplete > ul > li:hover {
	color: #221F1F;
	background: #f0f0f0;

}
.awesomplete > ul > li[aria-selected="true"] mark, .awesomplete > ul > li:hover mark {
	color: #009cff;
	background: transparent;

}
.siteHeader__searchToggle-checkbox {
	display: none;
}
.siteHeader__searchToggle-icon {
	display: block;
	cursor: pointer;
}
.siteHeader__searchToggle-checkbox:checked ~ .searchForm--singelForm {
	-webkit-transform: translateX(0);
	        transform: translateX(0);
}
.siteHeader__searchToggle-checkbox:checked ~ .searchForm__bg {
	display: block;
	visibility: visible;
	z-index: 50;
	opacity: 0.87;
}
/* ------------------------------------------------------------------------- */
.searchForm {}
.searchForm--header .container {
	height: 100%;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;

}
.searchForm--header .awesomplete {
	height: 100%;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;

}
.searchForm--header .awesomplete > ul {
	top: 100%;

}
.searchForm--header .searchForm__form {
	width: 100%;

}
.searchForm--header .searchForm__input {
	margin: auto 0;
	border-bottom: none;

}
.searchForm--singelForm {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	width: 100vw;
	height: 100%;
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	z-index: 110;
	background: #5fbcf6;
	background: \-webkit-radial-gradient(top right,#5fbcf6,#4162d2);
	background: radial-gradient(top right, #5fbcf6, #4162d2);
	background: linear-gradient(45deg, #2c56da 0%,#2c56da 27%,#00a8ff 76%,#00a8ff 100%);
	-webkit-transform: translateX(-100%);
	        transform: translateX(-100%);
	-webkit-transition: -webkit-transform 0.3s ease-in-out;
	transition: -webkit-transform 0.3s ease-in-out;
	transition: transform 0.3s ease-in-out;
	transition: transform 0.3s ease-in-out, -webkit-transform 0.3s ease-in-out
}
.searchForm--singelForm .container {
	-ms-flex-item-align: center;
	    align-self: center;

}
.searchForm--menuLarge {
	margin: 20px 0 30px;
	opacity: 0;
	-webkit-transform: translateY(50px);
	        transform: translateY(50px);
	-webkit-transition: opacity 0.2s ease-in-out 0.3s,
				-webkit-transform 0.2s ease-in-out 0.3s;
	transition: opacity 0.2s ease-in-out 0.3s,
				-webkit-transform 0.2s ease-in-out 0.3s;
	transition: transform 0.2s ease-in-out 0.3s,
				opacity 0.2s ease-in-out 0.3s;
	transition: transform 0.2s ease-in-out 0.3s,
				opacity 0.2s ease-in-out 0.3s,
				-webkit-transform 0.2s ease-in-out 0.3s;
}
.searchForm__form {
	position: relative;
	margin: 0;
}
.searchForm__input {
	width: 100%;
	border: 0;
	margin: 0;
	padding: 8px 40px;
	border-bottom: 1px solid #fff;
	background: transparent;
	color: #fff;
	font-family: Arial, Helvetica, sans-serif;
	font-size: 18px;
	font-family: inherit
}
.searchForm__input:focus {
	outline: none;

}
.searchForm__input::-webkit-input-placeholder {

	/* Chrome/Opera/Safari */
	color: #fff;
	opacity: 0.8;

}
.searchForm__input::-moz-placeholder {

	/* Firefox 19+ */
	color: #fff;
	opacity: 0.8;

}
.searchForm__input:-ms-input-placeholder {

	/* IE 10+ */
	color: #fff;
	opacity: 0.8;

}
.searchForm__input:-moz-placeholder {

	/* Firefox 18- */
	color: #fff;
	opacity: 0.8;

}
.searchForm__submit {
	display: block;
	width: 22px;
	height: 22px;
	border: 0;
	overflow: hidden;
	text-indent: -99999px;
	background: url('/images/icon-search.svg') no-repeat;
	background-size: 22px 22px;
	position: absolute;
	top: 50%;
	left: 0;
	-webkit-transform: translateY(-50%);
	        transform: translateY(-50%);
	cursor: pointer;
}
.searchForm__bg {
	position: fixed;
	/*width: 100vw;*/
	width: 100%;
	height: 100vh;
	left: 0;
	right: 0;
	top: 0;
	bottom: 0;
	z-index: -1;
	visibility: hidden;
	background: #1e1e1e;
	/*opacity: 0.87;*/
	opacity: 0;
	-webkit-transition: opacity 0.2s ease-in-out 0.1s;
	transition: opacity 0.2s ease-in-out 0.1s;
}
.searchForm__close {
	width: 26px;
	height: 26px;
	position: absolute;
	top: 50%;
	right: 7px;
	z-index: 120;
	overflow: hidden;
	cursor: pointer;
	-webkit-transform: translateY(-50%);
	        transform: translateY(-50%)
}
.searchForm__close:before,
	.searchForm__close:after {
	content:'';
	width: 100%;
	height: 3px;
	position: absolute;
	top:0;
	left:0;
	right: 0;
	bottom:0;
	margin: auto;
	background: #fff;
	-webkit-transition: background-color 0.3s ease-in-out;
	transition: background-color 0.3s ease-in-out;

}
.searchForm__close:before {
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);

}
.searchForm__close:after {
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);

}
.searchForm__close:hover:before,
	.searchForm__close:hover:after {
	background-color: #99d8ff;

}
.searchForm__close + .searchForm__input {
	border: 0;
	padding-right: 50px;
}
/* ------------------------------------------------------------------------- */
.searchForm__form--pageTitle {
	margin: 40px 0
}
.searchForm__form--pageTitle .searchForm__input {
	padding-top: 18px;
	padding-bottom: 18px;

}
.searchForm__form--pageTitle .searchForm__submit {
	opacity: 0.6;
	-webkit-transition: opacity 0.3s ease;
	transition: opacity 0.3s ease;

}
.searchForm__form--pageTitle .searchForm__submit:hover {
	opacity: 1;

}
/* ------------------------------------------------------------------------- */
.searchFilter {
	position: relative;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	padding: 50px 60px;
  background: -webkit-gradient(linear, left top, right top, from(#0da481), to(#3bcf56));
  background: linear-gradient(90deg, #0da481 0%, #3bcf56 100%);
}
.searchFilter__input {
	width: 100%;
	height: 38px;
	border: 0;
	border-radius: 19px;
	padding: 0 54px 0 18px;
	margin: 0;
	background: #fff;
	font-family: inherit;
	font-size: 16px;
	font-weight: 500;
	text-overflow: ellipsis
}
.searchFilter__input:focus {
	outline: none;

}
.searchFilter__input::-webkit-input-placeholder {

	/* Chrome/Opera/Safari */
	color: #6e6e6e;
	opacity: 0.8;

}
.searchFilter__input::-moz-placeholder {

	/* Firefox 19+ */
	color: #6e6e6e;
	opacity: 0.8;

}
.searchFilter__input:-ms-input-placeholder {

	/* IE 10+ */
	color: #6e6e6e;
	opacity: 0.8;

}
.searchFilter__input:-moz-placeholder {

	/* Firefox 18- */
	color: #6e6e6e;
	opacity: 0.8;

}
.searchFilter__submit{
	display: block;
	width: 22px;
	height: 22px;
	border: 0;
	overflow: hidden;
	background: url('/images/icon-search-gray.svg') no-repeat;
	background-size: 22px 22px;
	position: absolute;
	top: 0;
	bottom: 0;
	margin: auto;
	right: 75px;
	cursor: pointer;
}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.mobile {}

}
@media (max-width: 478px) {
	.mobile .awesomplete > ul > li {
		font-size: 16px;

	}
	.mobile .searchFilter {
		padding: 25px 20px;

	}
	.mobile .searchFilter__submit {
		right: 30px;
		width: 18px;
		height: 18px;
		background-size: 18px 18px;

	}
	.mobile .searchFilter__input {
		padding-right: 34px;
		font-size: 14px;
		font-weight: 500;

	}
	.mobile .searchForm__form--pageTitle {
		margin-top: 0;
		margin-bottom: 0;

	}
	.mobile .searchForm__input {
		font-size: 14px;

	}

}
/* ------------------------------------------------------------------------- */
.cardReference {
	margin: 80px 0;
	padding: 50px;
	background-color: #fff;
  -webkit-box-shadow: 0 3px 15px 0 rgba(0, 0, 0, .2);
          box-shadow: 0 3px 15px 0 rgba(0, 0, 0, .2);
}
.cardReference__title {}
.cardReference__item {
	padding: 50px 0;
	font-size: 16px;
	line-height: 1.5
}
.cardReference__item *:first-child {
	margin-top: 0;

}
.cardReference__item *:last-child {
	margin-bottom: 0;

}
.cardReference__item + .cardReference__item {
	border-top: 1px solid #d6d6d6;

}
@media (max-width: 991px) {
	.mobile .cardReference {
		margin: 54px 0;
		padding: 50px 34px;

	}

}
@media (max-width: 478px) {
	.mobile .cardReference {

		/* margin: 30px 0; */
		padding: 20px;

	}
	.mobile .cardReference__item {
		padding: 30px 0;

	}
	.mobile .cardReference__item p {
		font-size: 14px;

	}

}
.newsAddition__section {
	margin-top: 80px;
	margin-bottom: 80px;
}
.newsAddition__array {
	margin: 45px 0;
}
.newsAddition__item {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex
}
.newsAddition__item + .newsAddition__item {
	margin-top: 45px;

}
.newsAddition__img {
	-ms-flex-negative: 0;
	    flex-shrink: 0;
	margin-top: 8px
}
.newsAddition__img + .newsAddition__group {
	padding-left: 20px;

}
.newsAddition__group {}
.newsAddition__title {
	display: inline-block;
	color: #221F1F;
	font-size: 16px;
	font-weight: 900;
	line-height: 1.5
}
.newsAddition__title span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.newsAddition__title:hover span {
	color: #7e00ff;
	background-size: 100% 1px;

}
.newsAddition__subtitle {
	margin-top: 3px;
	color: #aaaaaa;
	font-size: 14px;
	font-weight: 900;
	line-height: 1.5;
}
.newsAddition__description {
	margin-top: 1.75em;
	color: #221F1F;
	font-size: 14px;
	font-weight: 500;
	line-height: 1.75;
}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.mobile .newsAddition__section {
		margin-top: 40px;
		margin-bottom: 40px;

	}
	.mobile .newsAddition__array {
		margin-top: 30px;

	}
	.mobile .newsAddition__item {}

}
@media (max-width: 478px) {
	.mobile .newsAddition__section {
		margin-top: 30px;
		margin-bottom: 30px;

	}
	.mobile .newsAddition__item {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		position: relative;

	}
	.mobile .newsAddition__img {
		width: 50px;
		position: absolute;
		left: 0;
		top: 0;

	}
	.mobile .newsAddition__group {
		padding-left: 0;

	}
	.mobile .newsAddition__title,
		.mobile .newsAddition__subtitle {
		margin-left: 64px;

	}
	.mobile .newsAddition__description {
		font-weight: 500;

	}

}
/* ------------------------------------------------------------------------- */
.additionMaterial__section {
	margin-top: 80px;
	margin-bottom: 90px;
}
.additionMaterial__array {
	/* width: 100%; */
	margin: 35px 0;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: start;
	    -ms-flex-align: start;
	        align-items: flex-start;
	-ms-flex-wrap: wrap;
	    flex-wrap: wrap;
}

.additionMaterial__item {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	width: calc(33.33333% - 30px);
	margin: 15px;
	-webkit-box-sizing: border-box;
	        box-sizing: border-box
}
.additionMaterial__item .file__icon {
	-webkit-transition: -webkit-box-shadow 0.3s ease;
	transition: -webkit-box-shadow 0.3s ease;
	transition: box-shadow 0.3s ease;
	transition: box-shadow 0.3s ease, -webkit-box-shadow 0.3s ease;

}
.additionMaterial__item:hover .file__icon {
	-webkit-box-shadow: 0 0 9px 0 rgba(120, 48, 202, .39);
	        box-shadow: 0 0 9px 0 rgba(120, 48, 202, .39);

}
.additionMaterial__item:hover .additionMaterial__title {
	color: #7e00ff;

}
.additionMaterial__item:hover .additionMaterial__title span {
	background-size: 100% 1px;

}
.additionMaterial__icon {
	-ms-flex-negative: 0;
	    flex-shrink: 0
}
.additionMaterial__icon .file__icon {
	border-radius: 50%;
	background: #fff;
	-webkit-box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);
	        box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);

}
.additionMaterial__group {
	padding-left: 14px;
	-ms-flex-item-align: center;
	    align-self: center;
}
.additionMaterial__title {
	font-size: 16px;
	font-weight: 900;
	line-height: 1.5
}
.additionMaterial__title span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	background-image: -webkit-gradient(linear,left top, left bottom,from(#7e00ff),to(#7e00ff));
	background-image: linear-gradient(#7e00ff,#7e00ff);

}
.additionMaterial__subtitle {
	margin-top: 3px;
	color: #aaaaaa;
	font-size: 14px;
	font-weight: 900;
	line-height: 1.5;
}
/* ------------------------------------------------------------------------- */
.file__icon {
	width: 80px;
	height: 80px;
	overflow: hidden
}
.file__icon svg {
	width: 80px;
	height: 80px;
	fill: #7e00ff;

}
/* ------------------------------------------------------------------------- */
.mobile .additionMaterial__title span {
	color: #7e00ff;
	background-size: 100% 1px;

}
@media (max-width: 991px) {
	.mobile .additionMaterial__section {
		margin-top: 60px;
		margin-bottom: 60px;

	}
	.mobile .additionMaterial__item {
		width: calc(50% - 30px);

	}

}
@media (max-width: 478px) {
	.mobile .additionMaterial__section {
		margin-top: 30px;
		margin-bottom: 30px;

	}
	.mobile .additionMaterial__array {
		margin-top: 20px;
		margin-bottom: 20px;

	}
	.mobile .additionMaterial__item {
		width: 100% !important;
		margin-left: 0;
		margin-right: 0;

	}
	.mobile .file__icon {
		width: 50px;
		height: 50px;
		overflow: hidden;

	}
	.mobile .file__icon svg {
		width: 50px;
		height: 50px;

	}

}
/* ------------------------------------------------------------------------- */
.audioFile audio {
	display: none;

}
.playControls {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
}
.playControls__control {
	width: 26px;
	height: 26px;
	-ms-flex-negative: 0;
	    flex-shrink: 0;
	overflow: hidden;
	border-radius: 50%;
	position: relative;
  background: linear-gradient(45deg, #0da481 0%, #0da481 30%, #3bcf56 70%, #3bcf56 100%);
	cursor: pointer
}
.playControls__control.playControls__control--play:before {
	content: '';
	display: block;
	width: 26px;
	height: 26px;
	position: absolute;
	z-index: 1;
	background-image: url('/images/audio-play.svg');
	background-size: 26px 26px;
	background-repeat: no-repeat;

}
.playControls__control.playControls__control--pause:before {
	content: '';
	display: block;
	width: 24px;
	height: 24px;
	border-radius: 50%;
	position: absolute;
	top: 1px;
	left: 1px;
	z-index: 1;
	background: #fff;

}
.playControls__control.playControls__control--pause:after {
	content: '';
	dispaly: block;
	width: 24px;
	height: 24px;
	overflow: hidden;
	position: absolute;
	left: 1px;
	top: 1px;
	z-index: 2;
	background-image: url('/images/audio-pause.svg');
	background-size: 24px 24px;
	background-repeat: no-repeat;

}
.playControls__timePassed,
.playControls__duration {
	min-width: 50px;
	padding-left: 10px;
	padding-right: 10px;
	-ms-flex-item-align: center;
	    align-self: center;
	color: #221F1F;
	font-size: 12px;
	line-height: 1;
}
.playControls__duration {
	min-width: 40px;
	padding-right: 0;
	text-align: right;

}
.playControls__timeline {
	width: 100%;
	position: relative;
	cursor: pointer;
	/* &:hover {
		& .timeline__progressHandle {
			transform: scale(1);
		}
	} */
}
.timeline__progressBackground {
	width: 100%;
	height: 6px;
	border-radius: 3px;
	/* margin-top: 10px; */
	background-color: #f0f0f0;
	position: absolute;
	top: 10px;
	z-index: 1;
}
.timeline__progressBar {
	width: 0;
	height: 6px;
	border-radius: 3px;
	position: absolute;
	top: 10px;
	z-index: 2;
  background: linear-gradient(45deg, #0da481 0%, #0da481 30%, #3bcf56 70%, #3bcf56 100%);
}
.timeline__progressHandle {
	width: 10px;
	height: 10px;
	border-radius: 50%;
	margin-left: -5px;
	overflow: hidden;
	background-color: #3bcf56;
	position: absolute;
	top: 8px;
	left: -5px;
	/* left: 100px; */
	z-index: 3;
	-webkit-transform: scale(0);
	        transform: scale(0);
	-webkit-transition: all 0.2s ease;
	transition: all 0.2s ease;
}
.playControls__volume {
	width: 26px;
	height: 26px;
	margin-left: 10px;
	-ms-flex-negative: 0;
	    flex-shrink: 0;
	overflow: hidden;
	background-size: 24px 24px;
	background-position: center;
	background-repeat: no-repeat;
	background-image: url('/images/volume.svg');
	cursor: pointer
}
.playControls__volume.playControls__volume--medium {
	background-image: url('/images/volume-medium.svg');

}
.playControls__volume.playControls__volume--mute {
	background-image: url('/images/volume-mute.svg');

}
/* .volume__progressBackground {}
.volume__progressBar {}
.volume__progressHandle {} */
.social-navigation {
	margin: 10px 0;
	font-size: 0
}
.social-navigation li {
	display: inline-block;
	width: 32px;
	height: 32px;
	overflow: hidden;

}
.social-navigation li:not(:first-child) {
	margin-left: 10px;

}
.social-navigation a {
	-webkit-transition: fill 0.3s ease-in-out;
	transition: fill 0.3s ease-in-out;

}
.social-navigation a svg {
	width: 32px;
	height: 32px;
	fill: #fff;

}
.social-navigation a:hover svg {
	fill: rgba(255, 255, 255, .6);

	/* fill: linear-gradient(45deg,#0da481 0%,#0da481 30%,#92d061 70%, #92d061 100%); */

}
[data-style="card3"] {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	padding: 0 20px;
  -webkit-box-shadow: 0 3px 15px 0 rgba(0, 0, 0, .2);
          box-shadow: 0 3px 15px 0 rgba(0, 0, 0, .2);
  width: calc(25% - 30px);
  margin: 15px;
}
[data-style="card2Content"] {

}
.cardProfile__array {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -ms-flex-wrap: wrap;
      flex-wrap: wrap;
}
.cardProfile__item {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: justify;
      -ms-flex-pack: justify;
          justify-content: space-between;
  overflow: hidden;
  position: relative;
  -webkit-box-shadow: 0 0 40px rgba(0, 0, 0, .2);
          box-shadow: 0 0 40px rgba(0, 0, 0, .2);
  width: calc(33.33333% - 30px);
  margin: 15px
}
.cardProfile__item:hover .cardProfile__images img {
	-webkit-transform: scale(1.15);
	        transform: scale(1.15);

}
.cardProfile__item:hover .cardProfile__name span {
	color: #009cff;
	background-size: 100% 1px;

}
/* --- Картинка --- */
.cardProfile__images {
  /* height: 236px; */
  height: 0;
  padding-bottom: 65.73%;
  overflow: hidden;
  background-repeat: no-repeat;
  background-position: top center;
  background-size: cover;
}
/* --- Описание --- */
.cardProfile__container {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: justify;
      -ms-flex-pack: justify;
          justify-content: space-between;
  padding: 0;
}
.cardProfile__content {
  padding: 35px 22px;
}
.cardProfile__post {
  padding-bottom: 30px;
  font-size: 1.5em;
  font-weight: 900;
}
.cardProfile__name {
  padding-bottom: 10px;
  /* font-size: 1.5em; */
  font-size: 22px;
  font-weight: 900
}
.cardProfile__name span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.cardProfile__city {
  padding-bottom: 20px;
  font-size: 0.9em;
}
.cardProfile__description {
  /* font-size: 1em; */
  font-size: 18px;
  font-weight: 400;
  line-height: 1.5;
}
/* --- Ссылка на всю карточку --- */
.cardProfile__link {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  z-index: 5;
}
/* --- Подвал карточки --- */
.cardProfile__footer {
  position: relative;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-box-pack: justify;
      -ms-flex-pack: justify;
          justify-content: space-between;
  padding: 35px 22px;
  background-color: #f5f5f5;
}
.cardProfile__iconLink {
  /* margin-left: auto; */
  position: relative;
  /* width: 35px;
  height: 35px; */
  /* overflow: hidden; */
  background-image: url('/images/icon-profile-link.svg');
  background-repeat: no-repeat;


  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  z-index: 10;
  background-size: 35px 35px;
  background-position: 95% center;


}
.cardProfile__stat {
  font-size: 1.125em;
}
/* --- Главная карточка --- */
.cardProfile__item--large {
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
      -ms-flex-direction: row;
          flex-direction: row;
  width: calc(100% - 30px);
  margin: 15px
}
.cardProfile__item--large .cardProfile__container {
	-webkit-box-orient: horizontal;
	-webkit-box-direction: normal;
	    -ms-flex-direction: row;
	        flex-direction: row;
	width: 100%;

}
.cardProfile__item--large .cardProfile__images {
	width: 36.5%;
	min-width: 360px;
	height: 340px;
	min-height: 340px;
	padding-bottom: 0;

}
.cardProfile__item--large .cardProfile__images img {
	width: 100%;
	height: 100%;

}
.cardProfile__item--large .cardProfile__content {
	margin-top: auto;
	margin-bottom: auto;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
	padding-left: 30px;
	padding-right: 30px;

}
.cardProfile__item--large .cardProfile__post {}
.cardProfile__item--large .cardProfile__name {}
.cardProfile__item--large .cardProfile__footer {
	-webkit-box-align: end;
	    -ms-flex-align: end;
	        align-items: flex-end;
	width: 15%;

}
.cardProfile__item--large .cardProfile__iconLink {

	/* background-position: right bottom; */
	background-position: 85% 93%;

}
/* --- Карточка с анимацие для дискрипшина --- */
.cardProfile__item--hover {
  position: relative
}
.cardProfile__item--hover:hover .cardProfile__hover {
	-webkit-transform: translateY(0);
	        transform: translateY(0);

}
.cardProfile__item--hover:hover .cardProfile__hover .cardProfile__name {
	color: rgba(255, 255, 255, 1);

}
.cardProfile__item--hover:hover .cardProfile__hover .cardProfile__name span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 100% 1px;

}
.cardProfile__item--hover:hover .cardProfile__hover .cardProfile__city {
	padding-top: 10px;
	color: rgba(255, 255, 255, 1);

}
.cardProfile__item--hover:hover .cardProfile__hover .cardProfile__description {
	color: rgba(255, 255, 255, 1);

}
.cardProfile__item--hover:hover .cardProfile__footer {
	-webkit-transition: background-color 0.1s ease;
	transition: background-color 0.1s ease;
	background-color: rgba(255, 255, 255, .1);

}
.cardProfile__item--hover:hover .cardProfile__footer .cardProfile__stat {
	color: #fff;
	-webkit-transform: translateY(0);
	        transform: translateY(0);

}
.cardProfile__item--hover:hover .cardProfile__iconLink {
	background-image: url('/images/icon-profile-link-white.svg');

}
.cardProfile__item--hover .cardProfile__footer {
	z-index: 10;
	-webkit-transition: background-color 0.35s ease .25s;
	transition: background-color 0.35s ease .25s;

}
.cardProfile__item--hover .cardProfile__footer .cardProfile__stat {
	color: #fff;
	position: absolute;
	-webkit-transform: translateY(300%);
	        transform: translateY(300%);
	-webkit-transition: -webkit-transform 0.3s ease;
	transition: -webkit-transform 0.3s ease;
	transition: transform 0.3s ease;
	transition: transform 0.3s ease, -webkit-transform 0.3s ease;
	-webkit-transition-duration: 0.3s;
	        transition-duration: 0.3s;

}
.cardProfile__item--hover .cardProfile__hover {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	width: 100%;
	height: 100%;
	padding-bottom: 81px;
	position: absolute;
	top: 0;
	left: 0;

	/* background: linear-gradient(45deg, #48b873 0%, #87cd64 100%); */
	background: linear-gradient(45deg, #0da481 0%, #3bcf56 100%);
	-webkit-transform: translateY(100%);
	        transform: translateY(100%);
	-webkit-transition: -webkit-transform .3s ease;
	transition: -webkit-transform .3s ease;
	transition: transform .3s ease;
	transition: transform .3s ease, -webkit-transform .3s ease;

}
.cardProfile__item--hover .cardProfile__hover .cardProfile__hoverWrap {
	padding-left: 22px;
	padding-right: 22px;

}
.cardProfile__item--hover .cardProfile__hover .cardProfile__name {
	color: rgba(255, 255, 255, 0);
	-webkit-transition: color 0.3s ease 0.2s;
	transition: color 0.3s ease 0.2s;

}
.cardProfile__item--hover .cardProfile__hover .cardProfile__name span {
	color: #fff !important;
	background-size: 100% 1px;

}
.cardProfile__item--hover .cardProfile__hover .cardProfile__name span:hover {
	background-size: 100% 1px;

}
.cardProfile__item--hover .cardProfile__hover .cardProfile__city {
	color: rgba(255, 255, 255, 0);
	-webkit-transition: color 0.3s ease 0.2s;
	transition: color 0.3s ease 0.2s;

}
.cardProfile__item--hover .cardProfile__hover .cardProfile__description {
	color: rgba(255, 255, 255, 0);
	-webkit-transition: color 0.3s ease 0.2s;
	transition: color 0.3s ease 0.2s;

}
.cardProfile__item--hover .cardProfile__hoverClose {
	width: 55px;
	height: 55px;
	overflow: hidden;
	visibility: hidden;
	position: absolute;
	top: 0;
	right: 0;
	z-index: 10;
	cursor: pointer;
	opacity: 0;
	-webkit-transform: translateY(200%);
	        transform: translateY(200%);
	-webkit-transition: .3s ease;
	transition: .3s ease;
	-webkit-transition-property: opacity, -webkit-transform;
	transition-property: opacity, -webkit-transform;
	transition-property: opacity, transform;
	transition-property: opacity, transform, -webkit-transform;

}
.cardProfile__item--hover .cardProfile__hoverClose:after,
    .cardProfile__item--hover .cardProfile__hoverClose:before {
	content:'';
	width: 55%;
	height: 3px;
	position: absolute;
	top:0;
	left:0;
	right: 0;
	bottom:0;
	margin: auto;
	background-color: #fff;
	-webkit-transition: background-color 0.3s ease-in-out;
	transition: background-color 0.3s ease-in-out;

}
.cardProfile__item--hover .cardProfile__hoverClose:before {
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);

}
.cardProfile__item--hover .cardProfile__hoverClose:after {
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);

}
.cardProfile__item--blog .cardProfile__hover {
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-webkit-box-align: start;
	    -ms-flex-align: start;
	        align-items: flex-start;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;

}
.cardProfile__item--blog .cardProfile__hoverWrap {
	padding: 0;

}
.cardProfile__item--blog .cardProfile__footer .cardProfile__stat {
	color: #221F1F;
	-webkit-transform: translateY(0);
	        transform: translateY(0);
	-webkit-transition: color .3s;
	transition: color .3s;

}
.cardProfile__item--blog ul[data-style="cardTags"] {
	margin-top: 15px;
	padding: 15px 0 50px;
	border-top: 1px solid rgba(255, 255, 255, .2);
	opacity: 0;
	-webkit-transition: opacity 0.3s ease 0.2s;
	transition: opacity 0.3s ease 0.2s;

}
.cardProfile__item--blog ul[data-style="cardTags"] a {
	font-size: 16px;
	color: #fff;

}
.cardProfile__item--blog:hover .cardProfile__name span {
	color: #221F1F;
	background-size: 0% 1px;

}
.cardProfile__item--blog:hover ul[data-style="cardTags"] {
	opacity: 1;

}
.cardProfile__item--blog:hover .cardProfile__footer .cardProfile__stat {
	color: #fff;

}
.cardProfile__item--eng .cardProfile__content {
	padding-top: 25px;
	padding-bottom: 40px;

}
.cardProfile__item--eng .cardProfile__post {
	font-size: 24px;

}
.cardProfile__item--eng .cardProfile__name {
	padding-bottom: 20px;
	font-size: 18px;

}
.cardProfile__item--eng .cardProfile__linkEng {
	margin-top: 30px;
	color: #009cff;
	font-size: 16px;
	font-weight: 900;
	text-decoration: underline;

}
.mobile {
  /*  */
}
.mobile .cardProfile__name span {
	color: #221F1F !important;
	background-size: 100% 1px !important;

}
.mobile {

	/*  */

}
.mobile .cardProfile__item.cardProfile__item--blog ul[data-style="cardTags"] {
	margin-top: 10px;
	padding: 10px 0;

}
.mobile .cardProfile__item.cardProfile__item--blog:hover .cardProfile__footer .cardProfile__stat {
	color: #221F1F;
	-webkit-transform: translateY(0);
	        transform: translateY(0);

}
.mobile .cardProfile__item.cardProfile__item--hover.cardProfile__item--active .cardProfile__hoverClose {
	visibility: visible;
	opacity: 1;
	-webkit-transform: translateY(0%);
	        transform: translateY(0%);

}
.mobile .cardProfile__item.cardProfile__item--hover.cardProfile__item--active ul[data-style="cardTags"] {
	opacity: 1;

}
.mobile .cardProfile__item.cardProfile__item--hover.cardProfile__item--active .cardProfile__hover {
	-webkit-transform: translateY(0);
	        transform: translateY(0);

}
.mobile .cardProfile__item.cardProfile__item--hover.cardProfile__item--active .cardProfile__hover .cardProfile__name {
	color: rgba(255, 255, 255, 1);

}
.mobile .cardProfile__item.cardProfile__item--hover.cardProfile__item--active .cardProfile__hover .cardProfile__city {
	padding-top: 10px;
	color: rgba(255, 255, 255, 1);

}
.mobile .cardProfile__item.cardProfile__item--hover.cardProfile__item--active .cardProfile__hover .cardProfile__description {
	color: rgba(255, 255, 255, 1);

}
.mobile .cardProfile__item.cardProfile__item--hover.cardProfile__item--active .cardProfile__footer {
	-webkit-transition: background-color 0.1s ease;
	transition: background-color 0.1s ease;
	background-color: rgba(255, 255, 255, .1);

}
.mobile .cardProfile__item.cardProfile__item--hover.cardProfile__item--active .cardProfile__footer .cardProfile__stat {
	color: #fff;
	-webkit-transform: translateY(0);
	        transform: translateY(0);

}
.mobile .cardProfile__item.cardProfile__item--hover.cardProfile__item--active .cardProfile__iconLink {
	background-image: url('/images/icon-profile-link-white.svg');

}
.mobile .cardProfile__item:hover .cardProfile__hover {
	-webkit-transform: translateY(100%);
	        transform: translateY(100%);

}
.mobile .cardProfile__item:hover .cardProfile__hover .cardProfile__name {
	color: rgba(255, 255, 255, 0);

}
.mobile .cardProfile__item:hover .cardProfile__hover .cardProfile__name span {
	color: #fff !important;

}
.mobile .cardProfile__item:hover .cardProfile__hover .cardProfile__city {
	padding-top: 0;
	color: rgba(255, 255, 255, 0);

}
.mobile .cardProfile__item:hover .cardProfile__hover .cardProfile__description {
	color: rgba(255, 255, 255, 0);

}
.mobile .cardProfile__item:hover .cardProfile__footer {
	-webkit-transition: background-color 0.2s ease .25s;
	transition: background-color 0.2s ease .25s;
	background-color: #f5f5f5;

}
.mobile .cardProfile__item:hover .cardProfile__stat {
	-webkit-transform: translateY(300%);
	        transform: translateY(300%);

}
.mobile .cardProfile__item:hover .cardProfile__iconLink {
	background-image: url('/images/icon-profile-link.svg');

}
.mobile .cardProfile__item .cardProfile__name {
	display: block;
	margin-bottom: 2px;

}
.mobile .cardProfile__item .cardProfile__city {
	margin: 0;
	padding: 0;

}
.mobile .cardProfile__item .cardProfile__description {
	margin-top: 10px;

}
.mobile .cardProfile__item .cardProfile__hoverWrap {
	overflow-y: auto;
	position: absolute;
	top: 45px;
	bottom: 90px;

}
@media (max-width: 991px) {
	.mobile .cardProfile__item:not(.cardProfile__item--large) {
		width: calc(50% - 30px);
		margin: 15px;

	}
	.mobile .cardProfile__item:not(.cardProfile__item--large) .cardProfile__images {

		/* height: 270px; */

	}
	.mobile {

		/* & .cardProfile__item:not(.cardProfile__item--speaker):not(.cardProfile__item--large):not(.cardProfile__item--eng) {
      & .cardProfile__content {
        padding: 20px;
      }

      & .cardProfile__name {
        padding-bottom: 5px;
      }

      & .cardProfile__city {
        padding-bottom: 0;
      }

      & .cardProfile__description {
        margin-top: 0.75em;
        font-size: 16px;
      }
    } */

	}

}
@media (max-width: 768px) {
	.mobile {

		/* & .cardProfile__item--large {
      flex-direction: column;
      & .cardProfile__images {
        width: 100%;
        min-width: 100%;
        height: 0;
        min-height: 0;
        padding-bottom: 65.73%;

        & img {
          width: 100%;
          height: 100%;
        }
      }
      & .cardProfile__container {
        flex-direction: column;
      }
      & .cardProfile__footer {
        width: 100%;
      }
      & .cardProfile__iconLink {
        width: 20px;
        height: 20px;
        left: auto;
        top: 25px;
        right: 20px;
        background-size: 20px 20px;
      }
    } */

	}
	.mobile .cardProfile__item--large .cardProfile__footer {
		display: none;

	}
	.mobile .cardProfile__item:not(.cardProfile__item--large) {
		width: calc(50% - 30px);
		margin: 15px;

	}

}
@media (max-width: 478px) {
	.mobile .cardProfile__item--large {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .cardProfile__item--large .cardProfile__images {
		width: 100%;
		min-width: 100%;
		height: 0;
		min-height: 0;
		padding-bottom: 65.73%;

	}
	.mobile .cardProfile__item--large .cardProfile__images img {
		width: 100%;
		height: 100%;

	}
	.mobile .cardProfile__item--large .cardProfile__container {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .cardProfile__item--large .cardProfile__footer {
		display: block;
		width: 100%;

	}
	.mobile .cardProfile__item--large .cardProfile__iconLink {
		width: 20px;
		height: 20px;
		left: auto;
		top: 25px;
		right: 20px;
		background-size: 20px 20px;

	}
	.mobile .cardProfile__item:not(.cardProfile__item--large) {
		width: calc(100% - 30px);
		margin: 15px;

		/* &:hover {
        & .cardProfile__footer {
          background-color: #f5f5f5;
        }
        & .cardProfile__hover {
          display: none;
        }
        & .cardProfile__stat {
          color: var(--gray);
        }
        & .cardProfile__iconLink {
          animation: none;
          background-image: url('/images/icon-profile-link.svg');
        }
      } */

	}
	.mobile .cardProfile__city {
		font-size: 14px;

	}
	.mobile .cardProfile__post {
		font-size: 18px;

	}
	.mobile .cardProfile__item--eng .cardProfile__content {
		padding-bottom: 30px;

	}
	.mobile .cardProfile__item--eng .cardProfile__post {
		font-size: 20px;
		padding-bottom: 15px;

	}
	.mobile .cardProfile__item--eng .cardProfile__name {
		font-size: 16px;
		padding-bottom: 15px;

	}
	.mobile .cardProfile__item--eng .cardProfile__linkEng {
		font-size: 16px;

	}
	.mobile {

		/* & .cardProfile__footer {
      display: none;
    } */

	}

}
.profileTitleCard {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  min-height: 400px;
  position: relative;
  margin-top: -44px;
  -webkit-box-shadow: 0px 0px 40px 0px rgba(0, 0, 0, .2);
          box-shadow: 0px 0px 40px 0px rgba(0, 0, 0, .2);
  background: #fff;
}
/* ----- Картинка ----- */
.profileTitleCard__img {
  width: 48%;
}
/* ----- Инфа ----- */
.profileTitleCard__container {
  -ms-flex-item-align: center;
      align-self: center;
  width: 52%;
  padding: 0 100px;
  line-height: 1.5em;
}
.profileTitleCard__name {
  margin-bottom: 20px;
  font-size: 1.875em;
  font-weight: 900;
  line-height: 1
}
.profileTitleCard__name span {
	display: block;
	margin-bottom: 5px;
	text-transform: uppercase;

}
/* .profileTitleCard__date {
  margin-bottom: 30px;
} */
.profileTitleCard__location {
  margin-top: 40px;
  font-size: 14px;
  font-weight: 400;
  line-height: 1.75
}
.profileTitleCard__location + .profileTitleCard__post {
	margin-top: 0px;

}
.profileTitleCard__post {
  margin-top: 40px;
  margin-bottom: 30px;
  font-size: 18px;
  font-weight: 500;
  line-height: 1.75;
}
/* ----- Социалки ----- */
.profileTitleCard__social {

}
.profileTitleCard__socialTitle {
  font-size: 16px;
  font-weight: 900;
  margin-bottom: 15px;
}
.profileTitleCard__socialNavigation {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
}
.profileTitleCard__socialIcon {
  position: relative;
  width: 38px;
  height: 38px;
  overflow: hidden;
  border: 1px solid #33b178;
  border-radius: 3px;
  -webkit-box-sizing: border-box;
          box-sizing: border-box
}
.profileTitleCard__socialIcon:not(:last-child) {
	margin-right: 8px;

}
.profileTitleCard__socialIcon svg {
	width: 36px;
	height: 36px;
	fill: #fff;
	stroke: #33b178;

}
.profileTitleCard__socialIcon:hover {

	/* @apply --green-gradient-07; */

}
.profileTitleCard__link {
  display: block;
  height: 100%;
}
.mobile .profileTitleCard__container {
	padding-left: 40px;
	padding-right: 40px;

}
.mobile {

	/* @media (--to-tablet) {
    & .profileTitleCard {
      flex-direction: column;
      margin-top: -20px;
    }

    & .profileTitleCard__social {
      display: none;
    }

    & .profileTitleCard__img {
      width: 100%;
      height: 0;
      padding-bottom: 64.24%;
    }

    & .profileTitleCard__container {
      align-self: auto;
      width: 100%;
      padding: 50px 15px;
    }

    & .profileTitleCard__info {
      display: flex;
      align-items: flex-start;
      flex-wrap: wrap;
    }

    & .profileTitleCard__name,
    & .profileTitleCard__post {
      @apply --width1x2;
      min-width: 236px;
      flex-grow: 1;
    }

    & .profileTitleCard__location {
      @apply --width;
      flex-grow: 1;
      font-weight: 400;
      margin-bottom: -15px;
    }

    & .profileTitleCard__post {
      font-size: 18px;
    }
  } */

}
@media (max-width: 478px) {
	.mobile .profileTitleCard {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		margin-top: -20px;

	}
	.mobile .profileTitleCard__img {
		width: 100%;
		height: 0;
		padding-bottom: 64.24%;

	}
	.mobile .profileTitleCard__social {
		display: none;

	}
	.mobile .profileTitleCard__container {
		-ms-flex-item-align: auto;
		    align-self: auto;
		width: 100%;
		padding: 30px 25px;

	}
	.mobile .profileTitleCard__info {
		display: -webkit-box;
		display: -ms-flexbox;
		display: flex;
		-webkit-box-align: start;
		    -ms-flex-align: start;
		        align-items: flex-start;
		-ms-flex-wrap: wrap;
		    flex-wrap: wrap;

	}
	.mobile .profileTitleCard__name {
		font-size: 24px;

	}
	.mobile .profileTitleCard__name span {
		display: inline;

	}
	.mobile .profileTitleCard__location {
		font-size: 16px;

	}
	.mobile .profileTitleCard__post {
		margin-top: 10px;
		margin-bottom: 10px;
		font-size: 18px;
		line-height: 1.5;

	}

}
.companyCard {
  width: calc(33.33333% - 30px);
  margin: 15px;
  -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
          box-shadow: 0 0 20px rgba(0, 0, 0, .25);
  /* transition: box-shadow .2s ease; */
  /* &:hover {
    box-shadow: 0 3px 15px 0 rgba(0, 0, 0, 0.6);
  } */
}
/* ----- Картинка карточки ----- */
.companyCard__img {
  height: 200px;
}
/* ----- Описание карточки ----- */
.companyCard__description {
  padding: 0 30px 40px;
  font-weight: 500;
}
.companyCard__title {
  margin-bottom: 5px;
  font-size: 1.5em;
  font-weight: 900;
}
.companyCard__city {
  margin-bottom: 30px;
}
.companyCard__type {
  margin-bottom: 5px;
}
.companyCard__text {
  margin-bottom: 25px;
}
.companyCard__link {
  color: #20a6fc;
}
.partnersCard {
  width: calc(50% - 30px);
  margin: 15px;
  -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
          box-shadow: 0 0 20px rgba(0, 0, 0, .25);
  /* transition: box-shadow .2s ease; */
  /* &:hover {
    box-shadow: 0 3px 15px 0 rgba(0, 0, 0, 0.6);
  } */
}
/* ----- Картинка карточки ----- */
.partnersCard__img {
  height: 200px;
  background-repeat: no-repeat;
  background-position: center;
}
/* ----- Описание карточки ----- */
.partnersCard__description {
  padding: 0 30px 40px;
  font-weight: 500;
}
.partnersCard__title {
  margin-bottom: 25px;
  font-size: 1.5em;
  font-weight: 900;
}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.mobile .partnersCard {}

}
@media (max-width: 478px) {
	.mobile .partnersCard {
		width: calc(100% - 30px);
		margin: 15px;

	}
	.mobile .partnersCard__title {
		font-size: 18px;

	}

}
.distribution {
  background-color: #F2F2F2;
}
.distribution__content {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  padding: 60px 0;
  font-weight: 500;
}
.distribution__main {
  width: 84%;
  padding-right: 50px;
  border-right: 1px solid #A2A2A2
}
.distribution__pic {
  width: 16%;
}
/* --- Блок с текстом --- */
.distribution__text {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: justify;
      -ms-flex-pack: justify;
          justify-content: space-between;
  -webkit-box-align: start;
      -ms-flex-align: start;
          align-items: flex-start;
  margin-bottom: 30px;
}
.distribution__title {
  margin-right: 20px;
  padding-left: 20px;
  white-space: nowrap;
  font-size: 1.5em;
  color: #009cff;
}
.distribution__description {
  -ms-flex-preferred-size: 500px;
      flex-basis: 500px;
  padding-top: 6px;
  padding-right: 20px;
  font-size: 0.875em;
  color: #232323;
}
/* --- Инпут --- */
.distribution__form {
  position: relative;
}
.distribution__input {
  width: 100%;
  padding: 15px 60px 15px 30px;
  border-radius: 31px;
  border: 1px solid #eff0f6;
  font-family: Gilroy;
  font-size: 1.5em;
  font-weight: 500;
  color: rgba(35, 35, 35, .4);
  overflow: hidden
}
.distribution__input:focus {
	outline: none;

}
.distribution__input {

	/* - placeholder - */

}
.distribution__input::-webkit-input-placeholder {
	color: rgba(35, 35, 35, .4);
	-webkit-transition: text-indent 0.3s ease, opacity 0.3s ease;
	transition: text-indent 0.3s ease, opacity 0.3s ease;

}
.distribution__input:-moz-placeholder           {
	color: rgba(35, 35, 35, .4);
	-webkit-transition: text-indent 0.3s ease, opacity 0.3s ease;
	transition: text-indent 0.3s ease, opacity 0.3s ease;

}
.distribution__input:-ms-input-placeholder      {
	color: rgba(35, 35, 35, .4);
	-webkit-transition: text-indent 0.3s ease, opacity 0.3s ease;
	transition: text-indent 0.3s ease, opacity 0.3s ease;

}
.distribution__input::-moz-placeholder          {
	color: rgba(35, 35, 35, .4);
	-webkit-transition: text-indent 0.3s ease, opacity 0.3s ease;
	transition: text-indent 0.3s ease, opacity 0.3s ease;

}
.distribution__input:focus::-webkit-input-placeholder {
	text-indent: 20px;
	opacity:0;

}
.distribution__input:focus::-moz-placeholder          {
	text-indent: 20px;
	opacity:0;

}
.distribution__input:focus:-moz-placeholder           {
	text-indent: 20px;
	opacity:0;

}
.distribution__input:focus:-ms-input-placeholder      {
	text-indent: 20px;
	opacity:0;

}
.distribution__button {
  position: absolute;
  top: 18px;
  right: 25px;

  width: 22px;
  height: 23px;
  padding: 0px;
  border: none;
  background: url('/images/arrow-right.svg') 50% 50%/cover no-repeat;
  -webkit-transition: -webkit-transform .3s ease;
  transition: -webkit-transform .3s ease;
  transition: transform .3s ease;
  transition: transform .3s ease, -webkit-transform .3s ease;
  cursor: pointer
}
.distribution__button:focus {
	outline: none;

}
.distribution__button:hover {
	-webkit-transform: scale(0.95);
	        transform: scale(0.95);

}
.distribution__button:active {
	-webkit-transform: scale(0.75);
	        transform: scale(0.75);

}
/* --- Иконка --- */
.distribution__pic {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
      -ms-flex-pack: center;
          justify-content: center;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
}
.distribution__icon {
  margin: 0 auto 15px;
  width: 30px;
  height: 30px;
  background: url('/images/icon-rss-distribution.svg') 50% 50%/cover no-repeat;
}
.distribution__iconName {
  font-size: 1.125em;
  color: rgba(35, 35, 35, .8);
}
.form {
	color:#fff;
	margin: 80px auto;
	padding: 50px 80px;
	font-size: 18px;
	background: linear-gradient(45deg, #0da481 0%, #88cc65 100%)

	/* @apply --green-gradient-01; */
}
.form [data-style="inputText"],
	.form [data-style="textarea"],
	.form .inputSelect {
	margin: 15px;

}
.form .blockName {
	width: calc(100% - 30px);
	margin: 15px;

}
.form .inputText__error,
	.form .textarea__error,
	.form .checkbox__error {

	/* color: var(--gold); */

	/* color: rgba(255,0,0,0.5); */

	/* color: var(--error-for-green-bg); */

	/* color: #9E43BB; */
	color: #E9E114;
	font-weight: 900;

}
.form .hasError:before {
	background-color: #E9E114;

	/* background-color: var(--error-for-green-bg); */

	/* background-color: #9E43BB; */

	/* background-color: rgba(255,0,0,0.5); */

	/* background-color: var(--gold); */

}
.form.form--white {
	padding: 0;
	background: #fff;
	color: #221F1F;

}
.form.form--white .form__agree-pseudoCheckbox {
	border: 2px solid #221F1F;

}
.form.form--white .form__agree-button {
	background: #009cff;
	color: #fff;

}
.form.form--white .loadFileDrugNDrop__label {
	font-weight: 900;
	color: #009cff;
	border-color: #888;

}
.form.form--white [data-style="inputText"]:before, .form.form--white [data-style="textarea"]:before, .form.form--white .inputSelect:before {
	background-color: #5f5f5f;

}
.form.form--white [data-style="inputText"]:after, .form.form--white [data-style="textarea"]:after, .form.form--white .inputSelect:after {
	background-color: #009cff;

}
.form.form--white .link-style {
	color: #009cff;

}
.form.form--white .form__emptySize {
	margin-top: 40px;
	margin-bottom: 40px;

}
.form.form--white .form__emptySize .form__sendButtons {
	height: auto;

}
.form.form--white .loadFileDrugNDrop__placeholder span {
	color: #221F1F;

}
.form.form--white .form__button {
	border: 2px solid #009cff;
	color: #009cff;

}
.form.form--white .form__button:hover {
	border-color: #009cff;
	color: #fff;
	background-color: #009cff;

}
.form.form--white .inputText__error,
		.form.form--white .textarea__error,
		.form.form--white .checkbox__error {
	color: #f72e2e;

}
.form.form--white .hasError:before {
	background-color: #f72e2e;

}
.form.form--white .inputSelect__iconDown svg {
	fill: #221F1F;
	stroke: #221F1F;

}
.form__inputs {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex
}
.form__inputs > div {
	width: 50%;

}
.form__emptySize {
	height: auto;
  width: calc(100% - 30px);
  margin: 15px;
}
.form__sendButtons {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	font-size: .75em;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
}
/* ------------------------------------------------------------------------- */
.form__button {
	display: inline-block;
	padding: 15px 30px;
	border: 2px solid #fff;
	color: #fff;
	font-size: 16px;
	font-weight: 500;
	white-space: nowrap;
	text-decoration: underline;
	cursor: pointer;
	-webkit-transition: all 0.3s ease;
	transition: all 0.3s ease;
	background-color: transparent;
	-webkit-appearance: none;
	   -moz-appearance: none;
	        appearance: none;
	cursor: pointer
}
.form__button:hover {
	border-color: #fff;
	color: #009cff;
	background-color: #fff;

}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.mobile .form {
		padding: 20px 0;
		margin-top: 40px;
		margin-bottom: 40px;

	}
	.mobile .form.form--white .form__button {
		color: #fff;
		background-color: #20a6fc;

	}
	.mobile .form__agree span:nth-of-type(2) {
		min-width: 250px;

	}
	.mobile .form__button {
		padding-left: 4em;
		padding-right: 4em;

	}
	.mobile .form__agree {
		padding-right: 0;

	}

}
@media (max-width: 515px) {
	.mobile .form__sendButtons {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		-webkit-box-align: start;
		    -ms-flex-align: start;
		        align-items: flex-start;

	}
	.mobile .form__agree {
		margin-bottom: 30px;

	}
	.mobile .form__button {
		-ms-flex-item-align: center;
		    align-self: center;

	}

}
@media (max-width: 478px) {
	.mobile .form {
		margin-top: 30px;
		margin-bottom: 30px;

	}
	.mobile .form .blockName {
		margin-top: 0;
		font-size: 24px;

	}
	.mobile .form__inputs {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .form__inputs > div {
		width: 100%;

	}
	.mobile .form .form__emptySize {
		margin-top: 30px !important;
		margin-bottom: 30px !important;

	}

}
/* -------------------------------------------------------------------------- */
.info__section {
	margin-top: 110px;
	margin-bottom: 110px
}
.info__section .sectionName {
	padding-left: 15px;
	padding-right: 15px;
	margin-bottom: 30px;
	font-size: 24px;

}
.info__array .infoCard {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	padding: 15px;

}
.info__array .infoCard.w1 {
	width: 25%;

}
.info__array .infoCard.w1_3 {
	width: 33.33%;

}
.info__array .infoCard.w2 {
	width: 50%;

}
.info__array .infoCard.w3 {
	width: 75%;

}
.info__array .infoCard.w4 {
	width: 100%;

}
.info__array .infoCard.h1 {
	height: 270px;

}
.info__array .infoCard.h2 {
	height: 540px;

	/* 270*2 */

}
@media only screen and (max-width : 768px) {
	.info__array .infoCard.h2 {
		height: auto;

		/* 270*2 */

	}
}
.info__array .infoCard.h3 {
	height: 1000px;

	/* 270*3 */
	height: 810px;

}
.info__array .infoCard.h4 {
	height: 960px;

	/* 270*4 */

}
.info__array.info__array--withoutMasonry {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	    flex-wrap: wrap;

}
/* ------------------------------------------------------------------------- */
.infoCard__wrap {
	width: 100%;
	background: #fff;
	position: relative;
  -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
          box-shadow: 0 0 20px rgba(0, 0, 0, .25);
}
.infoCard__image {
	overflow: hidden
}
.infoCard__image span {
	display: block;
	height: 100%;
	background-size: cover;
	background-repeat: no-repeat;
	background-position: center;
	-webkit-transition: -webkit-transform 0.3s ease;
	transition: -webkit-transform 0.3s ease;
	transition: transform 0.3s ease;
	transition: transform 0.3s ease, -webkit-transform 0.3s ease;

}
.infoCard__image:hover span {
	-webkit-transform: scale(1.1);
	        transform: scale(1.1);

}
a.infoCard__image:hover ~ .infoCard__content .infoCard__head span {
	background-size: 100% 1px;

}
.infoCard__content {
	margin: 30px
}
.infoCard__content ul.list {
	font-size: 16px;

}
.infoCard__content p {
	font-size: 16px;
	margin: 0.5em 0;

}
.infoCard__head {
	color: #221F1F;
	font-size: 24px;
	font-weight: 900
}
.infoCard__head span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.infoCard__head:hover span {
	background-size: 100% 1px;

}
.infoCard__location {
	margin: 0.5em 0;
}
.infoCard__titleDescription {
	margin-top: 25px;
	font-weight: 500
}
.infoCard__titleDescription + .infoCard__description {
	margin-top: 5px;

}
.infoCard__description {
	margin-top: 25px;
	color: #221F1F;
	font-sizre: 16px;
	line-height: 1.5;
}
.infoCard__site {
	margin: 25px 0 5px;
	color: #009cff;
}
/* ------------------------------------------------------------------------- */
/* Вертикальный вид, картинка сверху, описание снизу */
.infoCard.infoCard--viewVertical .infoCard__wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;

}
.infoCard.infoCard--viewVertical .infoCard__image {
	height: 270px;
	-webkit-box-ordinal-group: 1;
	    -ms-flex-order: 0;
	        order: 0;

}
.infoCard.infoCard--viewVertical .infoCard__content {
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
	-webkit-box-ordinal-group: 2;
	    -ms-flex-order: 1;
	        order: 1;

}
.infoCard.infoCard--viewVertical.w1 .infoCard__image {
	height: 165px;

}
/* ------------------------------------------------------------------------- */
/* Вертикальный вид, картинка снизу, описание сверху, описание тянется */
.infoCard.infoCard--viewVerticalReverse .infoCard__wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;

}
.infoCard.infoCard--viewVerticalReverse .infoCard__image {
	height: 270px;
	-webkit-box-ordinal-group: 2;
	    -ms-flex-order: 1;
	        order: 1;

}
.infoCard.infoCard--viewVerticalReverse .infoCard__content {
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
	-webkit-box-ordinal-group: 1;
	    -ms-flex-order: 0;
	        order: 0;

}
.infoCard.infoCard--viewVerticalReverse.w1 .infoCard__image {
	min-height: 165px;

}
/* ------------------------------------------------------------------------- */
/* Горизонтальный вид, картинка слева, описание справа */
.infoCard.infoCard--viewHorizontal .infoCard__wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: horizontal;
	-webkit-box-direction: normal;
	    -ms-flex-direction: row;
	        flex-direction: row;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;

}
.infoCard.infoCard--viewHorizontal .infoCard__image {
	min-width: 200px;

}
.infoCard.infoCard--viewHorizontal .infoCard__content {}
/* ------------------------------------------------------------------------- */
/* Горизонтальный вид, картинка справа, описание слева */
.infoCard.infoCard--viewHorizontalReverse .infoCard__wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: horizontal;
	-webkit-box-direction: normal;
	    -ms-flex-direction: row;
	        flex-direction: row;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;

}
.infoCard.infoCard--viewHorizontalReverse .infoCard__image {
	min-width: 200px;
	-webkit-box-ordinal-group: 2;
	    -ms-flex-order: 1;
	        order: 1;

}
.infoCard.infoCard--viewHorizontalReverse .infoCard__content {
	-webkit-box-ordinal-group: 1;
	    -ms-flex-order: 0;
	        order: 0;

}
/* ------------------------------------------------------------------------- */
/* Вертикальный вид, с градиентом в зоне контента */
.infoCard.infoCard--gradientContent .infoCard__wrap {
	background: linear-gradient(45deg, #0da481 0%, #0da481 30%, #3bcf56 70%, #3bcf56 100%);

}
.infoCard.infoCard--gradientContent .infoCard__image {
	min-height: 200px;

}
.infoCard.infoCard--gradientContent .infoCard__image span {
	background-size: auto;
	background-position: center;
	background-color: #fff;

}
.infoCard.infoCard--gradientContent .infoCard__content {
	text-align: center;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;

}
.infoCard.infoCard--gradientContent .infoCard__head {
	color: #fff;
	-ms-flex-item-align: center;
	    align-self: center;

}
/* ------------------------------------------------------------------------- */
/* Вид карточки полностью залитой градиентом и с иконкой и заголовком в верхней части */
.infoCard.infoCard--gradientWithIconTop {
	min-height: 240px
}
.infoCard.infoCard--gradientWithIconTop .infoCard__wrap {
	-webkit-box-shadow: none;
	        box-shadow: none;
	background: linear-gradient(45deg, rgba(13, 164, 129, .78) 0%, rgba(13, 164, 129, .78) 20%, rgba(239, 240, 75, .78) 80%, rgba(239, 240, 75, .78) 100%);

}
.infoCard.infoCard--gradientWithIconTop .infoCard__image {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;

}
.infoCard.infoCard--gradientWithIconTop .infoCard__image svg {
	margin: 30px 0;
	width: 70px;
	height: 70px;
	fill: #ffea00;

}
.infoCard.infoCard--gradientWithIconTop .infoCard__head {
	padding: 10px 0;
	color: #fff;

}
/* ------------------------------------------------------------------------- */
/* Вид карточки полностью залитой градиентом и с иконкой и заголовком в нижней части */
.infoCard.infoCard--gradientWithIconBottom {
	/* min-height: 240px; */
}
.infoCard.infoCard--gradientWithIconBottom .infoCard__wrap {
	-webkit-box-shadow: none;
	        box-shadow: none;
	background: linear-gradient(45deg, rgba(13, 164, 129, .78) 0%, rgba(13, 164, 129, .78) 20%, rgba(239, 240, 75, .78) 80%, rgba(239, 240, 75, .78) 100%);

}
.infoCard.infoCard--gradientWithIconBottom .infoCard__image {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: end;
	    -ms-flex-align: end;
	        align-items: flex-end;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;

}
.infoCard.infoCard--gradientWithIconBottom .infoCard__image svg {
	margin: 30px 0;
	width: 70px;
	height: 70px;
	fill: #ffea00;

}
.infoCard.infoCard--gradientWithIconBottom .infoCard__content {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: end;
	    -ms-flex-align: end;
	        align-items: flex-end;

}
.infoCard.infoCard--gradientWithIconBottom .infoCard__head {
	color: #fff;
	padding: 10px 0;

}
/* ------------------------------------------------------------------------- */
/* Вид карточки для вывода компаний */
.infoCard.infoCard--company .infoCard__content {

	/* display: flex;
		flex-direction: column;
		justify-content: space-between; */

}
.infoCard.infoCard--company .infoCard__description {

	/* overflow-y: hidden; */
	position: relative;

	/* &:after {
			content: '';
			display: block;
			height: 15px;
			position: absolute;
			bottom: 0;
			left: 0;
			right: 0;
			background: linear-gradient(rgba(255,255,255,0), rgba(255,255,255,1));
		} */

}
.infoCard.infoCard--company .infoCard__image {
	height: 175px;
	-webkit-box-flex: 0;
	    -ms-flex-positive: 0;
	        flex-grow: 0;
	-ms-flex-negative: 0;
	    flex-shrink: 0;

}
.infoCard.infoCard--company .infoCard__image span {
	background-size: auto;

}
/* ------------------------------------------------------------------------- */
.mobile .infoCard__head {
	font-size: 20px;

}
.mobile .infoCard__head span {
	background-size: 100% 1px;

}
@media (min-width: 992px) {
	.mobile .infoCard--viewHorizontal:not(.infoCard--gradientWithIconBottom) .infoCard__content {
		position: relative;
		overflow: hidden;

	}
	.mobile .infoCard--viewHorizontal:not(.infoCard--gradientWithIconBottom) .infoCard__content:after {
		content: '';
		display: block;
		width: 100%;
		height: 30px;
		position: absolute;
		bottom: 0;
		left: 0;
		background: -webkit-gradient(linear, left bottom, left top, color-stop(25%, rgba(255, 255, 255, 1)), to(rgba(255, 255, 255, 0)));
		background: linear-gradient(0deg, rgba(255, 255, 255, 1) 25%, rgba(255, 255, 255, 0) 100%);

	}

}
@media (max-width: 991px) {
	.mobile .info__section {
		margin-top: 60px;
		margin-bottom: 60px;

	}
	.mobile .infoCard--viewHorizontal.infoCard.w1,
			.mobile .infoCard--viewHorizontal.infoCard.w1_3,
			.mobile .infoCard--viewHorizontal.infoCard.w2,
			.mobile .infoCard--viewHorizontal.infoCard.w3,
			.mobile .infoCard--viewHorizontalReverse.infoCard.w1,
			.mobile .infoCard--viewHorizontalReverse.infoCard.w1_3,
			.mobile .infoCard--viewHorizontalReverse.infoCard.w2,
			.mobile .infoCard--viewHorizontalReverse.infoCard.w3 {
		width: 100%;

	}
	.mobile .infoCard--viewHorizontal.infoCard.h1,
			.mobile .infoCard--viewHorizontal.infoCard.h2,
			.mobile .infoCard--viewHorizontal.infoCard.h3,
			.mobile .infoCard--viewHorizontal.infoCard.h4,
			.mobile .infoCard--viewHorizontalReverse.infoCard.h1,
			.mobile .infoCard--viewHorizontalReverse.infoCard.h2,
			.mobile .infoCard--viewHorizontalReverse.infoCard.h3,
			.mobile .infoCard--viewHorizontalReverse.infoCard.h4 {
		height: auto;

	}
	.mobile .infoCard--viewHorizontal .infoCard__wrap, .mobile .infoCard--viewHorizontalReverse .infoCard__wrap {
		-webkit-box-align: stretch;
		    -ms-flex-align: stretch;
		        align-items: stretch;

	}
	.mobile .infoCard--viewHorizontal .infoCard__image, .mobile .infoCard--viewHorizontalReverse .infoCard__image {
		display: -webkit-box;
		display: -ms-flexbox;
		display: flex;
		-webkit-box-align: stretch;
		    -ms-flex-align: stretch;
		        align-items: stretch;

	}
	.mobile .infoCard--viewHorizontal .infoCard__image span, .mobile .infoCard--viewHorizontalReverse .infoCard__image span {
		display: -webkit-box;
		display: -ms-flexbox;
		display: flex;
		-webkit-box-align: stretch;
		    -ms-flex-align: stretch;
		        align-items: stretch;
		width: 100%;
		height: auto;
		min-height: 240px;

	}
	.mobile .infoCard--viewVertical.infoCard.w1,
			.mobile .infoCard--viewVertical.infoCard.w1_3,
			.mobile .infoCard--viewVerticalReverse.infoCard.w1,
			.mobile .infoCard--viewVerticalReverse.infoCard.w1_3 {
		width: 50%;

	}
	.mobile .infoCard--viewVertical.infoCard.w2,
			.mobile .infoCard--viewVertical.infoCard.w3,
			.mobile .infoCard--viewVerticalReverse.infoCard.w2,
			.mobile .infoCard--viewVerticalReverse.infoCard.w3 {
		width: 100%;

	}
	.mobile .infoCard--viewVertical.infoCard.w2.h1,
			.mobile .infoCard--viewVertical.infoCard.w2.h2,
			.mobile .infoCard--viewVertical.infoCard.w2.h3,
			.mobile .infoCard--viewVertical.infoCard.w2.h4,
			.mobile .infoCard--viewVertical.infoCard.w3.h1,
			.mobile .infoCard--viewVertical.infoCard.w3.h2,
			.mobile .infoCard--viewVertical.infoCard.w3.h3,
			.mobile .infoCard--viewVertical.infoCard.w3.h4,
			.mobile .infoCard--viewVerticalReverse.infoCard.w2.h1,
			.mobile .infoCard--viewVerticalReverse.infoCard.w2.h2,
			.mobile .infoCard--viewVerticalReverse.infoCard.w2.h3,
			.mobile .infoCard--viewVerticalReverse.infoCard.w2.h4,
			.mobile .infoCard--viewVerticalReverse.infoCard.w3.h1,
			.mobile .infoCard--viewVerticalReverse.infoCard.w3.h2,
			.mobile .infoCard--viewVerticalReverse.infoCard.w3.h3,
			.mobile .infoCard--viewVerticalReverse.infoCard.w3.h4 {
		height: auto;

	}
	.mobile .infoCard--gradientContent .infoCard__content {
		min-height: 200px;

	}
	.mobile .infoCard--gradientContent .infoCard__content > a {
		margin: 0 auto;

	}
	.mobile .infoCard--gradientWithIconBottom .infoCard__content {
		-webkit-box-align: center;
		    -ms-flex-align: center;
		        align-items: center;

	}

}
@media (max-width: 478px) {
	.mobile .info__section {
		margin-top: 30px;
		margin-bottom: 30px;

	}
	.mobile .info__section .sectionName {
		margin-bottom: 10px;

	}
	.mobile .infoCard__head {
		font-size: 18px;

	}
	.mobile .infoCard--viewHorizontal .infoCard__wrap, .mobile .infoCard--viewHorizontalReverse .infoCard__wrap {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .infoCard--viewHorizontal .infoCard__image, .mobile .infoCard--viewHorizontalReverse .infoCard__image {
		-webkit-box-align: end;
		    -ms-flex-align: end;
		        align-items: flex-end;
		-webkit-box-pack: start;
		    -ms-flex-pack: start;
		        justify-content: flex-start;

		/* padding-left: 30px; */
		-webkit-box-ordinal-group: 1;
		    -ms-flex-order: 0;
		        order: 0;

	}
	.mobile .infoCard--viewHorizontal .infoCard__image span, .mobile .infoCard--viewHorizontalReverse .infoCard__image span {
		height: 100%;

	}
	.mobile .infoCard--viewHorizontal .infoCard__image svg, .mobile .infoCard--viewHorizontalReverse .infoCard__image svg {
		margin-bottom: 0;

	}
	.mobile .infoCard--viewVertical.infoCard.w1,
			.mobile .infoCard--viewVertical.infoCard.w1_3,
			.mobile .infoCard--viewVertical.infoCard.w2,
			.mobile .infoCard--viewVertical.infoCard.w3,
			.mobile .infoCard--viewVerticalReverse.infoCard.w1,
			.mobile .infoCard--viewVerticalReverse.infoCard.w1_3,
			.mobile .infoCard--viewVerticalReverse.infoCard.w2,
			.mobile .infoCard--viewVerticalReverse.infoCard.w3 {
		width: 100%;

	}
	.mobile .infoCard--viewVertical.infoCard.h1,
			.mobile .infoCard--viewVertical.infoCard.h2,
			.mobile .infoCard--viewVertical.infoCard.h3,
			.mobile .infoCard--viewVertical.infoCard.h4,
			.mobile .infoCard--viewVerticalReverse.infoCard.h1,
			.mobile .infoCard--viewVerticalReverse.infoCard.h2,
			.mobile .infoCard--viewVerticalReverse.infoCard.h3,
			.mobile .infoCard--viewVerticalReverse.infoCard.h4 {
		height: auto;

	}
	.mobile .infoCard--viewVertical .infoCard__image, .mobile .infoCard--viewVerticalReverse .infoCard__image {
		-webkit-box-ordinal-group: 1;
		    -ms-flex-order: 0;
		        order: 0;

	}
	.mobile .infoCard--gradientContent .infoCard__content {
		min-height: 100px;

	}
	.mobile .infoCard--gradientContent .infoCard__content > a {
		margin: 0 auto;
		font-size: 20px;

	}
	.mobile .infoCard--gradientContent .infoCard__image {
		height: 130px;
		min-height: 130px;

	}
	.mobile .infoCard--gradientContent .infoCard__image span {
		padding: 20px;
		background-size: 100% auto;
		background-origin: content-box;

	}
	.mobile .infoCard--gradientWithIconBottom .infoCard__wrap {
		-webkit-box-orient: horizontal;
		-webkit-box-direction: normal;
		    -ms-flex-direction: row;
		        flex-direction: row;

	}
	.mobile .infoCard--gradientWithIconBottom .infoCard__image {
		-webkit-box-align: center;
		    -ms-flex-align: center;
		        align-items: center;
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;
		min-width: 120px;
		margin: 0;

	}
	.mobile .infoCard--gradientWithIconBottom .infoCard__image svg {
		margin: 0;

	}
	.mobile .infoCard--gradientWithIconBottom .infoCard__content {
		margin-left: 0px;
		margin-right: 20px;

	}
	.mobile .infoCard--viewVertical .infoCard__image, .mobile .infoCard--viewVerticalReverse .infoCard__image, .mobile .infoCard--viewHorizontal .infoCard__image, .mobile .infoCard--viewHorizontalReverse .infoCard__image, .mobile .infoCard--company .infoCard__image {
		height: 240px;

		/* height: 150px; */

	}

}
.container__map {
	background: -webkit-gradient(linear, left bottom, left top, from(#0ba380), to(#245fcd));
	background: linear-gradient(0deg, #0ba380, #245fcd);
	padding: 1px 0;
	height: 100vh;
	min-height: 850px;
	max-height: 1000px;
	color:#fff;
}
.map {
	position: relative;
}
.map__header {
	margin: 90px 0 0;
}
.map__body {
	position: relative;
}
.map__body svg {
	width: 1200px;
	height: 600px;
}
@supports (width:auto) {
	.map__body svg {
		width: auto;
		height: auto;
	}
}
.map__content {
	top: calc(15px + 2vh);
	position: absolute;
	right: 0;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	-webkit-box-orient: horizontal;
	-webkit-box-direction: reverse;
	    -ms-flex-direction: row-reverse;
	        flex-direction: row-reverse
}
.map__content.w100 {
	width: 100%;

}
.map__description {
	border: 1px solid #009cff;
	padding: 30px;
	width: 320px;
	height: 612px;
	/* height: 70%: */
	background: -webkit-gradient(linear, left bottom, left top, from(rgba(11, 162, 128, .7)), to(rgba(62, 136, 205, .7)));
	background: linear-gradient(to top, rgba(11, 162, 128, .7), rgba(62, 136, 205, .7));
	/* background: rgba(255, 255, 255, .2); */
	-webkit-backdrop-filter: blur(30px)
}
.map__description .map__description-name {
	height: 3em;
	overflow: hidden;
	text-overflow: ellipsis;

}
.map__description p {
	margin: 0;
	font-size: 15px;
	line-height: 1.7em;

}
.map__description a {
	color:rgb(220, 220, 80);
	margin-top: 20px;
	display: inline-block;

}
.map__content-popup {
	width: 850px;
	background: linear-gradient(-145deg, rgb(166, 234, 129),rgb(77, 169, 141));
	-webkit-box-shadow: 0 10px 32px 0 rgba(0, 0, 0, .3);
	        box-shadow: 0 10px 32px 0 rgba(0, 0, 0, .3);
	padding: 80px 30px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	font-size: 0;
	position: relative;
	-webkit-transform: translateY(50px);
	        transform: translateY(50px);
	-webkit-transition: all .4s ease;
	transition: all .4s ease;
	opacity: 0;
}
.map__content-popup--animated {
	-webkit-transform: translateY(0px);
	        transform: translateY(0px);
	opacity: 1;
}
.map__content-popupName {
	position: absolute;
	left: 40px;
	top: 40px;
	font-size: 34px;
	font-weight: 900;
}
.map__content-popupClose {
	width: 50px;
	height:50px;
	position: absolute;
	cursor: pointer;
	right: 40px;
	top: 40px
}
.map__content-popupClose:before,
	.map__content-popupClose:after {
	content:'';
	width: 100%;
	height: 3px;
	position: absolute;
	top:0;
	left:0;
	right: 0;
	bottom:0;
	margin: auto;
	background: #fff;
	-webkit-transition: width 0.1s ease-in-out;
	transition: width 0.1s ease-in-out;

}
.map__content-popupClose:before {
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);

}
.map__content-popupClose:after {
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);

}
.map__content-popupClose:hover:before,
	.map__content-popupClose:hover:after {
	width: 80%;

}
.map__content-popupItem {
	width: 33.333%;
	display: inline-block;
	vertical-align: top;
	padding: 35px;
	font-size: 1rem
}
.map__content-popupItem > *:first-child {
	font-size: 3em;
	font-weight: bold;

}
.map__content-popupItem > *:last-child {
	font-weight: bold;

}
.event__section {
	margin-top: 110px;
	margin-bottom: 110px
}
.event__section .sectionName {
	padding-left: 15px;
	padding-right: 15px;
	margin-bottom: 30px;
	font-size: 24px;

}
.event--withData {
	margin-top: 80px;
	margin-bottom: 80px;
	position: relative
}
.event--withData:before {
	content: '';
	display: block;
	width: 1px;
	border-left: 1px dashed #33b178;
	position: absolute;
	left: 67px;
	top: 22px;
	bottom: 0;

}
.event--withData:after {
	content: '';
	display: block;
	height: 200px;
	width: 1px;
	overflow: hidden;
	position: absolute;
	left: 67px;
	bottom: 0;
	background: -webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0)), to(rgba(255, 255, 255, 1)));
	background: linear-gradient(to bottom, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100%);

}
.event--withData .event__group {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	margin: 50px 0;

}
.event--withData .event__date {
	width: 20%;

}
.event--withData .event__array {
	width: 75%;

}
.event--withData .event__array .eventCard {
	width: 33.33%;

}
.event--withData .event__array .eventCard.x2 {
	width: 66.66%;

}
.event--withData .event__array .eventCard.x3,
		.event--withData .event__array .eventCard.x4 {
	width: 100%;

}
.event__date {
	padding-left: 23px;
	margin-left: 67px;
	margin-top: 14px;
	position: relative
}
.event__date:before {
	content: '';
	display: block;
	width: 9px;
	height: 9px;
	border-radius: 50%;
	border: 2px solid #33b178;
	position: absolute;
	left: -4px;
	top: 8px;
	background: #fff;

}
.event__date .event__month {
	color: #3d3d3d;
	font-size: 24px;
	font-weight: 900;
	line-height: 1;

}
.event__date .event__year {
	padding-top: 7px;
	color: #878787;
	font-size: 18px;
	line-height: 1;

}
.event__array {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	    flex-wrap: wrap
}
.event__array .eventCard {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: stretch;
	    -ms-flex-align: stretch;
	        align-items: stretch;
	padding: 15px;
	width: 25%;

	/* min-height: 320px; */

}
.event__array .eventCard.x2 {
	width: 50%;
	min-height: 300px;

}
.event__array .eventCard.x3 {
	width: 75%;

}
.event__array .eventCard.x3 .eventCard__footer {
	font-size: 14px;

}
.event__array .eventCard.x4 {
	width: 100%;

}
.event__array .eventCard.x4 .eventCard__footer {
	font-size: 14px;

}
/* ------------------------------------------------------------------------- */
/* Картинка справа, текст слева */
html:not(.mobile) .eventCard.eventCard--viewHorizontal .eventCard__image {
	width: 174px;
	height: 174px;
	margin: 0;
	overflow: hidden;
	border-radius: 50%;
	border: 1px solid #d6d6d6;
	position: absolute;
	right: 28px;
	top: 28px;

}
html:not(.mobile) .eventCard.eventCard--viewHorizontal .eventCard__image img {
	position: absolute;
	left: 50%;
	top: 50%;
	-webkit-transform: translate(-50%, -50%);
	        transform: translate(-50%, -50%);

}
html:not(.mobile) .eventCard.eventCard--viewHorizontal .eventCard__image ~ .eventCard__date,
	html:not(.mobile) .eventCard.eventCard--viewHorizontal .eventCard__image ~ .eventCard__head {
	margin-right: 200px;

}
html:not(.mobile) .eventCard.eventCard--viewHorizontal .eventCard__date {
	margin-top: 1em;
	padding-bottom: 15px;
	border-bottom: 1px solid #d6d6d6;
	font-size: 18px;

}
html:not(.mobile) .eventCard.eventCard--viewHorizontal .eventCard__footer {
	font-size: 14px;

}
/* ------------------------------------------------------------------------- */
.eventCard__wrap {
	width: 100%;
	padding: 28px;
	background: #fff;
	position: relative;
  -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
          box-shadow: 0 0 20px rgba(0, 0, 0, .25);

	display: -webkit-box;

	display: -ms-flexbox;

	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
}
.eventCard__type {
	font-size: 0;
}
.eventCard__typeIcon {
	display: inline-block;
	width: 28px;
	height: 28px;
	overflow: hidden;
	position: relative;
	vertical-align: top
}
.eventCard__typeIcon svg {
	width: 28px;
	height: 28px;

}
.eventCard__typeCaption {
	display: inline-block;
	padding-left: 13px;
	font-size: 14px;
	font-weight: 900;
	line-height: 32px;
	/* text-transform: uppercase; */
	vertical-align: top;
}
.eventCard__date {
	/* margin: 0.5em 0; */
	color: #9c9c9c;
	font-size: 16px;
	font-weight: 500;
}
.eventCard__image {
	display: block;
	min-height: 90px;
	width: 100%;
	margin: 10px 0;
	position: relative
}
.eventCard__image img {
	display: block;
	max-height: 90px;
	width: auto;
	position: absolute;
	top: 50%;
	-webkit-transform: translateY(-50%);
	        transform: translateY(-50%);

}
.eventCard__image:hover ~ .eventCard__head span {
	background-size: 100% 1px;

}
.eventCard__head {
	margin-top: 0.85em;
	margin-bottom: 0.85em;
	font-size: 18px;
	font-weight: 500;
	line-height: 1.35
}
.eventCard__head span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.eventCard__head:hover span {
	background-size: 100% 1px;

}
.eventCard__footer {
	margin: 0.5em 0 0;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	font-size: 12px;
	position: relative;
}
.eventCard__location {
	color: #9c9c9c;
	-ms-flex-item-align: end;
	    align-self: flex-end;
}
.eventCard__addToCalendar {
	color: #aaaaaa;
	-ms-flex-item-align: end;
	    align-self: flex-end;

	display: block;
	width: 27px;
	height: 27px;
	border: 1px solid #dcdcdc;
	border-radius: 50%;
	position: absolute;
	bottom: -6px;
	right: -6px;
	z-index: 20;
	-webkit-transition: background-color 0.3s ease, color 0.3s ease-in-out;
	transition: background-color 0.3s ease, color 0.3s ease-in-out
}
.eventCard__addToCalendar span {
	display: block;
	padding-right: 38px;
	position: absolute;

	/* right: 27px; */
	right: 0;
	line-height: 26px;
	white-space: nowrap;
	-webkit-transition: color 0.3s ease;
	transition: color 0.3s ease;

}
.eventCard__addToCalendar:hover {
	border-color: #7b35cb;
	background-color: #7b35cb;

}
.eventCard__addToCalendar:hover span {
	color: #7b35cb;

}
.eventCard__addToCalendar:before,
	.eventCard__addToCalendar:after {
	content: '';
	display: block;
	overflow: hidden;
	position: absolute;
	top: 0;
	left: 0;
	background: #7b35cb;

}
.eventCard__addToCalendar:before {
	margin: 12px 7px;
	width: 11px;
	height: 1px;

}
.eventCard__addToCalendar:after {
	margin: 7px 12px;
	width: 1px;
	height: 11px;

}
.eventCard__addToCalendar:hover:before,
	.eventCard__addToCalendar:hover:after {
	background: #fff;

}
.eventCard:not(.x2):not(.x3):not(.x4) .eventCard__addToCalendar {
	display: block;
	width: 27px;
	height: 27px;
	border: 1px solid #dcdcdc;
	border-radius: 50%;
	position: absolute;
	bottom: -6px;
	right: -6px;
	z-index: 20;
	-webkit-transition: background-color 0.3s ease, color 0.3s ease-in-out;
	transition: background-color 0.3s ease, color 0.3s ease-in-out
}
.eventCard:not(.x2):not(.x3):not(.x4) .eventCard__addToCalendar:hover {
	border-color: #7b35cb;
	background-color: #7b35cb;

}
.eventCard:not(.x2):not(.x3):not(.x4) .eventCard__addToCalendar > span {
	height: 28px;
	padding: 0 10px;
	border-radius: 14px;
	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	        box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	background: #fff;
	position: absolute;
	right: -16px;
	color: #353535;
	font-size: 14px;
	line-height: 28px;
	white-space: nowrap;
	top: -47px;
	visibility: hidden;
	opacity: 0;
	-webkit-transition: opacity 0.25s ease,
					top 0.25s ease;
	transition: opacity 0.25s ease,
					top 0.25s ease;

}
.eventCard:not(.x2):not(.x3):not(.x4) .eventCard__addToCalendar > span:before {
	content: '';
	display: block;
	width: 6px;
	height: 6px;
	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	        box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	overflow: hidden;
	background: #fff;
	position: absolute;
	bottom: -3px;
	right: 25px;
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);

}
.eventCard:not(.x2):not(.x3):not(.x4) .eventCard__addToCalendar > span:after {
	content: '';
	display: block;
	width: 25px;
	height: 7px;
	overflow: hidden;
	background: #fff;
	position: absolute;
	bottom: 0px;
	right: 15px;

}
.eventCard:not(.x2):not(.x3):not(.x4) .eventCard__addToCalendar:hover span  {
	visibility: visible;
	opacity: 1;
	top: -40px;

}
.eventCard:not(.x2):not(.x3):not(.x4) .eventCard__addToCalendar:before,
	.eventCard:not(.x2):not(.x3):not(.x4) .eventCard__addToCalendar:after {
	content: '';
	display: block;
	overflow: hidden;
	position: absolute;
	background: #7b35cb;

}
.eventCard:not(.x2):not(.x3):not(.x4) .eventCard__addToCalendar:before {
	margin: 12px 7px;
	width: 11px;
	height: 1px;

}
.eventCard:not(.x2):not(.x3):not(.x4) .eventCard__addToCalendar:after {
	margin: 7px 12px;
	width: 1px;
	height: 11px;

}
.eventCard:not(.x2):not(.x3):not(.x4) .eventCard__addToCalendar:hover:before,
	.eventCard:not(.x2):not(.x3):not(.x4) .eventCard__addToCalendar:hover:after {
	background: #fff;

}
/* ------------------------------------------------------------------------- */
/* Темы для оформления карточек новостей и событий */
.theme-red,
.theme-green,
.theme-green-2,
.theme-blue,
.theme-blue-2,
.theme-purple,
.theme-purple-2,
.theme-black,
.theme-orange {
	-webkit-transition: color 0.3s ease;
	transition: color 0.3s ease;
}
.theme-red a.eventCard__head:hover,
	.theme-red a:hover ~ .eventCard__head,
	.theme-red .eventCard__typeCaption,
	.theme-red .eventsCard__subtitle span,
	.theme-red .eventHero__eventType .title {
	color: #e83930;

}
.theme-red svg {
	fill: #e94037;

}
.theme-green a.eventCard__head:hover,
	.theme-green a:hover ~ .eventCard__head,
	.theme-green .eventCard__typeCaption,
	.theme-green .eventsCard__subtitle span,
	.theme-green .eventHero__eventType .title {
	color: #009353;

}
.theme-green svg {
	fill: #009353;

}
.theme-green-2 a.eventCard__head:hover,
	.theme-green-2 a:hover ~ .eventCard__head,
	.theme-green-2 .eventCard__typeCaption,
	.theme-green-2 .eventsCard__subtitle span,
	.theme-green-2 .eventHero__eventType .title {
	color: #47bd6a;

}
.theme-green-2 svg {
	fill: #47bd6a;

}
.theme-blue a.eventCard__head:hover,
	.theme-blue a:hover ~ .eventCard__head,
	.theme-blue .eventCard__typeCaption,
	.theme-blue .eventsCard__subtitle span,
	.theme-blue .eventHero__eventType .title {
	color: #0534ff;

}
.theme-blue svg {
	fill: #055cff;

}
.theme-blue-2 a.eventCard__head:hover,
	.theme-blue-2 a:hover ~ .eventCard__head,
	.theme-blue-2 .eventCard__typeCaption,
	.theme-blue-2 .eventsCard__subtitle span,
	.theme-blue-2 .eventHero__eventType .title {
	color: #4359e0;

}
.theme-blue-2 svg {
	fill: #4359e0;

}
.theme-purple a.eventCard__head:hover,
	.theme-purple a:hover ~ .eventCard__head,
	.theme-purple .eventCard__typeCaption,
	.theme-purple .eventsCard__subtitle span,
	.theme-purple .eventHero__eventType .title {
	color: #7b35cb;

}
.theme-purple svg {
	fill: #7b35cb;

}
.theme-purple-2 a.eventCard__head:hover,
	.theme-purple-2 a:hover ~ .eventCard__head,
	.theme-purple-2 .eventCard__typeCaption,
	.theme-purple-2 .eventsCard__subtitle span,
	.theme-purple-2 .eventHero__eventType .title {
	color: #7830ca;

}
.theme-purple-2 svg {
	fill: #7830ca;

}
.theme-black a.eventCard__head:hover,
	.theme-black a:hover ~ .eventCard__head,
	.theme-black .eventCard__typeCaption,
	.theme-black .eventsCard__subtitle span,
	.theme-black .eventHero__eventType .title {
	color: #000;

}
.theme-black svg {
	fill: #000;

}
.theme-orange a.eventCard__head:hover,
	.theme-orange a:hover ~ .eventCard__head,
	.theme-orange .eventCard__typeCaption,
	.theme-orange .eventsCard__subtitle span,
	.theme-orange .eventHero__eventType .title {
	color: #fb7720;

}
.theme-orange svg {
	fill: #fb7720;

}
/* ------------------------------------------------------------------------- */
.mobile .event--withData {
	margin-top: 50px;
	margin-bottom: 50px;

}
.mobile .event--withData:before,
		.mobile .event--withData:after {
	left: 35px;

}
.mobile .event--withData .event__array {
	width: 100%;

	/* & .eventCard {
				width: 50%;
			} */

}
.mobile .event--withData .event__group {
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;

}
.mobile .event--withData .event__date {
	margin-left: 35px;
	margin-bottom: 20px;

}
.mobile .event__date {
	margin-left: 15px;

}
@media (max-width: 991px) {
	.mobile .event__section {
		margin-top: 60px;
		margin-bottom: 60px;

	}
	.mobile .event__array {
		width: 100%;

	}
	.mobile .event__array .eventCard,
			.mobile .event__array .eventCard.x2,
			.mobile .event__array .eventCard.x3,
			.mobile .event__array .eventCard.x4 {
		width: 50%;

	}
	.mobile .event__array .eventCard .eventCard__addToCalendar span, .mobile .event__array .eventCard.x2 .eventCard__addToCalendar span, .mobile .event__array .eventCard.x3 .eventCard__addToCalendar span, .mobile .event__array .eventCard.x4 .eventCard__addToCalendar span {
		display: none;

	}
	.mobile .eventCard--viewHorizontal {}

}
@media (max-width: 478px) {
	.mobile .event__array .eventCard.x2,
			.mobile .event__array .eventCard.x3,
			.mobile .event__array .eventCard.x4 {
		width: 100%;

	}
	.mobile .event__section {
		margin-top: 30px;
		margin-bottom: 30px;

	}
	.mobile .event__section .sectionName {
		margin-bottom: 10px;

	}
	.mobile .event--withData {
		margin-top: 30px;
		margin-bottom: 30px;

	}
	.mobile .event--withData .event__array .eventCard,
				.mobile .event--withData .event__array .eventCard.x2,
				.mobile .event--withData .event__array .eventCard.x3,
				.mobile .event--withData .event__array .eventCard.x4 {
		width: 100%;

	}

}
/* ------------------------------------------------------------------------- */
.cardWithDescription__section {
	margin-top: 110px;
	margin-bottom: 110px;
}
.cardWithDescription__array {}
.cardWithDescription__item {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex
}
.cardWithDescription__item > div {
	width: 50%;
	padding: 15px;

}
.cardWithDescription__item.cardWithDescription__item--left {
	-webkit-box-orient: horizontal;
	-webkit-box-direction: reverse;
	    -ms-flex-direction: row-reverse;
	        flex-direction: row-reverse;

}
.cardWithDescription__item.cardWithDescription__item--left .cardWithDescription__wrap {
	-webkit-box-orient: horizontal;
	-webkit-box-direction: normal;
	    -ms-flex-direction: row;
	        flex-direction: row;

}
.cardWithDescription__item.cardWithDescription__item--left .cardWithDescription__description {
	text-align: right;

}
.cardWithDescription__item.cardWithDescription__item--right {
	-webkit-box-orient: horizontal;
	-webkit-box-direction: normal;
	    -ms-flex-direction: row;
	        flex-direction: row;

}
.cardWithDescription__item.cardWithDescription__item--right .cardWithDescription__wrap {
	-webkit-box-orient: horizontal;
	-webkit-box-direction: reverse;
	    -ms-flex-direction: row-reverse;
	        flex-direction: row-reverse;

}
.cardWithDescription__item.cardWithDescription__item--right .cardWithDescription__description {
	text-align: left;

}
.cardWithDescription__card {}
.cardWithDescription__wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	width: 100%;
	min-height: 238px;
	background: #fff;
  -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
          box-shadow: 0 0 20px rgba(0, 0, 0, .25);
}
.cardWithDescription__image {
	width: 50%;
	background-repeat: no-repeat;
	background-size: cover;
	background-position: center;
	position: relative
}
.cardWithDescription__image:hover ~ .cardWithDescription__title span {
	background-size: 100% 1px;

}
.cardWithDescription__icon {
	content: '';
	display: block;
	width: 60px;
	height: 60px;
	overflow: hidden;
	background: url('/images/play.svg') no-repeat;
	background-size: 60px 60px;
	position: absolute;
	top: 50%;
	left: 50%;
	-webkit-transform: translate(-50%, -50%);
	        transform: translate(-50%, -50%);
}
.cardWithDescription__title {
	width: 50%;
	padding: 28px;
	font-size: 24px;
	font-weight: 900;
	line-height: 1;
	-ms-flex-item-align: end;
	    align-self: flex-end
}
.cardWithDescription__title span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.cardWithDescription__title:hover span {
	background-size: 100% 1px;

}
.cardWithDescription__description {
	font-size: 24px;
	font-weight: 900;
	line-height: 1.5;
	-ms-flex-item-align: center;
	    align-self: center;
}
/* ------------------------------------------------------------------------- */
.mobile .cardWithDescription__title span {
	background-size: 100% 1px;

}
@media (max-width: 991px) {
	.mobile .cardWithDescription__section {
		margin-top: 60px;
		margin-bottom: 60px;

	}
	.mobile .cardWithDescription__item {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .cardWithDescription__card,
		.mobile .cardWithDescription__description {
		width: 100%;

	}
	.mobile .cardWithDescription__description {
		padding-top: 0;
		font-size: 20px;

	}

}
@media (max-width: 478px) {
	.mobile .cardWithDescription__section {
		margin-top: 30px;
		margin-bottom: 30px;

	}
	.mobile .cardWithDescription__description {
		padding-top: 0;
		font-size: 16px;

	}
	.mobile .cardWithDescription__card .cardWithDescription__wrap {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .cardWithDescription__image {
		width: 100%;
		min-height: 200px;

	}
	.mobile .cardWithDescription__title {
		width: 100%;
		font-size: 18px;
		line-height: 1.5;

	}

}
/* ------------------------------------------------------------------------- */
.cardContact {
	margin-top: -45px;
	margin-bottom: 60px;
	padding-left: 15px;
	padding-right: 15px;
}
.cardContact__wrap {
	background-color: #fff;
  -webkit-box-shadow: 0 8px 40px rgba(0, 0, 0, .2);
          box-shadow: 0 8px 40px rgba(0, 0, 0, .2);
}
.cardContact__informationBlock {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
	padding: 100px 80px 80px;
	font-size: 18px;
	line-height: 1.7;
}
.cardContact__informationBlockWrap {
	width: 50%;
}
.cardContact__phoneAndEmail {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
}
.cardContact__telephoneBlock {
	width: 50%;
}
.cardContact__telephoneTitle {}
.cardContact__telephoneContent {
	font-weight: 900;
}
.cardContact__telephone {
	display: block;
}
.cardContact__fax {
	display: block;
}
.cardContact__emailBlock {
	width: 50%;
}
.cardContact__emailTitle {}
.cardContact__emailEmail {
	color: #009cff;
	font-weight: 900;
  background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
  background-image: linear-gradient(currentColor, currentColor);
  background-position: bottom left;
  background-repeat: no-repeat;
  background-size: 0 1px;
  -webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
  transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out
}
.cardContact__emailEmail:hover {
	background-size: 100% 1px;

}
.cardContact__postAddressBlock:not(:first-child) {
	margin-top: 20px;

}
.cardContact__postAddressTitle {}
.cardContact__postAddress {
	font-weight: 900;
}
.cardContact__bankDetailsBlock {
	width: 50%;
	-webkit-box-flex: 1;
	    -ms-flex-positive: 1;
	        flex-grow: 1;
}
.cardContact__bankDetailsTitle {}
.cardContact__bankDetails {
	font-weight: 900;
}
.cardContact__map {
	width: 100%;
	height: 400px;
	background-color: #e1dfda
}
.cardContact__map .js-googleMap {
	width: 100%;
	height: 400px;

}
.cardContact__mapLink {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	width: 100%;
	padding: 50px 80px;
	font-size: 18px;
	font-weight: 500;
}
.cardContact__yandexMap,
.cardContact__googleMap {
	width: 50%
}
.cardContact__yandexMap a[target="_blank"], .cardContact__googleMap a[target="_blank"] {
	position: relative;

}
.cardContact__yandexMap a[target="_blank"]:after, .cardContact__googleMap a[target="_blank"]:after {
	content: '';
	width: 16px;
	height: 16px;
	overflow: hidden;
	position: absolute;
	top: 0px;
	right: -16px;
	background-image: url('/images/icon-targe-blank.svg');
	background-repeat: no-repeat;
	background-size: 12px 12px;
	background-position: 0 4px;
	-webkit-transition: background-position 0.2s ease;
	transition: background-position 0.2s ease;

}
.cardContact__yandexMap a, .cardContact__googleMap a {
	display: inline-block;

	/* display: flex; */
	min-height: 50px;
	padding-left: 70px;
	color: #009cff;
	position: relative;
	z-index: 10;
	line-height: 50px;

}
.cardContact__yandexMap a:before, .cardContact__googleMap a:before {
	content: '';
	display: block;
	width: 50px;
	height: 50px;
	border-radius: 50%;
	overflow: hidden;
	position: absolute;
	top: 0;
	left: 0;
	background-color: #fff;
	background-size: 50px 50px;
	-webkit-box-shadow: 0 7px 40px 0 rgba(0, 0, 0, .15);
	        box-shadow: 0 7px 40px 0 rgba(0, 0, 0, .15);

	/* box-shadow: 0 7px 25px -5px rgba(0, 0, 0, .3); */
	-webkit-transition: -webkit-transform 0.3s ease, -webkit-box-shadow 0.3s ease;
	transition: -webkit-transform 0.3s ease, -webkit-box-shadow 0.3s ease;
	transition: transform 0.3s ease, box-shadow 0.3s ease;
	transition: transform 0.3s ease, box-shadow 0.3s ease, -webkit-transform 0.3s ease, -webkit-box-shadow 0.3s ease;

}
.cardContact__yandexMap a span, .cardContact__googleMap a span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.cardContact__yandexMap a:hover:before, .cardContact__googleMap a:hover:before {
	-webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, .4);
	        box-shadow: 0 2px 8px rgba(0, 0, 0, .4);
	-webkit-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, .25);
	        box-shadow: 0 2px 10px 0 rgba(0, 0, 0, .25);
	-webkit-transform: scale(0.95);
	        transform: scale(0.95);

}
.cardContact__yandexMap a:hover:after, .cardContact__googleMap a:hover:after {
	background-position: 4px 0;

}
.cardContact__yandexMap a:hover span, .cardContact__googleMap a:hover span {
	background-size: 100% 1px;

}
.cardContact__yandexMap a:before {
	background-image: url('/images/icon-yandex-map.svg');
}
.cardContact__googleMap a:before {
	background-image: url('/images/icon-google-map.svg');
}
/* -------------------------------------------------------------------------- */
.mobile .cardContact {
	margin-bottom: 40px;

}
.mobile .cardContact__informationBlock {
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	padding: 40px 30px 60px;
	font-size: 16px;

}
.mobile .cardContact__informationBlockWrap,
	.mobile .cardContact__bankDetailsBlock {
	width: 100%;

}
.mobile .cardContact__informationBlockWrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	margin-bottom: 60px;

}
.mobile .cardContact__telephoneBlock,
	.mobile .cardContact__emailBlock,
	.mobile .cardContact__postAddressBlock {
	padding-right: 5px;

}
.mobile .cardContact__phoneAndEmail {
	width: 66.66667%;

}
.mobile .cardContact__postAddressBlock {
	width: 33.33333%;
	margin-top: 0;

}
.mobile .cardContact__telephoneBlock,
	.mobile .cardContact__emailBlock {
	width: 100%;

}
.mobile .cardContact__mapLink {
	-ms-flex-wrap: wrap;
	    flex-wrap: wrap;
	padding: 35px 41px 35px 25px;

}
@media (min-width: 992px) {
	.mobile {}

}
@media (max-width: 991px) {
	.mobile {}

}
@media (max-width: 750px) {
	.mobile .cardContact__informationBlockWrap,
		.mobile .cardContact__phoneAndEmail {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .cardContact__phoneAndEmail,
		.mobile .cardContact__postAddressBlock {
		width: 100%;

	}
	.mobile .cardContact__telephoneBlock,
		.mobile .cardContact__emailBlock,
		.mobile .cardContact__postAddressBlock {
		padding-right: 0;

	}
	.mobile .cardContact__informationBlockWrap {
		margin-bottom: 40px;

	}
	.mobile .cardContact__emailBlock,
		.mobile .cardContact__postAddressBlock {
		margin-top: 30px;

	}
	.mobile .cardContact__mapLink {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .cardContact__yandexMap,
		.mobile .cardContact__googleMap {
		width: 100%;

	}
	.mobile .cardContact__googleMap {
		margin-top: 30px;

	}

}
@media (max-width: 730px) {
	.mobile .gmnoprint {
		display: none;

	}

}
@media (max-width: 478px) {
	.mobile .cardContact {
		margin-top: -20px;
		margin-bottom: 30px;

	}
	.mobile .cardContact__mapLink {
		padding-right: 25px;

	}
	.mobile .cardContact__yandexMap,
		.mobile .cardContact__googleMap {
		text-align: center;

	}
	.mobile .cardContact__yandexMap a,
		.mobile .cardContact__googleMap a {
		padding-top: 50px;
		padding-left: 0px;

	}
	.mobile .cardContact__yandexMap a:before,
		.mobile .cardContact__googleMap a:before {
		left: 50%;
		-webkit-transform: translateX(-50%);
		        transform: translateX(-50%);

	}
	.mobile .cardContact__yandexMap a[target="_blank"]:after,
		.mobile .cardContact__googleMap a[target="_blank"]:after {
		top: auto;
		bottom: 40px;

	}
	.mobile .cardContact__informationBlock {
		font-size: 16px;
		line-height: 1.7;
		padding-top: 30px;
		padding-bottom: 30px;

	}
	.mobile .cardContact__postAddressBlock,
		.mobile .cardContact__emailBlock {
		margin-top: 20px;

	}
	.mobile .cardContact__informationBlockWrap {
		margin-bottom: 20px;

	}

}
/* -------------------------------------------------------------------------- */
.tabs {
	margin-top: 100px;
	margin-bottom: 100px
}
.tabs .swiper-wrapper,
	.tabs .swiper-slide {
	height: auto;

}
.tabs .swiper-slide {
	display: inline-block;
	width: auto;

}
.tabs .swiper-scrollbar {
	display: none;
	height: 1px;

}
.tabs .swiper-scrollbar-drag {
	top: -2px;
	height: 3px;
	background-color: #009cff;

}
.tabs__labelGroup {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	border-bottom: 1px solid #d6d6d6;
	position: relative;
}
.tabs__label {
	padding: 20px 30px;
	margin-bottom: -1px;
	color: rgba(32, 32, 32, .8);
	font-size: 18px;
	font-weight: 900;
	opacity: 0.7;
	cursor: pointer;
	-webkit-transition: opacity 0.3s ease, color 0.3s ease;
	transition: opacity 0.3s ease, color 0.3s ease;
	white-space: nowrap
}
.tabs__label:hover {
	opacity: 1;

}
.tabs__label.tabs__label--current {
	opacity: 1;
	color: #009cff;

}
.tabs__labelCurrentLine {
	width: 0;
	height: 3px;
	overflow: hidden;
	background: #009cff;
	position: absolute;
	left: 0;
	bottom: 0;
	-webkit-transition: width 0.3s ease, left 0.3s ease;
	transition: width 0.3s ease, left 0.3s ease;
}
.tabs__contentGroup {
	-webkit-transition: height 0.3s ease;
	transition: height 0.3s ease;
	position: relative;
}
.tabs__content {
	width: 100%;
	/* font-size: 18px; */
	opacity: 1;
	-webkit-transition: opacity 0.3s ease;
	transition: opacity 0.3s ease;
	position: absolute;
	top: 0;
	left: 0
}
.tabs__content.none {
	display: none;
	opacity: 0;

}
.tabs__contentWrap {
	padding: 40px 0 0
}
.tabs__contentWrap >:first-child {
	margin-top: 0;

}
.tabs__contentWrap > :last-child {
	margin-bottom: 0;

}
.tabs__contentWrap .container {
	width: 100%;
	padding-left: 0;
	padding-right: 0;

}
.tabs__contentWrap .pageTags {
	margin-bottom: 0;

}
.tabs__contentWrap .news__array {
	margin-left: -15px;
	margin-right: -15px;
	margin-top: -15px;

}
.tabs__contentWrap .additionMaterial__array {
	margin-top: 0;
	margin-bottom: 0;
	margin-left: -15px;
	margin-right: -15px;

}
.tabs__contentWrap .contentTab > :first-child {
	margin-top: 0;

}
.tabs__contentWrap .contentTab > :last-child {
	margin-bottom: 0;

}
.tabs__contentWrap p {
	line-height: 1.7;

}
/* -------------------------------------------------------------------------- */
.mobile .tabs__contentWrap {
	padding-top: 20px;

}
.mobile .tabs {
	margin: 50px 0 50px;

}
.mobile .tabs__labelGroup.swiper-container {

	/* border-bottom: none; */
	position: relative;

}
.mobile .tabs__labelGroup.swiper-container:before,
		.mobile .tabs__labelGroup.swiper-container:after {
	content: '';
	display: block;
	width: 30px;
	height: 100%;
	position: absolute;
	bottom: 3px;
	z-index: 2;

}
.mobile .tabs__labelGroup.swiper-container:before {
	left: 0;
	background: -webkit-gradient(linear, right top, left top, from(transparent), to(white));
	background: linear-gradient(to left, transparent, white);

}
.mobile .tabs__labelGroup.swiper-container:after {
	right: 0;
	background: -webkit-gradient(linear, left top, right top, from(transparent), to(white));
	background: linear-gradient(to right, transparent, white);

}
.mobile .tabs__labelGroup.swiper-container .swiper-wrapper {
	z-index: 1;

}
@media (max-width: 991px) {
	.mobile {

		/* & .tabs__labelCurrentLine {
			display: none;
		} */

	}
	.mobile .swiper-scrollbar {
		display: block;

	}
	.mobile {

		/* & .tabs__contentWrap {
			padding-top: 0;
		} */

	}

}
@media (max-width: 478px) {
	.mobile .tabs {
		margin: 30px 0 30px;

	}
	.mobile .tabs__content {

		/* font-size: 16px; */

	}
	.mobile .tabs__contentWrap {
		padding-top: 20px;

	}
	.mobile .tabs__contentWrap .additionMaterial__array {
		margin-left: 0;
		margin-right: 0;

	}
	.mobile .tabs__contentWrap .additionMaterial__array .additionMaterial__item:first-child {
		margin-top: 0;

	}
	.mobile .tabs__contentWrap p {
		margin: 1em 0;

		/* font-size: 16px; */

		/* line-height: 1.7; */

	}
	.mobile .tabs__contentWrap p:first-child {
		margin-top: 0;

	}
	.mobile .tabs__contentWrap p:last-child {
		margin-bottom: 0;

	}

}
/* -------------------------------------------------------------------------- */
.cardEvents {
	border: 1px solid red;
}
.eventFilterSelect {
	z-index: 90;
}
.eventFilter {
	margin-top: -45px;
	margin-bottom: 80px;
}
.eventFilter__wrap {
	padding: 40px;
  background: -webkit-gradient(linear, left top, right top, from(#0da481), to(#3bcf56));
  background: linear-gradient(90deg, #0da481 0%, #3bcf56 100%);
  -webkit-box-shadow: 0 8px 40px rgba(0, 0, 0, .2);
          box-shadow: 0 8px 40px rgba(0, 0, 0, .2);
}
.eventFilter__array {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-pack: distribute;
	    justify-content: space-around;
	width: 100%
}
.eventFilter__array + .eventFilter__panel {
	margin-top: 33px;

}
.eventFilter__item {
	width: 16.66%;
	padding: 30px 40px;
	position: relative;
	cursor: pointer;
	/* opacity: 0.8; */
	-webkit-transition: opacity 0.3s ease;
	transition: opacity 0.3s ease;
	border: 1px solid transparent;
	overflow: hidden;
	-webkit-transition: border-color 0.2s ease;
	transition: border-color 0.2s ease
}
.eventFilter__item:before {
	content: '';
	display: block;
	width: 0;
	height: 0;
	position: absolute;
	top: 50%;
	left: 50%;
	z-index: 0;
	opacity: 0;
	background-color: #fff;
	-webkit-transform: translate(-50%, -50%);
	        transform: translate(-50%, -50%);
	-webkit-transition: width 0.3s ease,
					height 0.3s ease,
					opacity 0.3s ease;
	transition: width 0.3s ease,
					height 0.3s ease,
					opacity 0.3s ease;

}
.eventFilter__item .eventFilter__icon {
	text-align: center;
	padding-bottom: 8px;

}
.eventFilter__item .eventFilter__icon svg {
	width: 24px;
	height: 24px;
	overflow: hidden;
	fill: #fff;
	-webkit-transition: -webkit-transform 0.3s ease;
	transition: -webkit-transform 0.3s ease;
	transition: transform 0.3s ease;
	transition: transform 0.3s ease, -webkit-transform 0.3s ease;

}
.eventFilter__item .eventFilter__title {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	min-height: 25px;
	color: #fff;
	position: relative;
	z-index: 1;
	font-size: 16px;
	font-weight: 500;
	line-height: 1.2;
	-webkit-transition: font-weight 0.3s ease;
	transition: font-weight 0.3s ease;

}
.eventFilter__item:hover,
	.eventFilter__item.eventFilter__item--current {
	border-color: rgba(255, 255, 255, .3);

	/* opacity: 1; */

}
.eventFilter__item:hover:before, .eventFilter__item.eventFilter__item--current:before {
	width: 100%;
	height: 100%;
	opacity: 0.08;

}
.eventFilter__item:hover .eventFilter__icon svg, .eventFilter__item.eventFilter__item--current .eventFilter__icon svg {
	-webkit-transform: scale(1.2);
	        transform: scale(1.2);

}
.eventFilter__item:hover .eventFilter__title, .eventFilter__item.eventFilter__item--current .eventFilter__title {
	font-weight: 900;

}
.eventFilter__panel {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	width: 100%;
	height: 38px;
	margin-top: 30px;
	/* margin-bottom: 20px; */
	border-radius: 19px;
	/* overflow: hidden; */
	background: #fff;
}
.eventFilter__selectDate {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: stretch;
	    -ms-flex-align: stretch;
	        align-items: stretch;
	margin: 0;
	min-width: 200px;
	height: 38px
}
.eventFilter__selectDate .inputSelect {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: stretch;
	    -ms-flex-align: stretch;
	        align-items: stretch;
	min-width: 200px;
	height: 38px;
	margin-left: -2px;
	border-radius: 19px;
	background-color: transparent;
	position: relative;
	cursor: pointer;

}
.eventFilter__selectDate .inputSelect:before {
	content: '';
	display: block;
	width: 100%;
	height: 100%;
	border-radius: 19px;
	background-color: #64c16c;
	position: absolute;
	top: 0;
	left: 0;
	z-index: 15;
	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	        box-shadow: 0 0 20px rgba(0, 0, 0, .25);

}
.eventFilter__selectDate .inputSelect:after {
	display: none;

}
.eventFilter__selectDate .inputSelect.eventFilter__selectMonth {
	display: none;

}
.eventFilter__selectDate .inputSelect__input {
	padding-left: 20px;
	-ms-flex-item-align: center;
	    align-self: center;
	color: #fff;
	font-size: 16px;
	font-weight: 500;
	position: relative;
	z-index: 15;

}
.eventFilter__selectDate .inputSelect__placeholder {
	padding-left: 20px;
	-ms-flex-item-align: center;
	    align-self: center;
	color: #fff;
	font-size: 16px;
	font-weight: 500;
	z-index: 15;

}
.eventFilter__selectDate .inputSelect__iconDown {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;
	width: 28px;
	height: 28px;
	border-radius: 50%;
	overflow: hidden;
	background: #fff;
	position: absolute;
	top: 5px;
	right: 6px;
	z-index: 15;
	-webkit-box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);
	        box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);

}
.eventFilter__selectDate .inputSelect__iconDown svg {
	fill: #33b178;
	stroke: #33b178;
	stroke-width: 1px;
	-webkit-transform: rotate(180deg);
	        transform: rotate(180deg);
	-webkit-transition: -webkit-transform 0.3s aese;
	transition: -webkit-transform 0.3s aese;
	transition: transform 0.3s aese;
	transition: transform 0.3s aese, -webkit-transform 0.3s aese;

}
.eventFilter__selectDate .inputSelect__list {
	margin-top: -19px;
	border-bottom-left-radius: 19px;
	border-bottom-right-radius: 19px;

}
.eventFilter__selectDate .inputSelect__list .inputSelect__option {
	padding: 5px 20px;
	border: 0;
	font-size: 16px;
	font-weight: 500;
	color: #221F1F;

}
.eventFilter__selectDate .inputSelect__list .inputSelect__option:first-child {
	margin-top: 30px;

}
.eventFilter__selectDate .inputSelect__list .inputSelect__option:last-child {
	margin-bottom: 15px;

}
.eventFilter__selectDate {

	/* & .--opened {
		z-index: 1010;
		&:before,
		& .inputSelect__input,
		& .inputSelect__placeholder,
		& .inputSelect__iconDown {
			z-index: 1015;
		}
	} */

}
.eventFilter__selectDate .\--hasValue .inputSelect__placeholder {
	display: none;

}
.eventFilter__selectDate .\--hasValue .inputSelect__input {
	height: auto;
	padding-top: 0;
	padding-bottom: 0;
	padding-right: 0;

}
.eventFilter__month {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: stretch;
	    -ms-flex-align: stretch;
	        align-items: stretch;
	-ms-flex-wrap: nowrap;
	    flex-wrap: nowrap;
	width: 100%;
	height: 38px;
	padding-left: 40px;
	padding-right: 40px;
	overflow: hidden;
	position: relative

}
.eventFilter__month:before,
	.eventFilter__month:after {
	content: '';
	display: block;
	width: 40px;
	height: 38px;
	overflow: hidden;
	background: #fff;
	position: absolute;
	top: 0;
	z-index: 5;

}
.eventFilter__month:after {
	right: 0;
	border-top-right-radius: 19px;
	border-bottom-right-radius: 19px;
	background: -webkit-gradient(linear, left top, right top, from(rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 1)));
	background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 50%);

}
.eventFilter__month:before {
	left: 0;
	background: -webkit-gradient(linear, right top, left top, from(rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 1)));
	background: linear-gradient(to left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 50%);

}
.eventFilter__arrowPrev,
.eventFilter__arrowNext {
	width: 38px;
	height: 38px;
	overflow: hidden;
	position: absolute;
	/* top: 9px; */
	z-index: 6;
	cursor: pointer;
	-webkit-transition: -webkit-transform 0.3s ease;
	transition: -webkit-transform 0.3s ease;
	transition: transform 0.3s ease;
	transition: transform 0.3s ease, -webkit-transform 0.3s ease
}
.eventFilter__arrowPrev:hover, .eventFilter__arrowNext:hover {
	-webkit-transform: scale(1.3);
	        transform: scale(1.3);

}
.eventFilter__arrowPrev:before,
	.eventFilter__arrowPrev:after,
	.eventFilter__arrowNext:before,
	.eventFilter__arrowNext:after {
	content: '';
	display: block;
	width: 7px;
	height: 2px;
	border-radius: 1px;
	overflow: hidden;
	background: #33b178;
	position: absolute;
	left: 16px;

}
.eventFilter__arrowPrev.eventFilter__arrow--inActive, .eventFilter__arrowNext.eventFilter__arrow--inActive {
	opacity: 0.5;
	cursor: default;

}
.eventFilter__arrowPrev.eventFilter__arrow--inActive:hover, .eventFilter__arrowNext.eventFilter__arrow--inActive:hover {
	-webkit-transform: none;
	        transform: none;

}
.eventFilter__arrowNext {
	left: 0
}
.eventFilter__arrowNext:before {
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);
	top: 16px;

}
.eventFilter__arrowNext:after {
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);
	top: 20px;

}
.eventFilter__arrowPrev {
	right: 0
}
.eventFilter__arrowPrev:before {
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);
	top: 16px;

}
.eventFilter__arrowPrev:after {
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);
	top: 20px;

}
.eventFilter__monthGroup {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	max-width: 870px;
	-webkit-box-align: stretch;
	    -ms-flex-align: stretch;
	        align-items: stretch;
	-ms-flex-wrap: nowrap;
	    flex-wrap: nowrap;
	-webkit-transition: -webkit-transform 1s ease;
	transition: -webkit-transform 1s ease;
	transition: transform 1s ease;
	transition: transform 1s ease, -webkit-transform 1s ease
}
.eventFilter__monthGroup.scrollToLeft {
	-webkit-transform: translateX(-100%);
	        transform: translateX(-100%);

}
.eventFilter__monthGroup.scrollToRight {
	-webkit-transform: translateX(0);
	        transform: translateX(0);

}
.eventFilter__monthItem {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-flex: 0;
	    -ms-flex-positive: 0;
	        flex-grow: 0;
	-ms-flex-negative: 0;
	    flex-shrink: 0;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;
	width: 16.66%;
	cursor: pointer
}
.eventFilter__monthItem span {
	padding: 0 20px;
	-ms-flex-item-align: center;
	    align-self: center;
	font-size: 16px;
	font-weight: 500;
	opacity: 0.6;
	-webkit-transition: opacity 0.3s ease, font-weight 0.3s ease;
	transition: opacity 0.3s ease, font-weight 0.3s ease;

}
.eventFilter__monthItem:hover span, .eventFilter__monthItem.eventFilter__monthItem--active span {
	opacity: 1;
	font-weight: 900;

}
.eventFilter__monthItem.eventFilter__monthItem--current {
	color: #64c16c;

}
.eventFilter__monthItem.eventFilter__monthItem--current span {
	opacity: 1;
	font-weight: 900;

}
/* ------------------------------------------------------------------------- */
.mobile .eventFilter {
	margin-bottom: 50px;

}
.mobile .eventFilter__wrap {
	padding: 30px;

}
.mobile .eventFilter__array {
	-ms-flex-wrap: wrap;
	    flex-wrap: wrap;

}
.mobile .eventFilter__item {
	padding: 15px;

}
.mobile .eventFilter__panel {
	margin-top: 20px;
	background: transparent;

}
.mobile .eventFilter__selectDate {
	width: 100%;

}
.mobile .eventFilter__selectDate .inputSelect {
	width: 50%;
	min-width: 150px;
	margin-left: 0;
	margin-right: 15px;

}
.mobile .eventFilter__selectDate .inputSelect + .inputSelect {
	margin-left: 15px;
	margin-right: 0;

}
.mobile .eventFilter__selectDate .inputSelect .inputSelect__placeholder {
	color: #666666;

}
.mobile .eventFilter__selectDate .inputSelect:before {
	background-color: #fff;

}
.mobile .eventFilter__selectDate .inputSelect.eventFilter__selectMonth {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;

}
.mobile .eventFilter__selectDate .inputSelect .inputSelect__input {
	color: #666666;

}
.mobile .eventFilter__month {
	display: none;

}
@media (max-width: 478px) {
	.mobile .eventFilter {
		margin-top: -20px;

	}
	.mobile .eventFilter__panel {
		height: auto;

	}
	.mobile .eventFilter__selectDate {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		height: auto;

	}
	.mobile .eventFilter__selectDate .inputSelect {
		width: 100%;
		margin-left: 0;
		margin-right: 0;

	}
	.mobile .eventFilter__selectDate .inputSelect + .inputSelect {
		margin-left: 0;
		margin-top: 20px;

	}

}
/* ------------------------------------------------------------------------- */
.contentHeader {
  position: relative;
}
.contentHeader__wrap {
  overflow: hidden;
}
.contentHeader__buttonMore {
  margin-top: 40px;
  text-align: center
}
.contentHeader__buttonMore div {
	display: inline-block;
	padding: 15px 30px;
	margin: 0 auto;
	border: 2px solid #009cff;
	color: #009cff;
	font-size: 16px;
	font-weight: 500;
	white-space: nowrap;
	text-decoration: underline;
	cursor: pointer;
	-webkit-transition: all 0.3s ease;
	transition: all 0.3s ease;
	background-color: transparent;

}
.contentHeader__buttonMore div:hover {
	border-color: #009cff;
	color: #fff;
	background-color: #009cff;

}
.mobile .contentHeader {
	margin-top: 20px;
	margin-bottom: 60px;
	padding-left: 60px;
	padding-right: 60px;

}
.mobile .contentHeader__buttonMore div:hover {
	border-color: #009cff;
	color: #009cff;
	background-color: transparent;

}
@media (max-width: 478px) {
	.mobile .contentHeader {
		margin-top: 0;
		margin-bottom: 60px;
		padding-left: 20px;
		padding-right: 20px;

	}

}
.cardNav__array {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -ms-flex-wrap: wrap;
      flex-wrap: wrap;
  margin: 35px 0;
}
.cardNav__item {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  height: 200px;
  background: linear-gradient(45deg, rgb(13, 164, 129) 0%, rgb(135, 205, 100) 100%) left no-repeat;
  background-size: 0% 100%;
  -webkit-transition: background-size 0.3s ease-in-out;
  transition: background-size 0.3s ease-in-out;
  -webkit-box-shadow: 0 0 40px rgba(0, 0, 0, .2);
          box-shadow: 0 0 40px rgba(0, 0, 0, .2);
  width: calc(33.33333% - 30px);
  margin: 15px;
  -ms-flex-preferred-size: 370px;
      flex-basis: 370px;
  -webkit-box-flex: 1;
      -ms-flex-positive: 1;
          flex-grow: 1
  /* min-width: 370px; */
  /* margin: var(--indent); */
}
.cardNav__item:hover {
	background-size: 100% 100%;

}
.cardNav__item:hover .cardNav__name {
	color: #fff;

}
.cardNav__item:hover .cardNav__name:before {
	background-size: 100% 100%;

}
.cardNav__link {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  width: 100%;
  height: 100%;
  padding: 10px 40px;
}
.cardNav__wrap {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
}
.cardNav__name {
  display: block;
  color: #525252;
  font-size: 1.5em;
  font-weight: 900;
  line-height: 1;
  padding-right: 130px;
  position: relative;
  -webkit-transition: color 0.3s ease-in-out;
  transition: color 0.3s ease-in-out
}
.cardNav__name:after,
  .cardNav__name:before {
	content: '';
	width: 85px;
	height: 2px;
	overflow: hidden;
	background-color: #bfbfbf;
	position: absolute;
	right: 0;
	top: 0.5em;

}
.cardNav__name:before {
	z-index: 10;
	background: linear-gradient(45deg, rgb(255, 255, 255) 0%, rgb(255, 255, 255) 100%) left no-repeat;
	background-size: 0% 100%;
	-webkit-transition: background-size 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out;

}
.cardNav__item--big {
  /* min-width: 500px; */
  -ms-flex-preferred-size: 500px;
      flex-basis: 500px;
  background-size: 100% 100%
}
.cardNav__item--big .cardNav__name {
	color: #fff;

}
.cardNav__item--big .cardNav__name:before {
	background-size: 100% 100%;

}
.cardNav__item--marked .cardNav__name:after {
	background-color: #009cff;

}
.mobile .cardNav__item {
	-ms-flex-preferred-size: auto;
	    flex-basis: auto;

}
.mobile .cardNav__item .cardNav__link {
	padding-left: 30px;
	padding-right: 30px;

}
.mobile .cardNav__item.cardNav__item--big {
	width: calc(50% - 30px);
	margin: 15px;

}
.mobile .cardNav__item:not(.cardNav__item--big) {
	height: 150px;

}
.mobile .cardNav__item:not(.cardNav__item--big) .cardNav__name {
	font-size: 18px;

}
.mobile .cardNav__item .cardNav__name {
	padding-right: 0;

}
.mobile .cardNav__item .cardNav__name:before,
      .mobile .cardNav__item .cardNav__name:after {
	width: 60px;
	left: 0;
	bottom: -1em;
	top: auto;

}
@media (max-width: 478px) {
	.mobile .cardNav__array {
		margin-top: 10px;
		margin-bottom: 10px;

	}
	.mobile .cardNav__item {
		height: 100px;
		width: calc(100% - 30px);
		margin: 15px;

	}
	.mobile .cardNav__item.cardNav__item--big {
		width: calc(100% - 30px);
		margin: 15px;

	}
	.mobile .cardNav__item:not(.cardNav__item--big) {
		height: 100px;

	}
	.mobile .cardNav__item:nth-child(1),.mobile .cardNav__item:nth-child(2) {
		background-size: 100% 100%;

	}
	.mobile .cardNav__item:nth-child(1):hover, .mobile .cardNav__item:nth-child(2):hover {
		background-size: 100% 100% !important;

	}
	.mobile .cardNav__item:nth-child(1):hover .cardNav__name, .mobile .cardNav__item:nth-child(2):hover .cardNav__name {
		color: #fff !important;

	}
	.mobile .cardNav__item:nth-child(1) .cardNav__name, .mobile .cardNav__item:nth-child(2) .cardNav__name {
		color: #fff;

	}
	.mobile .cardNav__item:not(:nth-child(1)):hover, .mobile .cardNav__item:not(:nth-child(2)):hover {
		background-size: 0% 100%;

	}
	.mobile .cardNav__item:not(:nth-child(1)):hover .cardNav__name, .mobile .cardNav__item:not(:nth-child(2)):hover .cardNav__name {
		color: #221F1F;

	}
	.mobile .cardNav__link {
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;

	}
	.mobile .cardNav__name {
		padding-right: 0;
		text-align: center;
		font-size: 20px;

	}
	.mobile .cardNav__name::after,
      .mobile .cardNav__name::before {
		display: none;

	}

}
.alphabetFilter {
  padding: 50px 0;
  background-color: #f7f8fe;
}
.alphabetFilter__toggler {
  font-size: 14px;
  width: 100%;
  background: none;
  border: none;
  outline: none;
}
.alphabetFilter__content {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: justify;
      -ms-flex-pack: justify;
          justify-content: space-between;
  width: 100%;
  overflow: hidden;
  -webkit-transition: height .3s ease;
  transition: height .3s ease;
}
.alphabetFilter__inner {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
}
.alphabetFilter__list {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: start;
      -ms-flex-align: start;
          align-items: flex-start;
  -ms-flex-wrap: wrap;
      flex-wrap: wrap;
  padding: 10px 2px;
}
.alphabetFilter__btn {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
      -ms-flex-pack: center;
          justify-content: center;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  text-align: center;
  color: #009cff;
  font-size: 17px;
  font-weight: 500;
  text-transform: uppercase;
  min-width: 25px;
  width: auto;
  height: 25px;
  margin: 2px;
  padding: 0 5px;
  cursor: pointer;
  -webkit-transition: -webkit-box-shadow .25s;
  transition: -webkit-box-shadow .25s;
  transition: box-shadow .25s;
  transition: box-shadow .25s, -webkit-box-shadow .25s;
  background: none;
  border: none;
  border-radius: 15px;
  outline: none;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
  white-space: nowrap
}
.alphabetFilter__btn:not(.alphabetFilter__btn--disabled):hover {
	-webkit-box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);
	        box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);

}
.alphabetFilter__btn--disabled {
  text-decoration: none;
  color: #d6d6d6;
  cursor: default;
}
.alphabetFilter__btn--active {
  color: #fff;
  background: #009cff;
}
.alphabetFilter__clear {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  font-size: 16px;
  font-family: inherit;
  font-weight: 500;
  color: #009cff;
  margin-left: auto;
  background: transparent;
  border: none;
  outline: none;
  cursor: pointer;
  white-space: nowrap;
  padding: 10px 20px;
  position: relative
}
.alphabetFilter__clear .text {
	border-bottom: 1px dashed currentColor;

}
.alphabetFilter__clear .close {
	position: absolute;
	right: 0;
	top: 50%;
	width: 14px;
	height: 14px;
	-webkit-transform: translateY(-50%);
	        transform: translateY(-50%);

}
.alphabetFilter__clear .close:before,
    .alphabetFilter__clear .close:after {
	position: absolute;
	left: 50%;
	top: 50%;
	content: " ";
	height: 14px;
	width: 2px;
	background-color: #009cff;

}
.alphabetFilter__clear .close:before {
	-webkit-transform: translate(-50%, -50%) rotate(45deg);
	        transform: translate(-50%, -50%) rotate(45deg);

}
.alphabetFilter__clear .close:after {
	-webkit-transform: translate(-50%, -50%) rotate(-45deg);
	        transform: translate(-50%, -50%) rotate(-45deg);

}
.mobile .alphabetFilter__btn:not(.alphabetFilter__btn--disabled):hover {
	-webkit-box-shadow: none;
	        box-shadow: none;

}
@media (min-width: 992px) {
	.mobile .alphabetFilter__list {
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;

	}
	.mobile .alphabetFilter__content {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;

	}
	.mobile .alphabetFilter__inner {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;

	}
	.mobile .alphabetFilter__clear {
		margin: auto;

	}
	.mobile .alphabetFilter__btn {
		min-width: 26px;
		height: 26px;
		-webkit-box-flex: 0;
		    -ms-flex: none;
		        flex: none;
		white-space: nowrap;
		display: -webkit-box;
		display: -ms-flexbox;
		display: flex;
		-webkit-box-align: center;
		    -ms-flex-align: center;
		        align-items: center;
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;

	}

}
@media (max-width: 991px) {
	.mobile .alphabetFilter__inner {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .alphabetFilter__content {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;

	}
	.mobile .alphabetFilter__list {
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;

	}
	.mobile .alphabetFilter__btn {
		width: 42px;
		height: 42px;
		display: -webkit-box;
		display: -ms-flexbox;
		display: flex;
		-webkit-box-align: center;
		    -ms-flex-align: center;
		        align-items: center;
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;

	}

}
@media (max-width: 478px) {
	.mobile .alphabetFilter {
		margin-bottom: 15px;
		padding-top: 20px;
		padding-bottom: 20px;

	}

}
@media (max-width: 991px) {
	.mobile .alphabetFilter__inner {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;

	}
	.mobile .alphabetFilter__clear {
		margin: auto;

	}
	.mobile .alphabetFilter__btn {
		min-width: 42px;
		border-radius: 25px;

	}

}
@media (max-width: 478px) {
	.mobile .alphabetFilter {
		padding-top: 20px;
		padding-bottom: 20px;

	}
	.mobile .alphabetFilter__content {
		display: block;

	}

}
.searchResult {
	margin-top: -45px;
	margin-bottom: 100px;
	padding-left: 15px;
	padding-right: 15px;
}
.searchResult__wrap {
	padding: 60px;
	background-color: #fff;
  -webkit-box-shadow: 0 8px 40px rgba(0, 0, 0, .2);
          box-shadow: 0 8px 40px rgba(0, 0, 0, .2);
}
.searchResult__title {
	margin: 0 0 20px;
	font-size: 20px;
	line-height: 1.75;
}
.searchResult__group {
	margin: 40px 0;
}
.searchResult__item {
	margin: 40px 0;
}
.searchResult__itemTitle {
	display: inline-block;
	color: #515151;
	font-size: 18px;
	font-weight: 900;
	line-height: 1.4
}
.searchResult__itemTitle span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.searchResult__itemTitle:hover span {
	background-size: 100% 1px;

}
.searchResult__itemContent {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	margin: 15px 0 10px 13px;
	padding: 16px;
	background: #f5f5f5;
}
.searchResult__itemContentFile {
	margin-left: -16px;
	margin-top: -16px;
	margin-bottom: -16px
}
.searchResult__itemContentFile + .searchResult__itemContentDescription {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	min-height: 48px;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;

}
.searchResult__itemContentDescription {
	font-size: 14px;
	font-weight: 500;
	line-height: 1.75em
}
.searchResult__itemContentDescription b {
	padding: 0.15em 0.5em;
	margin-left: 0.5em;
	margin-right: 0.5em;
	background: #009cff;
	color: #fff;
	font-weight: 900;
	font-style: normal;

}
.searchResult__itemUrl {
	margin: 10px 0 10px 13px;
	color: #009cff;
	font-size: 14px;
	font-weight: 500
}
.searchResult__itemUrl a {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.searchResult__itemUrl a:hover {
	background-size: 100% 1px;

}
.mobile {
	/*  */
}
.mobile .searchResult__itemUrl a {
	background-size: 100% 1px;

}
.mobile {

	/*  */

}
@media (max-width: 550px) {
	.mobile .searchResult__itemContent {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .searchResult__itemContentFile {
		margin-bottom: 0;

	}
	.mobile .searchResult__itemContentFile .file__icon {
		margin: 7px auto;

	}

}
@media (max-width: 478px) {
	.mobile .searchResult {
		margin-top: 40px;
		margin-bottom: 50px;
		-webkit-box-shadow: none;
		        box-shadow: none;

	}
	.mobile .searchResult__wrap {
		padding: 0;
		-webkit-box-shadow: none;
		        box-shadow: none;

	}
	.mobile .searchResult__title {
		font-size: 18px;
		line-height: 1.4;

	}
	.mobile .searchResult__itemContent {
		margin-left: 0;

	}
	.mobile .searchResult__itemTitle {
		font-size: 16px;

	}

}
.pagination {
	margin: 50px 0 0;
}
.pagination__wrap {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;
}
.pagination__item {
	width: 28px;
	height: 28px;
	border-radius: 50%;
	margin: 0 3px;
	color: #009cff;
	font-size: 17px;
	line-height: 28px;
	font-weight: 500;
	text-align: center;
	-webkit-transition: all 0.2s ease;
	transition: all 0.2s ease
}
.pagination__item:not(span):not(.pagination__item--prev):not(.pagination__item--next):hover {
	background: #fff;
	color: #000;
	-webkit-box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);
	        box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);

}
.pagination__item--active {
	color: #fff;
	background-color: #009cff;
	cursor: default;
}
.pagination__item--prev,
.pagination__item--next {
	z-index: 6;
	cursor: pointer;
	-webkit-transition: -webkit-transform 0.3s ease;
	transition: -webkit-transform 0.3s ease;
	transition: transform 0.3s ease;
	transition: transform 0.3s ease, -webkit-transform 0.3s ease;
	position: relative
}
.pagination__item--prev:hover, .pagination__item--next:hover {
	-webkit-transform: scale(1.3);
	        transform: scale(1.3);

}
.pagination__item--prev:before,
	.pagination__item--prev:after,
	.pagination__item--next:before,
	.pagination__item--next:after {
	content: '';
	display: block;
	width: 7px;
	height: 2px;
	border-radius: 1px;
	overflow: hidden;
	background: #009cff;
	position: absolute;
	left: 10px;

}
.pagination__item--prev:before, .pagination__item--next:before {
	top: 10px;

}
.pagination__item--prev:after, .pagination__item--next:after {
	top: 14px;

}
.pagination__item--prev.pagination__item--inActive, .pagination__item--next.pagination__item--inActive {
	opacity: 0.5;
	cursor: default;

}
.pagination__item--prev.pagination__item--inActive:hover, .pagination__item--next.pagination__item--inActive:hover {
	-webkit-transform: none;
	        transform: none;

}
.pagination__item--prev:before {
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);

}
.pagination__item--prev:after {
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);

}
.pagination__item--next:before {
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);

}
.pagination__item--next:after {
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);

}
@media (max-width: 991px) {
	.mobile .pagination {
		margin-top: 30px;

	}

}
@media (max-width: 478px) {
	.mobile .pagination {
		margin-top: 20px;

	}

}
.commentForm {
	color: #221F1F;
	margin: 0
}
.commentForm input,
	.commentForm textarea,
	.commentForm button {
	font-family: inherit;

}
.commentForm.commentForm--hero {
	margin-bottom: 78px;
}
.commentForm__user {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	margin-bottom: 24px;
}
.commentForm__username {
	font-size: 18px;
	font-weight: 600;
}
.commentForm__userpic {
	width: 58px;
	height: 58px;
	margin-right: 22px;
	border-radius: 50%;
	-webkit-box-shadow: 0px 0px 40px 0px rgba(0, 0, 0, .13);
	        box-shadow: 0px 0px 40px 0px rgba(0, 0, 0, .13);
	background-size: cover;
	background-repeat: no-repeat;
	background-position: center;
}
.commentForm__input,
.commentForm__textarea {
	width: 100%;
	font-weight: 400;
	font-size: 16px;
	padding: 11px 25px;
	margin-bottom: 18px;
	border: 1px solid #f7f7f7;
	background-color: #f7f8fe;
	-webkit-transition: background-color .3s ease;
	transition: background-color .3s ease
}
.commentForm__input:last-child, .commentForm__textarea:last-child {
	margin-bottom: 0;

}
.commentForm__input ::-webkit-input-placeholder, .commentForm__textarea ::-webkit-input-placeholder {
	color: #232323;
	opacity: .45;

}
.commentForm__input ::-moz-placeholder,          .commentForm__textarea ::-moz-placeholder          {
	color: #232323;
	opacity: .45;

}
.commentForm__input :-moz-placeholder,           .commentForm__textarea :-moz-placeholder           {
	color: #232323;
	opacity: .45;

}
.commentForm__input :-ms-input-placeholder,      .commentForm__textarea :-ms-input-placeholder      {
	color: #232323;
	opacity: .45;

}
.commentForm__input:focus, .commentForm__textarea:focus {
	outline: none;
	background-color: #efefef;

}
.commentForm__input.commentForm__input--half {
	max-width: 50%;
}
.commentForm__textarea {
	max-width: 100%;
	min-width: 100%;
	padding-top: 25px;
	padding-bottom: 25px;
	min-height: 114px;
}
.commentForm__btn {
	-webkit-box-flex: 0;
	    -ms-flex: none;
	        flex: none;
	color: #fff;
	text-align: center;
	font-weight: 500;
	font-size: 16px;
	line-height: 1.2;
	padding: 18px 30px;
	margin-left: auto;
	background-color: transparent;
	color: #009cff;
	border: 2px solid #009cff;

	-webkit-transition: background-color .3s ease;

	transition: background-color .3s ease;
	cursor: pointer;
	-webkit-user-select: none;
	   -moz-user-select: none;
	    -ms-user-select: none;
	        user-select: none;
	white-space: nowrap;
	outline: none
}
.commentForm__btn:focus,
	.commentForm__btn:hover {
	color: #fff;
	background-color: #009cff;

}
.commentForm__btn:disabled {
	cursor: not-allowed;
	color: rgb(127, 127, 127);
	background-color: rgb(204, 204, 204);

}
.commentForm__footer {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	margin-top: 40px;
}
.commentForm__captcha {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	margin-right: 30px;
}
.commentForm__captchaImgContainer {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	margin-right: 20px;
	width: 156px;
	height: 42px;
	-webkit-box-flex: 0;
	    -ms-flex: none;
	        flex: none
}
.commentForm__captchaImgContainer img {
	max-width: 100%;

}
.commentForm__captchaInput {
	max-width: 255px;
}
.commentForm.commentForm--reply {
	padding: 40px;
	border: 1px solid #dee1eb;
	position: relative
}
.commentForm.commentForm--reply::before,
	.commentForm.commentForm--reply::after {
	content: '';
	display: block;
	width: 26px;
	height: 15px;
	background-color: #fff;
	left: 26px;
	position: absolute;

}
.commentForm.commentForm--reply::before {
	border: 1px solid #dee1eb;
	-webkit-transform: skewY(34deg);
	        transform: skewY(34deg);
	top: -6px;

}
.commentForm.commentForm--reply::after {
	content: '';
	display: block;
	top: 0;
	height: 20px;

}
.commentForm.commentForm--reply .commentForm__textarea {
	resize: none;
	max-height: 114px;

}
@media (min-width: 992px) {
	.mobile .commentForm__captchaImgContainer {
		width: 110px;
		margin: 0;
		margin-bottom: 10px;

	}

}
@media (max-width: 991px) {
	.mobile .commentForm__captchaImgContainer {
		width: 110px;
		margin: 0;
		margin-bottom: 10px;

	}

}
@media (max-width: 768px) {
	.mobile .commentForm__footer {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .commentForm__captcha {
		margin-right: 0;
		width: 100%;

	}
	.mobile .commentForm__captchaInput {
		max-width: none;

	}
	.mobile .commentForm__btn {
		margin-top: 30px;

	}
	.mobile .commentForm__input.commentForm__input--half {
		max-width: 100%;

	}

}
@media (max-width: 720px) {
	.mobile .commentForm.commentForm--hero {
		margin-bottom: 70px;

	}

}
@media (max-width: 478px) {
	.mobile .commentForm.commentForm--reply {
		padding: 5px;
		padding-top: 22px;

	}
	.mobile .commentForm.commentForm--hero {
		margin-bottom: 60px;

	}
	.mobile .commentForm__input,
		.mobile .commentForm__textarea {
		padding: 11px;

	}
	.mobile .commentForm__btn {
		width: 100%;
		padding: 18px;

	}

}
.comments {
	padding: 70px 0;
}
.comments__title {
	color: #221F1F;
	font-size: 28px;
	font-weight: 600;
	padding-left: 12px;
	margin-bottom: 34px;
}
.comment {
	color: #221F1F;
}
.comment .comment .comment .comment .comment .comment__children {
	margin-left: 0;
}
.comment__content {
	padding: 24px 28px 44px 46px;
}
.comment__header {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
}
.comment__username {
	font-size: 16px;
	font-weight: 600;
	margin-bottom: 6px;
}
.comment__datetime {
	font-size: 14px;
	font-weight: 400;
}
.comment__userpic {
	-webkit-box-flex: 0;
	    -ms-flex: none;
	        flex: none;
	width: 58px;
	height: 58px;
	margin-right: 22px;
	margin-left: -9px;
	border-radius: 50%;
	-webkit-box-shadow: 0px 0px 40px 0px rgba(0, 0, 0, .13);
	        box-shadow: 0px 0px 40px 0px rgba(0, 0, 0, .13);
	background-size: cover;
	background-repeat: no-repeat;
	background-position: center;
}
.comment__body {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	-webkit-box-align: end;
	    -ms-flex-align: end;
	        align-items: flex-end;
	margin-top: 24px;
}
.comment__message {
	font-weight: 500;
	line-height: 1.5;
	margin: 0;
	margin-right: 45px;
}
.comment__reply {
	padding: 0;
	color: #009cff;
	font-size: 16px;
	font-weight: 600;

	border: none;
	background: none;

	cursor: pointer;
	-webkit-user-select: none;
	   -moz-user-select: none;
	    -ms-user-select: none;
	        user-select: none
}
.comment__reply:disabled {
	cursor: not-allowed;
	color: rgb(127, 127, 127);

}
.comment__reply:focus {
	outline: none;

}
.comment__children {
	margin-left: 48px;
}
.comment__replyFormWrap {
	height: 0;
	overflow: hidden;
	-webkit-transition: height .3s ease;
	transition: height .3s ease;
}
.comment__replyForm {
	margin: 34px 0 54px 35px;
}
@media (max-width: 720px) {
	.mobile .comments {
		padding-top: 40px;
		padding-bottom: 40px;

	}
	.mobile .comment__content {
		padding: 24px 20px 30px;

	}
	.mobile .comment__children {
		margin-left: 20px;

	}
	.mobile .comment__replyForm {
		margin: 20px;
		margin-right: 0;

	}
	.mobile .comment .comment .comment .comment .comment__children {
		margin-left: 0;

	}

}
@media (max-width: 478px) {
	.mobile .comments__title {
		font-size: 20px;
		padding-left: 0;
		margin-bottom: 30px;

	}
	.mobile .comment__body {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		-webkit-box-align: start;
		    -ms-flex-align: start;
		        align-items: flex-start;

	}
	.mobile .comment__content {
		padding-bottom: 20px;

	}
	.mobile .comment__message {
		margin-right: 0;
		-ms-flex-item-align: start;
		    align-self: flex-start;

	}
	.mobile .comment__reply {
		margin-top: 10px;

	}
	.mobile .comment .comment .comment__children {
		margin-left: 0;

	}
	.mobile .comment .comment .commentForm__btn {
		padding-left: 10px;
		padding-right: 10px;

	}

}
.contentTwoColumn {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
  -webkit-box-pack: justify;
      -ms-flex-pack: justify;
          justify-content: space-between;
}
.contentTwoColumn__firstColumn {
	width: 25%;
  margin-right: 65px
}
.contentTwoColumn__firstColumn + .contentTwoColumn__secondColumn {
	width: 75%;

}
.contentTwoColumn__firstColumn > div + div {
	margin-top: 50px;

}
.contentTwoColumn__secondColumn {
	width: 100%
}
.contentTwoColumn__secondColumn > div + div {
	margin-top: 80px;

}
.contentTwoColumn__title {
	margin-bottom: 33px;
  font-size: 1.875em;
  font-weight: 900;
  line-height: 1.4;
}
/* ------------------------------------------------------------------------- */
/* Образование */
.contentEducation {}
.contentEducation__array {
	padding: 40px 28px;
  border: 1px solid #ddd;
}
.contentEducation__item:not(:first-child) {
	padding-top: 56px;
	position: relative;

}
.contentEducation__item:not(:first-child):before {
	content: '';
	display: block;
	width: 2px;
	height: 40px;
	overflow: hidden;
	background-color: #ddd;
	position: absolute;
	top: 0;
	left: 0;

}
.contentEducation__date {
	margin-bottom: -4px;
  font-size: 1.5em;
  font-weight: 900;
  line-height: 1;
}
.contentEducation__description {
	margin: 10px 0;
  font-size: 1.125em;
  font-weight: 400;
  line-height: 1.5;
}
/* ------------------------------------------------------------------------- */
/* Видео */
.contentVideo {}
.contentVideo__title {}
.contentVideo__array {}
.contentVideo__item {
	max-width: 345px
}
.contentVideo__item:not(:first-child) {
	margin-top: 50px;

}
.contentVideo__video {
	display: block
}
.contentVideo__video:hover .contentVideo__image span {
	-webkit-transform: scale(1.1);
	        transform: scale(1.1);

}
.contentVideo__video:hover .contentVideo__description span {
	color: #0534ff;
	background-size: 100% 1px;

}
.contentVideo__image {
	display: block;
	width: 100%;
	height: 164px;
	overflow: hidden;
	position: relative
}
.contentVideo__image:before {
	content: '';
	display: block;
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	opacity: 1;
	background-color: #3b5fd7;

}
.contentVideo__image:after {
	content: '';
	display: block;
	width: 45px;
	height: 45px;
	overflow: hidden;
	background: url('/images/play.svg') no-repeat;
	background-size: 45px 45px;
	position: absolute;
	top: 100px;
	left: 25px;
	opacity: 1;
	z-index: 10;

}
.contentVideo__image span {
	display: block;
	height: 164px;
	overflow: hidden;
	background-size: cover;
	background-repeat: no-repeat;
	position: relative;
	opacity: 0.4;
	-webkit-transition: -webkit-transform 0.3s ease;
	transition: -webkit-transform 0.3s ease;
	transition: transform 0.3s ease;
	transition: transform 0.3s ease, -webkit-transform 0.3s ease;
}
.contentVideo__description {
	padding: 20px 5px 0 2px;
	padding-left: 2px;
	padding-right: 10px;
	display: block;
	font-size: 16px;
	line-height: 1.5;
	font-weight: 900
}
.contentVideo__description span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
/* ------------------------------------------------------------------------- */
/* Достижения */
.contentAchievements {
}
.contentAchievements__title {}
.contentAchievements__array {
	border: 1px solid #ddd;
}
.contentAchievements__item {
	padding: 35px 28px;
	position: relative
}
.contentAchievements__item:not(.contentAchievements__item--accented):not(:last-child):after {
	content: '';
	display: block;
	width: 80px;
	height: 1px;
	background-color: #ddd;
	position: absolute;
	bottom: -1px;
	left: 28px;

}
.contentAchievements__item.contentAchievements__item--accented {
	background-color: #f9f9f9;
	font-weight: 900;

}
.contentAchievements__description {
	font-size: 16px;
	font-weight: 400;
	line-height: 1.5;
}
/* ------------------------------------------------------------------------- */
/* Основной контент */
.contentTwoColumn__secondColumn .contentMain:first-child {
	margin-top: -1.4em;

}
.contentTwoColumn__secondColumn .quotation {
	padding-bottom: 30px;
	border-bottom: 1px solid #c5c5c5;

}
/* ------------------------------------------------------------------------- */
/* Интервью */
.contentInterview {
	margin: 1.5em 0;
}
.contentInterview__title {}
.contentInterview__array {}
.contentInterview__item {}
.contentInterview__question {
	margin: 50px 0;
	padding: 5px 25px;
	color: #33b178;
	font-size: 20px;
	line-height: 1.5;
	font-weight: 900;
	position: relative
}
.contentInterview__question:before {
	content: '';
	display: block;
	width: 6px;
	height: 100%;
	position: absolute;
	left: 0;
	top: 0;

	/* background: linear-gradient(45deg, #48b873 0%, #87cd64 100%); */
	background: linear-gradient(45deg, #0da481 0%, #3bcf56 100%);

}
.contentInterview__answer {
	margin-left: 70px;
}
/* ------------------------------------------------------------------------- */
/* Профессиональный опыт */
.contentProExperience {}
.contentProExperience__array {}
.contentProExperience__item {
	padding: 38px 0;
	border-top: 1px solid #ddd
}
.contentProExperience__item:last-child {
	border-bottom: 1px solid #ddd;

}
.contentProExperience__date {
	font-size: 1.125em;
  font-weight: 900;
  line-height: 1;
}
.contentProExperience__description {
	margin-top: 10px;
	font-size: 1.0625em;
}
/* ------------------------------------------------------------------------- */
.mobile {
	/*  */
}
.mobile .contentVideo__description span {
	color: #0534ff;
	background-size: 100% 1px;

}
.mobile {

	/*  */

}
@media (max-width: 991px) {
	.mobile .contentTwoColumn {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .contentTwoColumn__firstColumn,
		.mobile .contentTwoColumn__secondColumn {
		width: 100%;

	}
	.mobile .contentTwoColumn__firstColumn {
		margin-right: 0;

	}
	.mobile .contentEducation__array {
		border: 0;
		padding: 0;

	}
	.mobile .contentEducation__item {
		padding-bottom: 40px;

	}
	.mobile .contentEducation__item:not(:first-child) {
		padding-top: 40px;
		border-top: 1px solid #ddd;

	}
	.mobile .contentEducation__item:not(:first-child):before {
		display: none;

	}
	.mobile .contentVideo__array {
		display: -webkit-box;
		display: -ms-flexbox;
		display: flex;
		-ms-flex-wrap: wrap;
		    flex-wrap: wrap;
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;
		margin: -15px;

	}
	.mobile .contentVideo__item {
		margin: 15px;

	}
	.mobile .contentInterview__answer {
		margin-left: 60px;

	}

}
@media (max-width: 478px) {
	.mobile .contentTwoColumn__title {
		font-size: 24px;
		margin-bottom: 25px;

	}
	.mobile .contentInterview,
		.mobile .contentVideo {
		margin-top: 30px;

	}
	.mobile .contentInterview__answer {
		margin-left: 0;

	}
	.mobile .contentInterview__question {
		padding: 0;
		margin-top: 28px;
		margin-bottom: 28px;
		font-size: 16px;

	}
	.mobile .contentInterview__question::before {
		display: none;

	}
	.mobile .contentAchievements__item {
		padding: 20px;

	}
	.mobile .contentMain {
		margin-top: 30px;

	}
	.mobile .contentMain .quotation {
		padding-bottom: 30px;
		border-bottom: 1px solid #c5c5c5;

	}
	.mobile .contentEducation {
		margin-top: 30px;

	}
	.mobile .contentEducation__item {
		padding-bottom: 30px;

	}
	.mobile .contentEducation__date {
		font-size: 18px;
		margin-bottom: 0;

	}
	.mobile .contentEducation__description {
		margin-top: 10px;
		font-size: 1.0625em;
		font-weight: 400;
		line-height: normal;

	}
	.mobile .contentTwoColumn__secondColumn .contentMain:first-child {
		margin-top: 2em;

	}

}
.contentBlock {}
.contentBlock__wrap {}
.cardCompanyLarge {
  max-width: 1260px;
  margin: 30px auto;
  padding-left: 15px;
  padding-right: 15px
}
.cardCompanyLarge.cardCompanyLarge--topPosition {
	margin-top: -45px;
	margin-bottom: 100px;

}
.cardCompanyLarge__wrap {
  background-color: #fff;
  -webkit-box-shadow: 0 8px 40px rgba(0, 0, 0, .2);
          box-shadow: 0 8px 40px rgba(0, 0, 0, .2);
}
.cardCompanyLarge__top {
  padding: 75px 75px 65px;
  position: relative;
}
.cardCompanyLarge__group {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: end;
      -ms-flex-align: end;
          align-items: flex-end;
}
.cardCompanyLarge__logo {
  -webkit-box-flex: 0;
      -ms-flex: none;
          flex: none;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  width: 160px;
  height: 160px;
  overflow: hidden
}
.cardCompanyLarge__logo img {
	max-width: 100%;
	height: auto;

}
.cardCompanyLarge__info {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  min-height: 82px;
}
.cardCompanyLarge__infoGroup {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
}
.cardCompanyLarge__address,
.cardCompanyLarge__email,
.cardCompanyLarge__telephone {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  min-width: 260px;
  padding: 15px 40px;
  font-size: 16px;
  font-weight: 500;
  line-height: 1.5;
  color: #000;
}
.cardCompanyLarge__email,
.cardCompanyLarge__telephone {
  white-space: nowrap;
  border-left: 1px solid #cccccc;
}
.cardCompanyLarge__email a span {
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.cardCompanyLarge__email a:hover span {
	background-size: 100% 1px;

}
.cardCompanyLarge__site {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: stretch;
      -ms-flex-align: stretch;
          align-items: stretch;
  height: 74px;
  position: absolute;
  top: 0;
  right: 0;
  font-size: 18px;
  font-weight: 500
}
.cardCompanyLarge__site a {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	padding: 0 100px 0 30px;
	position: relative;

	/* background-color: var(--gray-light-12); */
	-webkit-transition: background-color 0.3s ease;
	transition: background-color 0.3s ease;

}
.cardCompanyLarge__site a:before {
	content: "";
	display: block;
	width: 74px;
	height: 74px;
	position: absolute;
	right: 0;
	top: 0;
	background: -webkit-gradient(linear, left top, right top, from(#0da481), to(#3bcf56));
	background: linear-gradient(90deg, #0da481 0%, #3bcf56 100%);

}
.cardCompanyLarge__site a:after {
	content: "";
	display: block;
	width: 74px;
	height: 74px;
	position: absolute;
	right: 0;
	top: 0;
	background-image: url("/images/icon-profile-link-white-target.svg");
	background-repeat: no-repeat;
	background-size: 35px 35px;
	background-position: center;

}
.cardCompanyLarge__site a span {
	color: #009cff;
	background-image: -webkit-gradient(linear, left top, left bottom, from(currentColor), to(currentColor));
	background-image: linear-gradient(currentColor, currentColor);
	background-position: bottom left;
	background-repeat: no-repeat;
	background-size: 0 1px;
	-webkit-transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;
	transition: background-size 0.3s ease-in-out, color 0.3s ease-in-out;

}
.cardCompanyLarge__site a:hover {
	background-color: #f5f5f5;

}
.cardCompanyLarge__site a:hover span {
	background-size: 100% 1px;

}
.cardCompanyLarge__map {
  width: 100%;
  height: 256px;
  background-color: #e1dfda
}
.cardCompanyLarge__map .js-googleMap {
	width: 100%;
	height: 256px;

}
@media (max-width: 991px) {
	.mobile .cardCompanyLarge.cardCompanyLarge--topPosition {
		margin-bottom: 55px;

	}
	.mobile .cardCompanyLarge__site {
		height: 60px;

	}
	.mobile .cardCompanyLarge__site a {
		padding-left: 0;
		padding-right: 75px;

	}
	.mobile .cardCompanyLarge__site a::before,
        .mobile .cardCompanyLarge__site a::after {
		width: 60px;
		height: 60px;

	}
	.mobile .cardCompanyLarge__site a::after {
		background-size: 30px;

	}
	.mobile .cardCompanyLarge__top {
		padding: 65px 65px 40px 45px;

	}
	.mobile .cardCompanyLarge__address {
		padding-left: 10px;
		padding-right: 24px;

	}
	.mobile .cardCompanyLarge__infoGroup {
		-ms-flex-wrap: wrap;
		    flex-wrap: wrap;

	}
	.mobile .cardCompanyLarge__email {
		padding-bottom: 10px;

	}
	.mobile .cardCompanyLarge__telephone {
		padding-top: 10px;

	}

}
@media (max-width: 768px) {
	.mobile .cardCompanyLarge__email,
    .mobile .cardCompanyLarge__telephone {
		padding-left: 20px;
		padding-right: 20px;

	}

}
@media (max-width: 720px) {
	.mobile .cardCompanyLarge__info {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .cardCompanyLarge__address,
    .mobile .cardCompanyLarge__email,
    .mobile .cardCompanyLarge__telephone {
		padding: 15px;
		min-width: auto;

	}
	.mobile .cardCompanyLarge__email,
    .mobile .cardCompanyLarge__telephone {
		border: none;

	}
	.mobile .cardCompanyLarge__infoGroup {
		-webkit-box-orient: horizontal;
		-webkit-box-direction: normal;
		    -ms-flex-direction: row;
		        flex-direction: row;
		border-top: 1px solid #cccccc;

	}

}
@media (max-width: 478px) {
	.mobile .cardCompanyLarge.cardCompanyLarge--topPosition {
		margin-top: -20px;
		margin-bottom: 45px;

	}
	.mobile .cardCompanyLarge__top {
		padding: 70px 15px 45px;

	}
	.mobile .cardCompanyLarge__group {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		-webkit-box-align: start;
		    -ms-flex-align: start;
		        align-items: flex-start;

	}
	.mobile .cardCompanyLarge__logo {
		padding: 20px 20px;
		max-width: 100%;
		height: auto;
		width: auto;
		margin-left: auto;
		margin-right: auto;

	}
	.mobile .cardCompanyLarge__address {
		text-align: center;

	}
	.mobile .cardCompanyLarge__infoGroup {
		padding-top: 20px;
		border: none;
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		-webkit-box-align: center;
		    -ms-flex-align: center;
		        align-items: center;

	}
	.mobile .cardCompanyLarge__email,
    .mobile .cardCompanyLarge__telephone {
		padding: 5px;

	}
	.mobile .cardCompanyLarge__site a {
		padding-right: 0;
		margin-right: 20px;

	}
	.mobile .cardCompanyLarge__site a:before,
      .mobile .cardCompanyLarge__site a:after {
		display: none;

	}

}
.googleMap {}
.subscribe__trigger {
  display: none;
}
.subscribe__bg {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  width: 100%;
  height: 100vh;
  opacity: 0;
  visibility: hidden;
  background-color: #1e1e1e;
  z-index: -1;
  -webkit-transition: opacity .3s ease-in-out;
  transition: opacity .3s ease-in-out;
}
/* ----- Кнопка-триггер ----- */
.subscribe__label {
  position: relative;
  display: block;
  height: 100%;
  cursor: pointer;
}
.subscribe__svg {
  position: absolute;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%,-50%);
          transform: translate(-50%,-50%);

  width: 29px;
  height: 19px;
  fill: none;
  stroke: #9b9b9b;
  stroke-width: 2px;
  -webkit-transition: stroke .2s ease-in-out;
  transition: stroke .2s ease-in-out;
}
/* ----- Лэйаут ----- */
.subscribe__container {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  width: 100vw;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  -webkit-transform: translateX(-100%);
          transform: translateX(-100%);
  z-index: 202;
  -webkit-transition: -webkit-transform 0.3s ease-in-out;
  transition: -webkit-transform 0.3s ease-in-out;
  transition: transform 0.3s ease-in-out;
  transition: transform 0.3s ease-in-out, -webkit-transform 0.3s ease-in-out;
  background: -webkit-gradient(linear, left bottom, left top, from(#0da481), to(#3bcf56));
  background: linear-gradient(0deg, #0da481 0%, #3bcf56 100%);
}
.subscribe__container:before {
  content: '';
  display: block;
  position: absolute;
  top: 0;
  right: 0;
  width: 50%;
  height: 100%;
  background-color: #fff;
}
.subscribe__box {
  position: relative;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  height: 100%;
}
.subscribe__form,
.subscribe__description {
  width: 50%;
}
.subscribe__formClose {
  position: absolute;
  top: 50%;
  right: 0;
  -webkit-transform: translateY(-50%);
          transform: translateY(-50%);
  width: 26px;
  height: 26px;
  z-index: 120;
  cursor: pointer;
  overflow: hidden
}
.subscribe__formClose:after,
  .subscribe__formClose:before {
	content: '';
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	width: 100%;
	height: 3px;
	margin: auto;
	background-color: #221F1F;
	-webkit-transition: background-color .3s ease-in-out;
	transition: background-color .3s ease-in-out;

}
.subscribe__formClose:before {
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);

}
.subscribe__formClose:after {
	-webkit-transform: rotate(-45deg);
	        transform: rotate(-45deg);

}
.subscribe__formClose:hover:after,
  .subscribe__formClose:hover:before {
	background-color: #ffae00;

}
/* ----- Форма подписки ----- */
.subscribe__form {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center
}
.subscribe__form form {
	width: 100%;
	margin-bottom: 0px;

}
.subscribe__formContainer {
  position: relative;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: justify;
      -ms-flex-pack: justify;
          justify-content: space-between;
}
.subscribe__formLabel {
  position: relative;
  width: 100%;
  padding: 8px 0;
}
.subscribe__formError {
  position: absolute;
  left: 0;
  bottom: -12px;
  font-weight: 500;
  /* color: var(--red-01); */
  color: #fff;
  opacity: 0;
  -webkit-transition: opacity .3s;
  transition: opacity .3s;
}
.hasError .subscribe__formError {
  opacity: 1;
}
.subscribe__formInput {
  width: 100%;
  padding: 0;
  margin: 0;
  border: none;
  font-size: 24px;
  color: #fff;
  border: none;
  background-color: transparent
}
.subscribe__formInput:focus {
	outline: none;

}
.subscribe__formInput::-webkit-input-placeholder {

	/* Chrome/Opera/Safari */
	color: #fff;
	opacity: 0.8;

}
.subscribe__formInput::-moz-placeholder {

	/* Firefox 19+ */
	color: #fff;
	opacity: 0.8;

}
.subscribe__formInput:-ms-input-placeholder {

	/* IE 10+ */
	color: #fff;
	opacity: 0.8;

}
.subscribe__formInput:-moz-placeholder {

	/* Firefox 18- */
	color: #fff;
	opacity: 0.8;

}
.subscribe__formSubmit {
  width: 45px;
  min-width: 45px;
  height: 46px;
  margin: 0 30px;
  padding: 0;
  border: none;
  border-radius: 50%;
  background: url(../images/arrow-subscribe.svg) 50% 50% no-repeat rgba(255, 255, 255, .1);
  -webkit-transition: background-color .2s ease-in-out;
  transition: background-color .2s ease-in-out;
  cursor: pointer
}
.subscribe__formSubmit:focus {
	outline: none;

}
.subscribe__formSubmit:hover {
	background-color: rgba(255, 255, 255, .3);

}
/* ----- Описание ----- */
.subscribe__description {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  position: relative;
  padding-left: 30px;
  padding-right: 30px;
  background-color: #fff;
  overflow: hidden
}
.subscribe__description span {
	max-width: 460px;
	font-size: 14px;
	opacity: 0;
	-webkit-transform: translateY(10px);
	        transform: translateY(10px);
	will-change: opacity, transform;
	-webkit-transition: opacity .3s ease-in-out .35s,
                -webkit-transform .3s ease-in-out .35s;
	transition: opacity .3s ease-in-out .35s,
                -webkit-transform .3s ease-in-out .35s;
	transition: opacity .3s ease-in-out .35s,
                transform .3s ease-in-out .35s;
	transition: opacity .3s ease-in-out .35s,
                transform .3s ease-in-out .35s,
                -webkit-transform .3s ease-in-out .35s;

}
/* ----- Анимация ----- */
.subscribe__trigger:checked +
.subscribe__label +
.subscribe__container {
  -webkit-transform: translateX(0%);
          transform: translateX(0%);
}
.subscribe__trigger:checked +
.subscribe__label +
.subscribe__container .subscribe__description span {
  opacity: 1;
  -webkit-transform: translateY(0);
          transform: translateY(0);
}
.subscribe__trigger:checked +
.subscribe__label +
.subscribe__container +
.subscribe__bg {
  visibility: visible;
  opacity: .87;
  z-index: 50;
}
/* ----- Мобилка ----- */
.mobile .subscribe .container--nonIndents {
	padding-left: 30px;
	padding-right: 30px;

}
.socialShare__title {
  font-size: 16px;
  font-weight: 400;
  line-height: 1.5;
  margin: 0;
  margin-bottom: 6px;
}
.socialShare .ya-share2__container {
  margin: -4px;
  margin-right: 0;
}
.socialShare .ya-share2__list {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -ms-flex-wrap: nowrap;
      flex-wrap: nowrap;
}
.socialShare .ya-share2 .ya-share2__item {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  width: 36px;
  height: 36px;
  border-radius: 3px;
  margin: 4px;

  font-size: 0
}
.socialShare .ya-share2 .ya-share2__item .ya-share2__link,
  .socialShare .ya-share2 .ya-share2__item .ya-share2__badge,
  .socialShare .ya-share2 .ya-share2__item .ya-share2__icon {
	width: 100%;
	height: 100%;

}
.socialShare .ya-share2 .ya-share2__item .ya-share2__badge {
	background-color: transparent;

}
.socialShare .ya-share2 .ya-share2__item .ya-share2__icon {
	background-image: url(../images/profile-social-icon.svg);
	background-repeat: no-repeat;
	background-size: 432px 36px;
	background-color: transparent;

}
.socialShare .ya-share2 .ya-share2__item .ya-share2__icon:active {
	-webkit-box-shadow: none;
	        box-shadow: none;

}
.socialShare .ya-share2 .ya-share2__item.ya-share2__item_service_facebook .ya-share2__icon {
	background-position: 0 0;

}
.socialShare .ya-share2 .ya-share2__item.ya-share2__item_service_twitter .ya-share2__icon {
	background-position: -36px 0;

}
.socialShare .ya-share2 .ya-share2__item.ya-share2__item_service_vkontakte .ya-share2__icon {
	background-position: -72px 0;

}
.socialShare .ya-share2 .ya-share2__item.ya-share2__item_service_odnoklassniki .ya-share2__icon {
	background-position: -108px 0;

}
.socialShare .ya-share2 .ya-share2__item {

	/* в шаре нет инстаграма */

	/* & .ya-share2__item_service_instagram {
    & .ya-share2__icon {
      background-position: -144px 0;
    }
  } */

}
.socialShare .ya-share2 .ya-share2__item.ya-share2__item_service_gplus .ya-share2__icon {
	background-position: -180px 0;

}
/* Modifiers
*/
.socialShare.socialShare--whiteBg .ya-share2__item {
	background-color: rgba(255, 255, 255, .8);

}
.socialShare.socialShare--whiteTitle .socialShare__title {
	color: #fff;

}
.socialShare.socialShare--bordered .ya-share2__item {
	border: 1px solid currentColor;

}
.socialShare.socialShare--green .ya-share2__item {
	color: #33b178;

}
.socialShare.socialShare--blue .ya-share2__item {
	color: #009cff;

}
.socialShare.socialShare--blue .ya-share2__item.ya-share2__item_service_facebook .ya-share2__icon {
	background-position: -216px 0;

}
.socialShare.socialShare--blue .ya-share2__item.ya-share2__item_service_twitter .ya-share2__icon {
	background-position: -252px 0;

}
.socialShare.socialShare--blue .ya-share2__item.ya-share2__item_service_vkontakte .ya-share2__icon {
	background-position: -288px 0;

}
.socialShare.socialShare--blue .ya-share2__item.ya-share2__item_service_odnoklassniki .ya-share2__icon {
	background-position: -324px 0;

}
.socialShare.socialShare--blue .ya-share2__item {

	/* в шаре нет инстаграма */

	/* &.ya-share2__item_service_instagram {
          & .ya-share2__icon {
            background-position: -360px 0;
          }
      } */

}
.socialShare.socialShare--blue .ya-share2__item.ya-share2__item_service_gplus .ya-share2__icon {
	background-position: -396px 0;

}
.eventSpeaker {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: start;
      -ms-flex-align: start;
          align-items: flex-start;
	color: #221F1F;
	margin-bottom: 40px
}
.eventSpeaker .cardProfile__item {
	margin: 0;

}
.eventSpeaker:last-child {
	margin-bottom: 0;

}
.eventSpeaker.eventSpeaker--withoutLink .cardProfile__images img:hover {
	-webkit-transform: none;
	        transform: none;

}
.eventSpeaker.eventSpeaker--withoutLink .eventSpeaker__name {
	color: #221F1F;

}
.eventSpeaker.eventSpeaker--externalLink .cardProfile__iconLink {
	background-image: url('/images/icon-profile-link-target.svg');

}
.eventSpeaker__faceContainer {
  -webkit-box-flex: 0;
      -ms-flex: none;
          flex: none;
}
.eventSpeaker__content {
  -webkit-box-flex: 1;
      -ms-flex-positive: 1;
          flex-grow: 1;
  margin-left: 57px;
}
.eventSpeaker__contentBody {
  padding-bottom: 26px;
  border-bottom: 1px solid rgb(240, 240, 240);
}
.eventSpeaker__name {
  display: inline-block;
  color: #009cff;
  font-weight: 900;
  font-size: 30px;
  margin-bottom: 5px;
}
.eventSpeaker__post {
  font-size: 18px;
  margin-bottom: 25px;
}
.eventSpeaker__timePeriod {
  font-weight: 900;
  font-size: 18px;
  margin-bottom: 20px;
}
.eventSpeaker__presentationName {
  font-weight: 500;
  font-size: 16px;
  color: #009cff;
}
.eventSpeaker__sections {
  margin-top: 26px;
}
.eventSpeaker__sectionsTitle {
  margin-bottom: 20px;
  font-size: 18px;
  font-weight: 900;
}
.eventSpeaker__sectionsItems {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -ms-flex-wrap: wrap;
      flex-wrap: wrap;
  -webkit-box-pack: justify;
      -ms-flex-pack: justify;
          justify-content: space-between;
  margin: -10px;
}
.eventSpeaker__sectionsItem {
  font-size: 16px;
  font-weight: 500;
  -webkit-box-flex: 1;
      -ms-flex: 1 0 45%;
          flex: 1 0 45%;
  margin: 10px;
}
@media (max-width: 991px) {
	.mobile .eventSpeaker .eventSpeaker__faceContainer {
		max-width: 300px;

	}
	.mobile .eventSpeaker .cardProfile__item {
		margin: 0;

	}
	.mobile .eventSpeaker .eventSpeaker__content {
		margin-left: 35px;

	}

}
@media (max-width: 768px) {
	.mobile .eventSpeaker .eventSpeaker__faceContainer {
		width: 45%;

	}
	.mobile .eventSpeaker .eventSpeaker__sections {
		margin-top: 16px;

	}
	.mobile .eventSpeaker .eventSpeaker__contentBody {
		padding-bottom: 20px;

	}
	.mobile .eventSpeaker .eventSpeaker__sectionsTitle {
		font-size: 16px;
		margin-bottom: 7px;

	}
	.mobile .eventSpeaker .eventSpeaker__name {
		font-size: 22px;

	}
	.mobile .eventSpeaker .eventSpeaker__post {
		font-size: 16px;
		margin-bottom: 18px;

	}
	.mobile .eventSpeaker .eventSpeaker__timePeriod {
		font-size: 14px;
		margin-bottom: 14px;

	}
	.mobile .eventSpeaker .eventSpeaker__presentationName {
		font-size: 14px;

	}

}
@media (max-width: 478px) {
	.mobile .eventSpeaker {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		margin-bottom: 60px;

	}
	.mobile .eventSpeaker .eventSpeaker__faceContainer {
		width: 100%;
		max-width: 100%;
		margin: 0;
		margin-bottom: 15px;

	}
	.mobile .eventSpeaker .eventSpeaker__sections {
		margin-top: 26px;

	}
	.mobile .eventSpeaker .eventSpeaker__contentBody {
		padding-bottom: 26px;

	}
	.mobile .eventSpeaker .eventSpeaker__sectionsTitle {
		font-size: 18px;
		margin-bottom: 20px;

	}
	.mobile .eventSpeaker .eventSpeaker__name {
		font-size: 30px;

	}
	.mobile .eventSpeaker .eventSpeaker__post {
		font-size: 18px;
		margin-bottom: 25px;

	}
	.mobile .eventSpeaker .eventSpeaker__timePeriod {
		font-size: 18px;
		margin-bottom: 20px;

	}
	.mobile .eventSpeaker .eventSpeaker__presentationName {
		font-size: 16px;

	}
	.mobile .eventSpeaker .eventSpeaker__content {
		width: 100%;
		margin: 0;

	}

}
.eventHero {
  max-width: 1230px;
  margin: 40px auto;
  background-color: #fff;
  font-weight: 500;
  -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
          box-shadow: 0 0 20px rgba(0, 0, 0, .25)
}
.eventHero + .contentHeader {
	margin-top: 0;

}
.eventHero.eventHero--upToTop {
  margin-bottom: 0;
  margin-top: -44px;
}
.eventHero__eventType {
  margin-bottom: 12px;
  font-weight: 400
}
.eventHero__eventType .icon,
  .eventHero__eventType .title {
	display: inline-block;
	vertical-align: middle;

}
.eventHero__eventType .icon {
	width: 45px;
	height: 45px;
	border-radius: 50%;

	/* background-color: var(--gray-light-15); */
	position: relative;

}
.eventHero__eventType .icon svg {
	display: block;
	width: 30px;
	height: 30px;
	position: absolute;
	left: 50%;
	top: 50%;
	-webkit-transform: translate(-50%, -50%);
	        transform: translate(-50%, -50%);

}
.eventHero__eventType .title {
	font-size: 18px;
	font-weight: 900;
	padding-left: 10px;

}
.eventHero__status {
  min-width: 222px;
  padding: 10px 40px;
  background-color: #fff;
  border-radius: 20px / 50%;
  text-align: center;
  font-size: 18px;
  font-weight: 900;
  white-space: nowrap;

  position: relative
}
.eventHero__status .liveSignal {
	position: absolute;
	top: 50%;
	left: 10px;
	-webkit-transform: translateY(-50%);
	        transform: translateY(-50%);

}
.eventHero__daysLeft {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  padding: 0 15px;
  color: #fff
}
.eventHero__daysLeft .days {
	font-size: 60px;
	font-weight: 900;
	margin-right: 15px;

}
.eventHero__daysLeft .text {
	font-size: 16px;
	font-weight: 500;

}
.eventHero__body {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  padding: 45px;
}
.eventHero__imgContainer,
.eventHero__infoBlock {
  -webkit-box-flex: 1;
      -ms-flex: 1 1 50%;
          flex: 1 1 50%;
}
.eventHero__imgContainer {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  min-width: 360px;
  padding: 0 40px;
  padding-right: 62px
}
.eventHero__imgContainer img {
	max-width: 100%;

}
.eventHero__infoBlock {
  padding-top: 10px;
  color: #282828;
  text-align: left;
  font-size: 18px;
}
.eventHero__period {
  font-size: 30px;
  line-height: 1.3;
  margin-bottom: 15px;
}
.eventHero__infoBlockGroup {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
}
.eventHero__ref {
  display: inline;
  color: #009cff;
}
.eventHero__location + .eventHero__ref {
  margin-left: 10px;
  padding-left: 16px;
  position: relative
}
.eventHero__location + .eventHero__ref::before {
	content: '|';
	display: block;
	color: #d8d8d8;
	position: absolute;
	top: 0;
	left: 0;

}
.eventHero__footer {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -ms-flex-wrap: wrap;
      flex-wrap: wrap;
  min-height: 195px;
  background: url('/images/play-transparent.svg') -110px 48% / 350px,
    linear-gradient(45deg, #0da481 0%, #0da481 30%, #3bcf56 70%, #3bcf56 100%);
  background-repeat: no-repeat;
}
.eventHero__footerColl {
  -webkit-box-flex: 1;
      -ms-flex: 1;
          flex: 1;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
      -ms-flex-pack: center;
          justify-content: center;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  padding: 30px;

  position: relative
}
.eventHero__footerColl::before {
	content: '';
	display: block;
	width: 1px;
	background-color: rgba(246, 246, 246, .2);
	position: absolute;
	right: 0;
	top: 35px;
	bottom: 35px;

}
.eventHero__footerColl:last-child::before {
	display: none;

}
.eventHero__caution {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  min-width: 240px;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-box-pack: center;
      -ms-flex-pack: center;
          justify-content: center;
  background: url(/images/static/event/overlay-2.jpg) center / cover no-repeat;
  background-color: #008bd4
}
.eventHero__caution .eventHero__cautionWrap {
	position: relative;

}
.eventHero__caution .playBtn {
	margin: 0 auto 20px;

}
.eventHero__caution .eventHero__cautionText {
	color: #fff;
	font-size: 16px;
	text-align: center;
	-webkit-transition: font-size 0.3s ease;
	transition: font-size 0.3s ease;
	position: absolute;
	left: 50%;
	top: 90%;
	white-space: nowrap;
	-webkit-transform: translateX(-50%);
	        transform: translateX(-50%);

}
.eventHero__caution:hover .playBtn {
	-webkit-transform: scale(1.1);
	        transform: scale(1.1);

}
.eventHero__caution:hover .eventHero__cautionText {
	font-size: 17px;

}
.eventHero__caution::before {
	display: none;

}
.eventHero__socialShare {
  padding-bottom: 20px;
}
.eventHero__addToCalendar {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  font-size: 16px;
  font-weight: 600;
  color: #009cff;
  padding: 13px 50px 13px 30px;
  background-color: #fff;
  border-radius: 24px;
  text-align: center;
  cursor: pointer;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
  white-space: nowrap;
  position: relative;
  -webkit-transition: background-color 0.3s ease, color 0.3s ease;
  transition: background-color 0.3s ease, color 0.3s ease
}
.eventHero__addToCalendar span {
	display: block;
	color: #aaaaaa;
	width: 27px;
	height: 27px;
	border: 1px solid #dcdcdc;
	border-radius: 50%;
	position: absolute;
	top: 50%;
	right: 9px;
	background-color: #fff;
	-webkit-transform: translateY(-50%);
	        transform: translateY(-50%);
	-webkit-transition: border-color 0.3s ease, -webkit-box-shadow 0.3s ease;
	transition: border-color 0.3s ease, -webkit-box-shadow 0.3s ease;
	transition: border-color 0.3s ease, box-shadow 0.3s ease;
	transition: border-color 0.3s ease, box-shadow 0.3s ease, -webkit-box-shadow 0.3s ease;

}
.eventHero__addToCalendar span:before,
    .eventHero__addToCalendar span:after {
	content: '';
	display: block;
	overflow: hidden;
	position: absolute;
	top: 0;
	left: 0;
	background: #009cff;

}
.eventHero__addToCalendar span:before {
	margin: 12px 7px;
	width: 11px;
	height: 1px;

}
.eventHero__addToCalendar span:after {
	margin: 7px 12px;
	width: 1px;
	height: 11px;

}
.eventHero__addToCalendar:hover {
	color: #fff;
	background-color: #009cff;

}
.eventHero__addToCalendar:hover span {
	border-color: #fff;
	-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .25);
	        box-shadow: 0 0 5px rgba(0, 0, 0, .25);

}
.mobile .eventHero {
	max-width: none;
	width: auto;
	margin-left: 15px;
	margin-right: 15px;

}
.mobile .eventHero__caution {
	background: none;

}
.mobile .eventHero__footerColl {
	-ms-flex-preferred-size: 45%;
	    flex-basis: 45%;
	-webkit-box-ordinal-group: 2;
	    -ms-flex-order: 1;
	        order: 1;
	padding: 30px;

}
.mobile .eventHero__footerColl::before {
	display: none;

}
.mobile .eventHero__footerColl.eventHero__addToCalendarWrap {
	-webkit-box-ordinal-group: 3;
	    -ms-flex-order: 2;
	        order: 2;

}
@media (max-width: 991px) {
	.mobile .eventHero__body {
		padding: 35px;

	}
	.mobile .eventHero__imgContainer {
		padding-left: 0;

	}
	.mobile .eventHero__period {
		font-size: 24px;
		margin-bottom: 24px;

	}
	.mobile .eventHero__infoBlockGroup {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		font-size: 16px;

	}
	.mobile .eventHero__location + .eventHero__ref {
		margin-left: 0;
		padding-left: 0;

	}
	.mobile .eventHero__location + .eventHero__ref::before {
		display: none;

	}
	.mobile .eventHero__ref {
		margin-top: 10px;

	}
	.mobile .eventHero__footer {
		padding: 10px;

	}

}
.mobile {

	/* @media (--to-tablet-md) {
  } */

}
@media (max-width: 720px) {
	.mobile .eventHero__body {
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;
		padding: 25px 15px;

	}
	.mobile .eventHero__imgContainer {
		min-width: auto;
		padding-right: 15px;

	}
	.mobile .eventHero__infoBlock {
		min-width: 240px;

	}

}
@media (max-width: 478px) {
	.mobile .eventHero__body {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .eventHero__imgContainer,
    .mobile .eventHero__infoBlock {
		-ms-flex-preferred-size: auto;
		    flex-basis: auto;
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;
		text-align: center;
		padding: 0;
		width: 100%;

	}
	.mobile .eventHero__imgContainer {
		min-width: auto;
		margin-bottom: 28px;

	}
	.mobile .eventHero.eventHero--upToTop {
		margin-top: -20px;

	}
	.mobile .eventHero__body {
		padding: 20px;

	}
	.mobile .eventHero__period {
		font-size: 20px;
		margin-bottom: 10px;

	}
	.mobile .eventHero__imgContainer {
		min-width: auto;
		margin-bottom: 22px;

	}
	.mobile .eventHero__eventType {
		display: -webkit-box;
		display: -ms-flexbox;
		display: flex;
		-webkit-box-align: center;
		    -ms-flex-align: center;
		        align-items: center;
		-webkit-box-pack: center;
		    -ms-flex-pack: center;
		        justify-content: center;
		margin-bottom: 22px;

	}
	.mobile .eventHero__eventType .title {
		text-align: left;
		padding: 0;
		margin-left: 6px;

	}
	.mobile .eventHero__eventType .icon {
		-webkit-box-flex: 0;
		    -ms-flex: none;
		        flex: none;

	}
	.mobile .eventHero__status {
		padding-left: 18px;
		padding-right: 18px;

	}
	.mobile .eventHero__footer {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		-webkit-box-align: center;
		    -ms-flex-align: center;
		        align-items: center;
		padding: 0;

	}
	.mobile .eventHero__footerColl {
		padding: 20px;
		min-height: 128px;
		width: 100%;
		-ms-flex-preferred-size: auto;
		    flex-basis: auto;

	}
	.mobile .eventHero__footerColl::before {
		display: block;
		width: 100%;
		height: 1px;
		top: 0;
		left: 0;
		bottom: auto;

	}
	.mobile .eventHero__footerColl:first-child::before {
		display: none;

	}
	.mobile .eventHero__footerColl.eventHero__addToCalendarWrap {
		-webkit-box-ordinal-group: 2;
		    -ms-flex-order: 1;
		        order: 1;

	}
	.mobile .eventHero__ref {
		margin-top: 2px;

	}
	.mobile .socialShare__title {
		text-align: center;

	}

}
.speechPreviewList {
  margin-bottom: 110px;
}
.speechPreview {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-box-pack: justify;
      -ms-flex-pack: justify;
          justify-content: space-between;
  margin-bottom: 90px
}
.speechPreview:last-child {
	margin-bottom: 0;

}
.speechPreview__info {
  width: 42%;
  padding: 115px 50px 30px 0px;
}
.speechPreview__place {
  font-weight: 900;
  font-size: 30px;
  margin-bottom: 70px;
}
.speechPreview__liveSignal {
  margin-right: 18px;
  -webkit-box-flex: 0;
      -ms-flex: none;
          flex: none;
}
.speechPreview__infoBody {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
}
.speechPreview__timePeriod {
  font-weight: 900;
  font-size: 18px;
  margin-bottom: 15px;
}
.speechPreview__author {
  font-size: 18px;
  margin-bottom: 15px;
}
.speechPreview__authorName {
  font-weight: 900;
  margin-bottom: 10px;
}
.speechPreview__authorPost {
  font-weight: 400;
}
.speechPreview__link {
  font-size: 16px;
  font-weight: 500;
  color: #009cff;
}
.speechPreview__video {
  width: 58%;
  position: relative;
}
@media (min-width: 992px) {
	.mobile .speechPreview {
		-webkit-box-align: start;
		    -ms-flex-align: start;
		        align-items: flex-start;
		margin-bottom: 50;

	}
	.mobile .speechPreview__info {
		padding: 0;
		padding-right: 15px;

	}
	.mobile .speechPreview__place {
		margin-bottom: 50px;

	}

}
@media (max-width: 991px) {
	.mobile .speechPreview {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		margin-bottom: 50px;

	}
	.mobile .speechPreview__info,
    .mobile .speechPreview__video {
		width: 100%;

	}
	.mobile .speechPreview__info {
		padding: 0;
		padding-bottom: 30px;

	}
	.mobile .speechPreview__place {
		margin-bottom: 30px;

	}

}
.eventPartners {
  overflow: hidden;
}
.eventPartners__list {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -ms-flex-wrap: wrap;
      flex-wrap: wrap;
  -webkit-box-pack: start;
      -ms-flex-pack: start;
          justify-content: flex-start;
  margin: -1px;
  margin-right: -4px;
}
.eventPartners__partner {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
      -ms-flex-pack: center;
          justify-content: center;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  min-height: 285px;
  min-width: auto;
  -ms-flex-preferred-size: 25%;
      flex-basis: 25%;
  -webkit-box-flex: 0;
      -ms-flex-positive: 0;
          flex-grow: 0;
  -ms-flex-negative: 0;
      flex-shrink: 0;
  border-style: solid;
  border-color: rgb(240, 240, 240);
  border-width: 1;

  margin-bottom: -1px;
  margin-right: -1px
}
.eventPartners__partner:last-child {
	border-right-width: 0;

}
a.eventPartners__partner img, .eventPartners__partner.eventPartners__partner--withHoverEffect img {
	-webkit-transition: -webkit-transform .3s ease;
	transition: -webkit-transform .3s ease;
	transition: transform .3s ease;
	transition: transform .3s ease, -webkit-transform .3s ease;

}
a.eventPartners__partner:hover img, .eventPartners__partner.eventPartners__partner--withHoverEffect:hover img {
	-webkit-transform: scale(1.2);
	        transform: scale(1.2);

}
.mobile .eventPartners__list {
	margin: 0 -1px 1px 0;

}
.mobile .eventPartners__partner {
	border-right-width: 1px;

}
@media (max-width: 991px) {
	.mobile .eventPartners__partner {
		-ms-flex-preferred-size: 33.33%;
		    flex-basis: 33.33%;

	}

}
@media (max-width: 720px) {
	.mobile .eventPartners__partner {
		-ms-flex-preferred-size: 50%;
		    flex-basis: 50%;

	}

}
@media (max-width: 478px) {
	.mobile .eventPartners__list {
		margin: 0;
		margin-bottom: 1px;

	}
	.mobile .eventPartners__partner {
		-ms-flex-preferred-size: 100%;
		    flex-basis: 100%;
		min-height: 250px;
		padding: 20px 0;

	}

}
.eventProgram {
  padding: 0 30px;
}
.eventProgram__days,
.eventProgram__daySteps {
  list-style-type: none;
  padding: 0;
  margin: 0;
}
.eventProgram__day {
  color: #221F1F;
  margin-bottom: 56px
}
.eventProgram__day:last-child {
	margin-bottom: 0;

}
.eventProgram__dayDate {
  font-size: 24px;
  font-weight: 900;
  margin-bottom: 52px;
}
.eventProgramStep {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  padding-left: 32px;
  padding-bottom: 66px;
  position: relative
}
.eventProgramStep:last-child {
	padding-bottom: 0;

}
.eventProgramStep::before,
  .eventProgramStep::after {
	content: '';
	display: block;
	position: absolute;

}
.eventProgramStep::before {
	width: 9px;
	height: 9px;
	border: 2px solid #33b178;
	border-radius: 50%;
	background-color: #fff;
	top: 8px;
	left: 0;
	z-index: 2;

}
.eventProgramStep::after {
	width: 1px;
	border-right: 1px dashed #33b178;
	top: 0;
	bottom: 2px;
	left: 4px;
	z-index: 1;

}
.eventProgramStep:first-child::after {
	top: 8px;

}
.eventProgramStep__left {
  width: 22%;
  padding-right: 50px;
}
.eventProgramStep__right {
  width: 78%;
}
.eventProgramStep__timePeriod,
.eventProgramStep__place {
  display: block;
  color: #666666;
  font-weight: 900;
  font-size: 18px;
}
.eventProgramStep__title,
.eventProgramStep__description {
  font-weight: 500;
}
.eventProgramStep__title {
  font-size: 20px;
  line-height: 1.5;
}
.eventProgramStep__description {
  font-size: 16px;
  margin-top: 30px;
  line-height: 1.5;
}
@media (max-width: 991px) {
	.mobile .eventProgram__dayDate {
		text-align: center;

	}
	.mobile .eventProgramStep {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .eventProgramStep__left,
    .mobile .eventProgramStep__right {
		width: 100%;

	}
	.mobile .eventProgramStep__left {
		margin-bottom: 22px;

	}

}
@media (max-width: 478px) {
	.mobile .eventProgram {
		padding: 0;

	}
	.mobile .eventProgram__dayDate {
		margin-bottom: 40px;

	}

}
.videoSource {
  width: 100%;
  position: relative;
  background-color: #000
}
.videoSource video {
	width: 100%;
	max-height: 100%;

}
.videoSource video.controlsHidden::-webkit-media-controls {
	display: none;

}
.videoSource__playBtn {
  width: 100%;
  height: 100%;
  background-size: 58px;
  background-position: center 48%;
  opacity: .95;

  position: absolute;
  top: 0;
  left: 0;
  z-index: 10
}
.videoSource__playBtn:hover {
	opacity: 1;

}
.videoSource__playBtn.videoSource__playBtn--hidden {
	display: none;

}
.videoIframe {
  width: 100%
}
.videoIframe .videoIframe__inner {
	position: relative;
	padding-bottom: 56.25%;
	height: 0;
	overflow: hidden;

}
.videoIframe iframe {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;

}
.videoPlug {
  width: 100%
}
.videoPlug .videoPlug__inner {
	height: 0;
	padding-bottom: 56.25%;
	overflow: hidden;
	background-image: url(../images/overlay.jpg);
	background-color: #33b178;
	background-position: center;
	background-size: cover;
	background-repeat: no-repeat;
	position: relative;

}
.videoPlug .videoPlug__body {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;

}
.videoPlug__timer {
  color: #fff;
  text-align: center;
  font-weight: 500;

  position: absolute;
  bottom: 5%;
  left: 50%;
  z-index: 80;

  -webkit-transform: translateX(-50%);

          transform: translateX(-50%)
}
.videoPlug__timer .title,
  .videoPlug__timer .time {
	display: block;

}
.videoPlug__timer .title {
	font-size: 16px;
	margin-bottom: 10px;

}
.videoPlug__timer .time {
	font-size: 48px;

}
.videoPlug__playLink {
  position: absolute;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
          transform: translate(-50%, -50%);
}
@media (max-width: 991px) {
	.mobile .videoPlug__timer .title {
		margin-bottom: 0;

	}

}
@media (max-width: 478px) {
	.mobile .videoPlug__timer {
		bottom: auto;
		top: 50%;
		-webkit-transform: translate(-50%, -50%);
		        transform: translate(-50%, -50%);

	}
	.mobile .videoPlug__timer .title {
		margin-bottom: 15px;

	}
	.mobile .videoPlug__playLink {
		display: none;

	}

}
.blogPageTitle {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-orient: vertical;
	-webkit-box-direction: normal;
	    -ms-flex-direction: column;
	        flex-direction: column;
	-webkit-box-pack: end;
	    -ms-flex-pack: end;
	        justify-content: flex-end;
	min-height: 350px;
	padding: 147px 0 44px;
	color: #fff;
	text-align-last: left;
	background-color: gray;
	background-position: center;
	background-repeat: no-repeat;
	background-size: cover;
	background-color: #009cff;
}
.blogPageTitle__inner {
	width: 100%;
	max-width: 1260px;
	padding: 0 15px;
}
.blogPageTitle__title {
	font-size: 48px;
	font-weight: 600;
	line-height: 1.2;
	margin-bottom: 22px;
}
.blogPageTitle__info {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	font-size: 14px;
}
.blogPageTitle__articleAuthor,
.blogPageTitle__articleDate {
	display: -webkit-inline-box;
	display: -ms-inline-flexbox;
	display: inline-flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center
}
.blogPageTitle__articleAuthor svg, .blogPageTitle__articleDate svg {
	margin-right: 12px;

}
.blogPageTitle__articleAuthor svg path, .blogPageTitle__articleDate svg path {
	fill: #fff;

}
.blogPageTitle__articleAuthor {
	margin-right: 30px;
	font-weight: 500
}
.blogPageTitle__articleAuthor svg {
	height: 16px;
	width: 14px;
	fill: none;
	stroke: currentColor;
	stroke-miterlimit: 10;
	stroke-width: 1.1px;

}
.blogPageTitle__articleDate {
	font-weight: 400
}
.blogPageTitle__articleDate svg {
	max-height: 20px;
	max-width: 20px;
	fill: currentColor;

}
@media (max-width: 991px) {
	.mobile .blogPageTitle {
		min-height: 198px;
		padding-top: 20px;
		padding-bottom: 50px;

	}
	.mobile .blogPageTitle__title {
		font-size: 26px;

	}
	.mobile .blogPageTitle__info {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;
		-webkit-box-align: start;
		    -ms-flex-align: start;
		        align-items: flex-start;

	}
	.mobile .blogPageTitle__articleAuthor {
		margin-right: 0;
		margin-bottom: 10px;

	}
	.mobile .blogPageTitle__articleAuthor svg {
		margin-left: 3px;
		margin-right: 15px;

	}

}
@media (max-width: 478px) {
	.mobile .blogPageTitle {
		min-height: 80px;

	}
	.mobile .blogPageTitle__title {
		margin-bottom: 0;

	}

}
footer.footerEng {
	padding-top: 60px;
	padding-bottom: 80px;
	/* & .masterGroup {
		font-size: 16px;
		font-weight: 500;
		line-height: 1.5;
		opacity: 0.9;
	} */
}
.footerEng__title {
	margin-bottom: 7px;
	font-size: 18px;
	font-weight: 900;
}
@media (min-width: 992px) {
	.mobile {}

}
@media (max-width: 991px) {
	.mobile footer.footerEng .contactGroup {
		-webkit-box-pack: start;
		    -ms-flex-pack: start;
		        justify-content: flex-start;

	}
	.mobile footer.overall.footerEng .masterGroup .contactGroup > div:not(first-child) {
		margin-top: 0;
		margin-bottom: 0;

	}

}
@media (max-width: 478px) {
	.mobile {}

}
/* mobile */
.mobile .siteHeader__ifFixedHeader {
	height: 81px;

}
.mobile .mainPage__headerMobile .siteHeader__ifFixedHeader {
	height: 120px;

}
.mobile .mainPage__headerMobile .headerMobile {
	height: 120px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;

}
.headerMobile {
	width: 100%;
	/* height: 81px; */
	height: 55px;
	background-color: #fff;
	position: fixed;
  -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);
          box-shadow: 0 0 20px rgba(0, 0, 0, .2)
}
.headerMobile .siteHeader {
	padding: 0;

}
.headerMobile .siteHeaderMobile__brand {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;
	padding: 17px;
	overflow: hidden;

}

.headerMobile .siteHeaderMobile__brand img {
	display: block;
	width: 60vw;
	/* max-width: 197px; */
	/* max-height: 47px; */
}

@media (min-width: 800px) {
	.headerMobile .siteHeaderMobile__brand img {
		width: 447px;
	}
}

.headerMobile .link-style {
	background: none;

}
.headerMobile .siteHeader__rightBar {
	max-width: 100%;

}
.headerMobile .siteHeader__rightBar > div:not(.siteHeader__navToggle) {
	margin-left: 15px;
	margin-right: 15px;

}
.headerMobile .social-navigation {
	min-width: 120px;
	margin-left: 15px;
	margin-right: 15px;

}
.headerMobile .social-navigation svg {
	fill: #009cff;

}
.headerMobile .link-style {
	color: #9b9b9b;
	text-shadow: none;

}
.headerMobile .link-style:hover {
	color: #9b9b9b;

}
.headerMobile .searchIconLink svg {
	width: 20px;
	height: 20px;

}
.headerMobile .searchIconLink svg path {
	fill: #9b9b9b;

}
.headerMobile .siteHeader__navToggle {
	width: 55px;
	padding-right: 15px;

}
.headerMobile .siteNav__menuLarge {
	padding-top: 0;
	width: 100%;

	/* opacity: 1;
		visibility: visible;
		transform: translateY(0); */

}
.headerMobile .siteNav__menuLarge .social-navigation {
	min-width: 120px;
	margin-left: 0;
	margin-right: 0;

}
.headerMobile .siteNav__menuLarge .social-navigation svg {
	fill: rgba(255, 255, 255, 1);

}
.headerMobile .siteNav__menuLarge .siteHeader__blog {
	margin-left: 15px;
	font-size: 16px;

}
.headerMobile .siteNav__menuLarge .siteHeader__lang {
	margin-left: 15px;
	font-size: 16px;

}
.headerMobile .siteNav__menuLarge .link-style {
	color: #fff;
	text-shadow: none;

}
.headerMobile .siteNav__menuLarge .searchIconLink {
	margin-left: 20px;

}
.headerMobile .siteNav__menuLarge .searchIconLink svg {
	width: 15px;
	height: 15px;

}
.headerMobile .siteNav__menuLarge .searchIconLink svg path {
	fill: #fff;

}
.headerMobile .menu__group {
	padding-left: 15px;
	padding-right: 15px;

}
.headerMobile .menuTop {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	height: 80px;
	overflow: hidden;

	/* & .searchIconLink {
			display: none;
		} */

}
.headerMobile .siteNav__menuLarge-close {
	position: absolute;
	top: 26px;
	right: 15px;

}
.headerMobile .menuButton {
	padding-right: 0;

}
.headerMobile .navigationGroup > ul {
	padding-bottom: 100px;

}
.headerMobile .navigationGroup > ul > li {
	width: auto;
	margin: 0 15px 0 0;

}
.headerMobile .navigationGroup > ul > li > span a {
	font-size: 16px;

}
.headerMobile .navigationGroup > ul > li > span em {
	display: none;

}
.headerMobile .navigationGroup > ul > li .childNav {
	height: 0;
	overflow: hidden;
	-webkit-transition: 0.3s height ease;
	transition: 0.3s height ease;

}
.headerMobile .navigationGroup > ul > li .childNav > ul {
	margin: 0;
	padding: 6px 8px;
	overflow: hidden;

	/* display: flex; */

	/* flex-wrap: wrap; */

	/* justify-content: space-between; */

}
.headerMobile .navigationGroup > ul > li .childNav > ul > li {

	/* width: 45%; */
	padding: 7px 0;
	line-height: 1;

}
.headerMobile .navigationGroup > ul > li .childNav > ul > li a {
	font-size: 14px;
	line-height: 1;
	font-weight: 500;

}
.headerMobile .navigationGroup > ul > li.\--hasChildren {
	position: relative;

}
.headerMobile .navigationGroup > ul > li.\--hasChildren span {
	padding-right: 30px;

}
.headerMobile .navigationGroup > ul > li.\--hasChildren em {
	display: block;
	width: 25px;
	height: 25px;
	border: 1px solid #fff;
	border-radius: 50%;
	position: absolute;
	top: 12px;
	right: 0;
	background-color: transparent;
	cursor: pointer;
	-webkit-transition: 0.2s all ease;
	transition: 0.2s all ease;

}
.headerMobile .navigationGroup > ul > li.\--hasChildren em:after {
	content: '';
	display: block;
	width: 8px;
	height: 8px;
	border: 2px solid #fff;
	border-top: 0;
	border-left: 0;
	position: absolute;
	top: 7px;
	left: 8px;
	-webkit-transform: rotate(45deg);
	        transform: rotate(45deg);
	-webkit-transition: 0.2s all ease;
	transition: 0.2s all ease;

}
.headerMobile .navigationGroup > ul > li.\--open .childNav {
	height: auto;

}
.headerMobile .navigationGroup > ul > li.\--open em {
	background-color: #fff;
	-webkit-box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);
	        box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);

}
.headerMobile .navigationGroup > ul > li.\--open em:after {
	border-color: #009cff;
	top: 9px;
	-webkit-transform: rotate(-135deg);
	        transform: rotate(-135deg);

}
.headerMobile {

	/* стили для фиксированной шапки */

	/* &.container__siteHeader--fixed {
		height: 115px;
		background: #fff;
		& .siteHeader {
			height: 100%;
		}
		& .siteHeaderMobile__brand {
			width: auto;
			height: auto;
			background: none;
			box-shadow: none;
		}
		& .siteHeader__rightBar {
			& > div > a {
				color: var(--gray-ligh-2);
			}
		}
		& .siteHeader__navToggle {
			& .siteHeader__navToggle-icon {
				& span, &:before, &:after {
					background-color: var(--blue);
				}
			}
		}
	} */

}
.mainPage__headerMobile .headerMobile {
	padding: 15px;
	background: #009cff url(../images/header-mobile.jpg) no-repeat;
	background-size: cover;

}
.mainPage__headerMobile .siteHeader {
	padding: 0;
	background: #fff;
	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);
	        box-shadow: 0 0 20px rgba(0, 0, 0, .2);

}
@media (max-width: 991px) {
	.mobile {

		/* & .social-navigation,
		& .link-style,
		& .searchIconLink {
			display: flex;
		} */

		/* & .menuTop {
			& > div:not(.siteNav__menuLarge-close),
			& .social-navigation {
				display: none;
			}
		} */

	}

}
@media (max-width: 660px) {
	.mobile .siteHeader__rightBar > div:not(.siteHeader__navToggle),
			.mobile .siteHeader__rightBar .social-navigation {
		display: none;

	}
	.mobile .menuTop > div:not(.siteNav__menuLarge-close),
			.mobile .menuTop .social-navigation {
		display: inherit;

	}
	.mobile .menuTop .searchIconLink {
		display: -webkit-box;
		display: -ms-flexbox;
		display: flex;

	}

}
.mapMobile {
	padding: 64px 0;
	color: #fff;
	background: url('/images/static/map.png') no-repeat 50% 15% / 90% auto,
	-webkit-gradient(linear, left bottom, left top, from(rgb(11, 163, 128)), to(rgb(36, 95, 205)));
	background: url('/images/static/map.png') no-repeat 50% 15% / 90% auto,
	linear-gradient(to top, rgb(11, 163, 128) 0%, rgb(36, 95, 205) 100%);
}
.mapMobile__inner {
	margin: 0 auto;
	max-width: 700px;
	padding: 0 15px;
}
.mapMobile__title {
	font-weight: 500;
	font-size: 36px;
	margin-bottom: 60px;
}
.mapMobile__list {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-ms-flex-wrap: wrap;
	    flex-wrap: wrap;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	margin: 0 -15px;
}
.mapMobile__listItem {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	width: 100%;
	max-width: 260px;
	margin: 15px;
	font-weight: 500
}
.mapMobile__listItem .counter {
	font-size: 74px;
	margin-right: 16px;

}
.mapMobile__listItem .text {
	font-size: 16px;

}
.mapMobile__btnMoreWrap .buttonMore {
	margin: 0;
	margin-top: 45px;

}
@media (max-width: 478px) {
	.mapMobile__title {
		font-size: 30px;
		margin-bottom: 22px;
	}

	.mapMobile__inner {
		padding: 0 25px;
	}

	.mapMobile__list {
		margin: 0 -25px;
	}

	.mapMobile__listItem {
		max-width: 100%;
		margin-left: 25px;
		margin-right: 25px;
		padding-left: 5px;
		padding-right: 5px
	}

	.mapMobile__listItem .counter {
		font-size: 48px;
		min-width: 55px;

	}
}
.newsHead {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	margin-top: 60px;
	margin-bottom: 30px;
}
.newsHead-selectDate {
	z-index: 80;
}
.newsHead-filter {
	z-index: 70;
	margin-left: 50px;
}
/* ------------------------------------------------------------------------- */
@media (max-width: 991px) {
	.mobile .newsHead {
		-webkit-box-orient: vertical;
		-webkit-box-direction: normal;
		    -ms-flex-direction: column;
		        flex-direction: column;

	}
	.mobile .newsHead-filter {
		margin-left: 0;
		margin-top: 30px;

	}

}
@media (max-width: 478px) {
	.mobile .newsHead {
		margin-top: 26px;
		margin-bottom: 16px;

	}
	.mobile .newsHead-filter {
		margin-top: 20px;

	}

}
/* ------------------------------------------------------------------------- */
.form__agree {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	padding-right: 10%;
	cursor: pointer;
	font-weight: 500;
	position: relative
}
.form__agree .link-style {
	background-size: 100% 1px;

}
.form__agree-input {
	display: none;
}
.form__agree-pseudoCheckbox {
	display: block;
	width: 24px;
	height: 24px;
	min-width: 24px;
	min-height: 24px;
	background: #fff;
	margin: 5px 10px 5px 0;
	position: relative
}
.form__agree-pseudoCheckbox svg {
	width:70%;
	height:70%;
	position: absolute;
	top:0;
	left: 0;
	bottom: 0;
	right: 0;
	margin: auto;
	stroke: #009cff;
	stroke-dashoffset: 550.7816772460938;
	stroke-dasharray: 550.7816772460938;
	-webkit-transition: stroke-dashoffset .2s ease;
	transition: stroke-dashoffset .2s ease;

}
.form__agree-input:checked ~ .form__agree-pseudoCheckbox svg {
	stroke-dashoffset: 0;

}
.checkbox__error {
	display: none;
  font-size: 13px;
  text-align: left;
  color: #f72e2e;
	position: absolute;
	left: 0;
	bottom: 0;
	-webkit-transform: translateY(100%);
	        transform: translateY(100%);
}
.hasError .checkbox__error {
	display: block;

	/* animation: secondFade 1s; */

}
.justifiedGallery {
	margin: 80px 0;
}
.tagsFilterSelect {
  /* some style */
}
.tagsFilterSelect__item {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  padding: 5px 20px;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  position: relative;
  font-size: 14px;
  font-weight: 500;
  overflow: hidden;
  cursor: default;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none
}
.tagsFilterSelect__item:hover {
	background: #f0f0f0;

}
.tagsFilterSelect__item .hash {
	color: #0da481;
	-webkit-transition: color .3s;
	transition: color .3s;

}
.tagsFilterSelect__item .name {
	margin-left: 5px;
	margin-right: 10px;
	color: #1f1f1f;
	-webkit-transition: color .3s;
	transition: color .3s;

}
.tagsFilterSelect__item .count {
	opacity: 1;
	color: #c5c5c5;
	-webkit-transition: color .3s;
	transition: color .3s;
	margin-left: auto;

}
.tagsFilterSelect__item .close {
	display: none;
	position: absolute;
	top: 50%;
	right: 20px;
	-webkit-transform: translateY(-50%);
	        transform: translateY(-50%);

}
.tagsFilterSelect__item .close .bars {
	position: relative;
	width: 15px;
	height: 15px;

}
.tagsFilterSelect__item .close .bars:before,
    .tagsFilterSelect__item .close .bars:after {
	content: '';
	position: absolute;
	top: 50%;
	left: 50%;
	display: block;
	width: 100%;
	height: 1px;
	background-color: #fff;

}
.tagsFilterSelect__item .close .bars:before {
	-webkit-transform: translate(-50%,-50%) rotate(45deg);
	        transform: translate(-50%,-50%) rotate(45deg);

}
.tagsFilterSelect__item .close .bars:after {
	-webkit-transform: translate(-50%,-50%) rotate(-45deg);
	        transform: translate(-50%,-50%) rotate(-45deg);

}
.tagsFilterSelect .switchSelect__item {
	padding: 1px 0;

}
.tagsFilterSelect .switchSelect__item:hover {
	background: transparent;

}
.tagsFilterSelect .switchSelect__item {

	/* Стиль элемента при состоянии "выбрано"
    *  switchSelect__item - контейнер для элемента
    *  который описан компоненте switchSelect
    * */

}
.tagsFilterSelect .switchSelect__item.switchSelect__item--isSelected {
	background: transparent;

}
.tagsFilterSelect .switchSelect__item.switchSelect__item--isSelected .tagsFilterSelect__item {
	background: linear-gradient(45deg, #0da481 0%, #0da481 30%, #3bcf56 70%, #3bcf56 100%);

}
.tagsFilterSelect .switchSelect__item.switchSelect__item--isSelected .tagsFilterSelect__item .hash,
        .tagsFilterSelect .switchSelect__item.switchSelect__item--isSelected .tagsFilterSelect__item .name {
	color: #fff;

}
.tagsFilterSelect .switchSelect__item.switchSelect__item--isSelected .tagsFilterSelect__item .count {
	opacity: 0;

}
.tagsFilterSelect .switchSelect__item.switchSelect__item--isSelected .tagsFilterSelect__item .close {
	display: block;

}
.switchSelect {
  position: relative
}
.switchSelect.switchSelect--isOpened .switchSelect__trigger .circle svg {
	-webkit-transform: rotate(0deg);
	        transform: rotate(0deg);

}
.switchSelect__trigger {
  min-height: 38px;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: justify;
      -ms-flex-pack: justify;
          justify-content: space-between;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  width: 100%;
  padding: 10px 60px 10px 20px;
  background: #fafafa;
  border-radius: 20px / 50%;
  border: none;
  color: #666666;
  font-size: 16px;
  font-weight: 500;
  text-align: left;
  -webkit-box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);
          box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);

  outline: none;
  position: relative;
  z-index: 10
}
.switchSelect__trigger .placeholder {
	opacity: .75;

}
.switchSelect__trigger .circle {
	width: 28px;
	height: 28px;
	-webkit-box-flex: 0;
	    -ms-flex: none;
	        flex: none;
	border-radius: 50%;
	background: #fff;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;
	-webkit-box-shadow: 0 0 6px 0 rgba(0, 0, 0, .16);
	        box-shadow: 0 0 6px 0 rgba(0, 0, 0, .16);
	position: absolute;
	top: 50%;
	right: 6px;
	-webkit-transform: translateY(-50%);
	        transform: translateY(-50%);
	-webkit-transition: -webkit-transform .3s ease;
	transition: -webkit-transform .3s ease;
	transition: transform .3s ease;
	transition: transform .3s ease, -webkit-transform .3s ease;

}
.switchSelect__trigger .circle svg {
	fill: #33b178;
	stroke: #33b178;
	stroke-width: 1px;
	-webkit-transition: all .2s ease;
	transition: all .2s ease;
	-webkit-transform: rotate(180deg);
	        transform: rotate(180deg);

}
.switchSelect__trigger .content {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;

}
.switchSelect__trigger .content * {
	padding: 0;

}
.switchSelect__trigger .content > span {
	display: block;
	padding: 0;
	margin-left: 10px;

}
.switchSelect__trigger .content > span:first-child {
	margin-left: 0;

}
.switchSelect__dropdown {
  height: 0;
  max-height: 350px;
  width: 100%;
  padding: 0;
  margin: -20px auto 0;
  overflow: hidden;
  -webkit-transition: .3s ease;
  transition: .3s ease;
  -webkit-transition-property: height, padding;
  transition-property: height, padding;
  border-radius: 0 0 20px 20px;
  background: #fff;
  -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
          box-shadow: 0 0 20px rgba(0, 0, 0, .25);
  position: absolute;
  z-index: 5;

  /** Градиент для скроллинга
  &::after {
    content: '';
    display: block;
    height: 40px;
    width: 100%;
    background: linear-gradient(to top, rgba(255,255,255,1), transparent) no-repeat;
    position: absolute;
    bottom: 18px;
    left: 0;
  }*/
}
.switchSelect__dropdown_active{height:auto;}
.switchSelect__dropdownInner {
  max-height: 100%;
  padding-top:22px;
}
.switchSelect__item {
  position: relative;
  padding: 5px 20px;
  overflow: hidden;
  cursor: default;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
  -webkit-transition: .3s ease;
  transition: .3s ease;
  -webkit-transition-property: color, background;
  transition-property: color, background
}
.switchSelect__item:hover {
	background-color: #f0f0f0;

}
.switchSelect__item.switchSelect__item--isSelected {
	color: #fff;
	background-color: #33b178;

}
.tagsFilterMobile {
	padding: 20px 0;
}
.cardsFilterSelect .switchSelect__trigger {
	color: #fff;
	background-color: #009bfe;

}
.cardsFilterSelect .switchSelect__trigger svg {
	fill: #009bfe;
	stroke: #009bfe;

}
.cardsFilterSelect .switchSelect__trigger .sortIcon [class^="line"] {
	background: #fff;

}
.cardsFilterSelect__item {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  position: relative;
  padding: 10px 20px;
  overflow: hidden;
  cursor: pointer;
}
.cardsFilterSelect__item .sortIcon {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
      -ms-flex-direction: column;
          flex-direction: column;
  -webkit-box-pack: justify;
      -ms-flex-pack: justify;
          justify-content: space-between;
  width: 20px;
  height: 16px;
  margin-right: 15px
}
.cardsFilterSelect__item .sortIcon [class^="line"] {
	width: 100%;
	height: 1px;
	background-color: #009bfe;
	-webkit-transition: width .3s, background-color .3s;
	transition: width .3s, background-color .3s;

}
.cardsFilterSelect__item .sortIcon {

	/* Модификатор "по убыванию" для иконки сортировки
  * */

}
.cardsFilterSelect__item .sortIcon.sortIcon--desc .line-1 {
	width: 100%;

}
.cardsFilterSelect__item .sortIcon.sortIcon--desc .line-2 {
	width: 80%;

}
.cardsFilterSelect__item .sortIcon.sortIcon--desc .line-3 {
	width: 60%;

}
.cardsFilterSelect__item .sortIcon.sortIcon--desc .line-4 {
	width: 40%;

}
.cardsFilterSelect__item .sortIcon {

	/* Модификатор "по возрастанию" для иконки сортировки
  * */

}
.cardsFilterSelect__item .sortIcon.sortIcon--asc .line-1 {
	width: 40%;

}
.cardsFilterSelect__item .sortIcon.sortIcon--asc .line-2 {
	width: 60%;

}
.cardsFilterSelect__item .sortIcon.sortIcon--asc .line-3 {
	width: 80%;

}
.cardsFilterSelect__item .sortIcon.sortIcon--asc .line-4 {
	width: 100%;

}
.cardsFilterSelect .switchSelect__item {
	padding: 0;

	/* Стиль элемента при состоянии "выбрано"
    *  switchSelect__item - контейнер для элемента
    *  который описан компоненте switchSelect
    * */

}
.cardsFilterSelect .switchSelect__item.switchSelect__item--isSelected {
	background: transparent;

}
.cardsFilterSelect .switchSelect__item.switchSelect__item--isSelected .cardsFilterSelect__item {
	background-color: #009bfe;

}
.cardsFilterSelect .switchSelect__item.switchSelect__item--isSelected .cardsFilterSelect__item .sortIcon [class^="line"] {
	background-color: #fff;

}
.linksSelect {
  color: inherit
}
.linksSelect .linksSelect__link {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	padding: 5px 20px;

}
.linksSelect .linksSelect__link svg {
	max-width: 20px;
	max-height: 20px;
	margin-right: 15px;

}
.linksSelect .switchSelect__trigger .linksSelect__link {
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;

}
.linksSelect .switchSelect__item {
	padding: 0;

}
.linksSelect .switchSelect__item.switchSelect__item--isSelected .linksSelect__link svg {
	fill: #fff;

}
.linksSelectPanel {
  margin-top: -15px
}
.linksSelectPanel .linksSelect {
	z-index: 90;

}
.linksSelectPanel__inner {
  padding: 50px 60px 0;
  background: -webkit-gradient(linear, left top, right top, from(#0da481), to(#3bcf56));
  background: linear-gradient(90deg, #0da481 0%, #3bcf56 100%);
}
@media (max-width: 478px) {
	.mobile .linksSelectPanel__inner {
		padding: 25px 20px 0;
		padding-bottom:20px;
	}

}
.eventFilterSelect {

}
.eventFilterSelect__item {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  padding: 5 20px
}
.eventFilterSelect__item .icon {
	margin-right: 15px;

}
.eventFilterSelect__item .icon svg {
	max-width: 20px;
	max-height: 20px;

}
.eventFilterSelect .switchSelect__item {
	padding: 0;

}
.blogCategories {
  padding: 50px 0;
}
.blogCategories__list {
  -webkit-column-count: 4;
          column-count: 4;
  -webkit-column-width: 25%;
          column-width: 25%;
  -webkit-column-gap: 30px;
          column-gap: 30px;
}
.blogCategories__category {
  -webkit-column-break-inside: avoid;
  break-inside: avoid-column;
  margin-bottom: 26px
}
.blogCategories__category .categoryName {
	font-weight: 900;
	font-size: 48px;
	color: #009cff;
	margin-bottom: 26px;

}
.blogCategories__category .categoryList li {
	margin-bottom: 18px;

}
.blogCategories__category .categoryList li a {
	line-height: 1.4;
	font-size: 18px;
	color: #221F1F;

}
.blogCategories__category .categoryList li:last-child {
	margin-bottom: 0;

}
@media (max-width: 991px) {
	.mobile .blogCategories__list {
		-webkit-column-count: 2;
		        column-count: 2;
		-webkit-column-width: 50%;
		        column-width: 50%;

	}

}
@media (max-width: 478px) {
	.mobile .blogCategories__list {
		-webkit-column-count: 1;
		        column-count: 1;
		-webkit-column-width: 100%;
		        column-width: 100%;

	}
	.mobile .blogCategories {
		padding: 35px 0;

	}

}
.mobile .tabs--select .tabs__selectGroup {
	position: relative;

}
.mobile .tabs--select .tabs__select {
	width: 100%;
	min-height: 38px;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-pack: justify;
	    -ms-flex-pack: justify;
	        justify-content: space-between;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	width: 100%;
	padding: 10px 50px 10px 20px;
	background: #fafafa;
	border-radius: 20px / 50%;
	border: none;
	color: #666666;
	font-size: 16px;
	font-weight: 500;
	text-align: left;
	-webkit-box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);
	        box-shadow: 0 0 9px 0 rgba(0, 0, 0, .16);
	outline: none;
	position: relative;
	z-index: 10;

}
.mobile .tabs--select .tabs__select.tabs__select--isOpened {}
.mobile .tabs--select .tabs__select .tabs__selectPlaceholder {
	opacity: .75;

}
.mobile .tabs--select .tabs__select .tabs__selectArrow {
	width: 28px;
	height: 28px;
	-webkit-box-flex: 0;
	    -ms-flex: none;
	        flex: none;
	border-radius: 50%;
	background: #fff;
	display: -webkit-box;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	    -ms-flex-align: center;
	        align-items: center;
	-webkit-box-pack: center;
	    -ms-flex-pack: center;
	        justify-content: center;
	-webkit-box-shadow: 0 0 6px 0 rgba(0, 0, 0, .16);
	        box-shadow: 0 0 6px 0 rgba(0, 0, 0, .16);
	position: absolute;
	top: 50%;
	right: 6px;
	-webkit-transform: translateY(-50%);
	        transform: translateY(-50%);
	-webkit-transition: -webkit-transform .3s ease;
	transition: -webkit-transform .3s ease;
	transition: transform .3s ease;
	transition: transform .3s ease, -webkit-transform .3s ease;

}
.mobile .tabs--select .tabs__select .tabs__selectArrow svg {
	fill: #33b178;
	stroke: #33b178;
	stroke-width: 1px;
	-webkit-transition: all .2s ease;
	transition: all .2s ease;
	-webkit-transform: rotate(180deg);
	        transform: rotate(180deg);

}
.mobile .tabs--select .tabs__selectDropdown {
	height: 0;
	max-height: 350px;
	width: 100%;

	/* max-width: 100%; */
	min-width: 290px;
	padding: 0;

	/* padding-top: 35px;
			padding-bottom: 20px; */
	margin: -20px auto 0;
	overflow: hidden;
	-webkit-transition: .3s ease;
	transition: .3s ease;
	-webkit-transition-property: height, padding;
	transition-property: height, padding;
	border-radius: 0 0 20px 20px;
	background: #fff;
	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	        box-shadow: 0 0 20px rgba(0, 0, 0, .25);
	position: absolute;
	z-index: 5;

}
.mobile .tabs--select .tabs__dropdownInner {
	max-height: 100%;

}
.mobile .tabs--select .tabs__labelGroup {
	display: block;

}
.mobile .tabs--select .tabs__labelGroup:before, .mobile .tabs--select .tabs__labelGroup:after {
	display: none !important;

}
.mobile .tabs--select .tabs__label {
	display: block;
	padding: 10px 20px;
	font-size: 16px;
	font-weight: 500;

}
.mobile .tabs--select .formatedText *:first-child {
	margin-top: 0;

}
.mobile .tabs--select .tabs__contentGroup {
	margin-top: 40px;

}
.mobile .tabs--select .tabs__contentWrap {
	padding-top: 0;

}


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var DevelopmentMode =
/*#__PURE__*/
function () {
  function DevelopmentMode(options) {
    var _this = this;

    _classCallCheck(this, DevelopmentMode);

    this.mobileWords = ['мобила', 'телефон', 'ифон', 'мини', 'мобильник', 'мобилка', 'шзрщту', 'ьщишду', 'vj,bkf', 'ntktajy', 'bajy', 'vbyb', 'vj,bkmybr', 'vj,bkrf', 'iphone', 'mobile'];
    this.tabletWords = ['таблет', 'планшет', 'средняк', 'медиум', 'айпад', 'планшетка', 'шзфв', 'ефидуе', 'nf,ktn', 'gkfyitn', 'chtlyzr', 'vtlbev', 'fqgfl', 'gkfyitnrf', 'ipad', 'tablet'];
    this.desktopWords = ['ящик', 'гроб', 'куб', 'мусорное ведро', 'комп', 'компьютер', 'desktop', 'clear', 'zobr', 'uhj,', 're,', 'vecjhyjt dtlhj', 'rjvg', 'rjvgm.nth', 'вуылещз', 'сдуфк'];
    this.clearWords = ['сброс', 'c,hjc'];
    this.showStatusWords = ['где я', 'статус', 'устройств', 'что щас', 'ult z', 'cnfnec', 'ecnhjqcnd', 'xnj ofc'];
    this.toPagesWords = ['страницы', 'cnhfybws'];
    var keys = [];
    var arrayKeywords = [].concat(this.mobileWords, this.tabletWords, this.desktopWords, this.showStatusWords, this.toPagesWords, this.clearWords);
    document.addEventListener('keyup', function (event) {
      var key = event.key,
          keyCode = event.keyCode;

      if (keys.langth > 20) {
        keys.shift();
      }

      if (key) {
        keys.push(key.toLowerCase());
      } else {
        keys.push(String.fromCharCode(keyCode).toLowerCase());
      }

      var word = keys.join('');
      var i = 0;

      for (; i < arrayKeywords.length; i++) {
        if (word.indexOf(arrayKeywords[i].toLowerCase()) + 1 !== 0) {
          keys = [];

          _this.keyLogic(arrayKeywords[i]);

          break;
        }
      }

      _this.timeout && clearTimeout(_this.timeout);
      _this.timeout = setTimeout(function () {
        keys = [];
      }, 10000);
    });
  }

  _createClass(DevelopmentMode, [{
    key: "keyLogic",
    value: function keyLogic(key) {
      var isMobile;
      var isTablet;
      var isDesktop;
      var showStatus;
      var toPagesWords;

      if (this.mobileWords.includes(key)) {
        isMobile = true;
      } else if (this.tabletWords.includes(key)) {
        isTablet = true;
      } else if (this.desktopWords.includes(key)) {
        isDesktop = true;
      } else if (this.showStatusWords.includes(key)) {
        showStatus = true;
      } else if (this.toPagesWords.includes(key)) {
        toPagesWords = true;
      } else if (this.clearWords.includes(key)) {
        this.clear();
        window.location = window.location.href;
      }

      switch (true) {
        case isMobile:
          this.mobile();
          break;

        case isTablet:
          this.tablet();
          break;

        case isDesktop:
          this.desktop();
          break;

        case showStatus:
          this.showStatus();
          break;

        case toPagesWords:
          location.href = '/pages';
          break;
      }
    }
  }, {
    key: "mobile",
    value: function mobile() {
      if (/mobile=true/.test(document.cookie)) return;
      this.clear();
      document.cookie = 'mobile=true';
      window.location = window.location.href;
    }
  }, {
    key: "tablet",
    value: function tablet() {
      if (/tablet=true/.test(document.cookie)) return;
      this.clear();
      document.cookie = 'tablet=true';
      window.location = window.location.href;
    }
  }, {
    key: "desktop",
    value: function desktop() {
      if (/desktop=true/.test(document.cookie)) return;
      this.clear();
      document.cookie = 'desktop=true';
      window.location = window.location.href;
    }
  }, {
    key: "clear",
    value: function clear() {
      document.cookie = 'mobile=false';
      document.cookie = 'tablet=false';
      document.cookie = 'desktop=false';
    }
  }, {
    key: "showStatus",
    value: function showStatus() {
      var el = document.createElement('div');
      el.style.position = 'fixed';
      el.style.top = 15;
      el.style.right = 15;
      el.style.padding = '10px 20px';
      el.style.borderRadius = '3px';
      el.style.background = 'rgba(0,0,0,.1)';
      el.style.zIndex = 9999999;
      var status;
      var text;

      if (/mobile=true/.test(document.cookie)) {
        status = 'mobile';
        text = 'Мобильное устройство';
      } else if (/tablet=true/.test(document.cookie)) {
        status = 'tablet';
        text = 'Планшет';
      } else if (/desktop=true/.test(document.cookie)) {
        status = 'desktop';
        text = 'Настольный компьютер';
      } else {
        status = 'auto';
        text = 'Автоматически определяется';
      }

      el.innerText = text;
      document.body.appendChild(el);
      setTimeout(function () {
        el.remove();
      }, 5000);
    }
  }]);

  return DevelopmentMode;
}();

exports.default = DevelopmentMode;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _animation = _interopRequireDefault(__webpack_require__(/*! ./animation */ "./src/layout/js/animation.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var ScrollToTop =
/*#__PURE__*/
function (_Animation) {
  _inherits(ScrollToTop, _Animation);

  function ScrollToTop() {
    var _this;

    _classCallCheck(this, ScrollToTop);

    _this = _possibleConstructorReturn(this, (ScrollToTop.__proto__ || Object.getPrototypeOf(ScrollToTop)).call(this));
    addEventListener('scrollToTop', function (event) {
      _this.scroll();
    });
    return _this;
  }

  _createClass(ScrollToTop, [{
    key: "scroll",
    value: function scroll() {
      var _this2 = this;

      var start = Date.now();
      var scroll = window.pageYOffset;
      var duration = scroll / 2000 * 1000;

      var blockScroll = function blockScroll(event) {
        event.preventDefault();
      };

      addEventListener('mousewheel', blockScroll);

      var animate = function animate() {
        var progress = _this2.__progress(start, duration);

        window.scrollTo(0, scroll * (1 - progress));

        if (progress === 1) {
          removeEventListener('mousewheel', blockScroll);
          return;
        }

        requestAnimationFrame(animate);
      };

      requestAnimationFrame(animate);
    }
  }]);

  return ScrollToTop;
}(_animation.default);

exports.default = ScrollToTop;

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var styles = "\n\n.noty {\n  list-style: none;\n  margin: 0;\n  padding:0;\n  position: fixed;\n  top: 5vh;\n  right: 20px;\n  width: 20vw;\n  min-width: 180px;\n  will-change: transform;\n  z-index: 99999;\n}\n.noty__container-mes {\n  padding: 5px 0;\n  box-sizing: border-box;\n  transform: translateX(0%);\n  transition: .5s ease;\n}\n.noty__container-mes.closing {\n  transform: translateX(140%);\n}\n.noty__mes {\n  background: #fff;\n  border-radius: 3px;\n  box-shadow: 0 5px 14px -4px rgba(0, 0, 0, .2), 0 5px 25px 0 rgba(0, 0, 0, .1);\n  overflow: hidden;\n  font-size: .875em;\n  padding: 7px 0;\n}\n.noty__mes.noty--error {\n  background: #f72e2e;\n  color: #fff;\n}\n.noty__mes.noty--info {\n  background: #009cff;\n  color: #fff;\n}\n.noty__mes.noty--warn {\n  background: #ffae00;\n  color: #000;\n}\n.noty__mes > *:not(.noty__close) {\n  padding: 2px 15px;\n  margin-top: 2px;\n  line-height: 1.35em;\n}\n.noty__mes > *:nth-child(2) {\n  padding-top: 7px;\n}\n.noty__mes > *:last-child {\n  padding-bottom: 7px;\n}\n\n.noty__mes h4 {\n  font-size: 1.125em;\n  line-height: 1em;\n  margin: 0px 0 0px;\n}\n.noty__text {\n  font-size: .875em;\n}\n.noty__close {\n  float: right;\n  width: 32px;\n  height: 32px;\n  position: relative;\n  cursor: pointer;\n}\n.noty__close:before,\n.noty__close:after {\n  content: '';\n  position: absolute;\n  width: 16px;\n  height: 2px;\n  background: currentColor;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  margin: auto;\n  transition: .13s ease;\n}\n.noty__close:before {\n  transform: rotate(45deg);\n}\n.noty__close:after {\n  transform: rotate(-45deg);\n}\n.noty__close:hover:before,\n.noty__close:hover:after{\n  transform: rotate(0);\n}";
var notyId = 'QsdaDRW';
var lastMsg = 0;
var MSG_INTERVAL = 200;
var timeToClose = 5000;

var Noty =
/*#__PURE__*/
function () {
  function Noty() {
    var _this = this,
        _arguments = arguments;

    _classCallCheck(this, Noty);

    if (arguments[arguments.length - 1] instanceof Object) {
      this.options = arguments[arguments.length - 1];
    } else {
      this.options = {};
    }

    this.createContainer();
    var time = Date.now();

    if (lastMsg && time - lastMsg < MSG_INTERVAL) {
      var diff = MSG_INTERVAL - (time - lastMsg);
      setTimeout(function () {
        _this.createMessage.apply(_this, _toConsumableArray(_arguments));
      }, diff);

      if (time - lastMsg < 0) {
        lastMsg += MSG_INTERVAL;
      } else {
        lastMsg += diff;
      }
    } else {
      lastMsg = time;
      this.createMessage.apply(this, arguments);
    }
  }

  _createClass(Noty, [{
    key: "createMessage",
    value: function createMessage(head, text) {
      if (text instanceof Object) text = null;
      var mesContain = this.createEl('', 'li');
      mesContain.className = 'noty__container-mes';
      var mes = this.createEl('');
      mes.className = 'noty__mes ' + (this.options.class || '');
      var close = this.createEl('');
      close.className = 'noty__close';
      mes.appendChild(close);
      mes.appendChild(this.createEl(head, 'h4'));
      if (text) mes.appendChild(this.createEl(text));
      mesContain.appendChild(mes);
      mesContain.classList.add('closing');
      this.container.appendChild(mesContain);
      requestAnimationFrame(function () {
        requestAnimationFrame(function () {
          mesContain.classList.remove('closing');
        });
      });
      close.addEventListener('click', closeMessage.bind(this));

      function closeMessage() {
        close.removeEventListener('click', closeMessage);
        mesContain.classList.add('closing');
        mesContain.style.width = mesContain.offsetWidth + 'px';
        mesContain.style.height = mesContain.offsetHeight + 'px';
        requestAnimationFrame(function () {
          requestAnimationFrame(function () {
            mesContain.style.height = 0;
            mesContain.style.padding = 0;
          });
        });
        setTimeout(function () {
          mesContain.remove();
        }, 1000);
      }

      setTimeout(closeMessage.bind(this), this.options.timeToClose || timeToClose);
    }
  }, {
    key: "createEl",
    value: function createEl(text) {
      var tag = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'div';
      var el = document.createElement(tag);
      el.innerHTML = text;
      return el;
    }
  }, {
    key: "createContainer",
    value: function createContainer() {
      this.container = document.getElementById(notyId);
      if (this.container) return;
      var ul = document.createElement('ul');
      this.container = ul;
      ul.className = 'noty';
      ul.id = notyId;
      document.body.appendChild(this.container);
      document.querySelector('head').insertBefore(this.createEl(styles + this.options.styles, 'style'), document.head.firstChild);
    }
  }], [{
    key: "Error",
    value: function Error() {
      if (arguments[arguments.length - 1] instanceof Object) {
        arguments[arguments.length - 1].class = (arguments[arguments.length - 1].class || '') + ' noty--error';
        return new (Function.prototype.bind.apply(Noty, [null].concat(Array.prototype.slice.call(arguments))))();
      } else {
        var options = {
          class: 'noty--error'
        };
        return new (Function.prototype.bind.apply(Noty, [null].concat(Array.prototype.slice.call(arguments), [options])))();
      }
    }
  }, {
    key: "Info",
    value: function Info() {
      if (arguments[arguments.length - 1] instanceof Object) {
        arguments[arguments.length - 1].class = (arguments[arguments.length - 1].class || '') + ' noty--error';
        return new (Function.prototype.bind.apply(Noty, [null].concat(Array.prototype.slice.call(arguments))))();
      } else {
        var options = {
          class: 'noty--info'
        };
        return new (Function.prototype.bind.apply(Noty, [null].concat(Array.prototype.slice.call(arguments), [options])))();
      }
    }
  }, {
    key: "Warn",
    value: function Warn() {
      if (arguments[arguments.length - 1] instanceof Object) {
        arguments[arguments.length - 1].class = (arguments[arguments.length - 1].class || '') + ' noty--error';
        return new (Function.prototype.bind.apply(Noty, [null].concat(Array.prototype.slice.call(arguments))))();
      } else {
        var options = {
          class: 'noty--warn'
        };
        return new (Function.prototype.bind.apply(Noty, [null].concat(Array.prototype.slice.call(arguments), [options])))();
      }
    }
  }, {
    key: "Styles",
    value: function Styles(arg) {
      var el = document.createElement('style');
      el.innerText = arg;
      document.querySelector('head').appendChild(el);
    }
  }, {
    key: "TimeToClose",
    value: function TimeToClose(val) {
      timeToClose = val;
    }
  }]);

  return Noty;
}();

window.Noty = Noty;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.initUnroll = void 0;

__webpack_require__(/*! ./content.css */ "./src/pages/content/content.css");

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var Unroll =
/*#__PURE__*/
function () {
  function Unroll(elem) {
    _classCallCheck(this, Unroll);

    this.elem = elem;
    this.btn = this.elem.querySelector('.unroll__link');
    this.dataContainer = this.elem.querySelector('.unroll__data');
    this.dataContainer.style.height = 0;
    this.btn.addEventListener('click', this.handleBtnClick.bind(this));
    this.isOpened = false;
  }

  _createClass(Unroll, [{
    key: "handleBtnClick",
    value: function handleBtnClick(event) {
      event.preventDefault();

      if (this.isOpened) {
        this.dataContainer.style.height = 0;
        this.isOpened = false;
      } else {
        this.dataContainer.style.height = this.dataContainer.scrollHeight;
        this.isOpened = true;
      }
    }
  }]);

  return Unroll;
}();

var initUnroll = function initUnroll() {
  Array.from(document.querySelectorAll('.unroll')).forEach(function (elem) {
    new Unroll(elem);
  });
};

exports.initUnroll = initUnroll;// removed by extract-text-webpack-plugin

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Select = _interopRequireDefault(__webpack_require__(/*! ./Select */ "./src/components/selectDateRange/Select.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var SelectDateRange = function SelectDateRange(element) {
  _classCallCheck(this, SelectDateRange);

  this.element = element;
  this.startSelect = new _Select.default(this.element.querySelector('.selectDateRange__start'));
  this.endSelect = new _Select.default(this.element.querySelector('.selectDateRange__end'));
};

exports.default = SelectDateRange;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _date = __webpack_require__(/*! ./date */ "./src/components/selectDateRange/date.js");

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var insertInto = function insertInto(field, content) {
  field.textContent = content;
};

var selectEl = function selectEl(el) {
  var currentEl = el.parentElement.querySelector('.active') || {
    classList: {
      remove: function remove() {
        return;
      }
    }
  };
  currentEl.classList.remove('active');
  el.classList.add('active');
};

var Select =
/*#__PURE__*/
function () {
  function Select(element) {
    _classCallCheck(this, Select);

    this.element = element;
    this.toggleBtn = this.element.querySelector('.selectDateRange__itemToggleBtn');
    this.dropdown = this.element.querySelector('.selectDateRange__itemPanelWrap');
    this.titleElem = this.element.querySelector('.selectDateRange__itemTitle');
    this.yearsContainer = this.dropdown.querySelector('.selectDateRange__years');
    this.monthsContainer = this.dropdown.querySelector('.selectDateRange__months');
    this.selectedDate = {
      month: '',
      year: ''
    };
    this.isOpened = false;
    this.addEventListeners();
  }

  _createClass(Select, [{
    key: "addEventListeners",
    value: function addEventListeners() {
      var _this = this;

      this.toggleBtn.addEventListener('click', function () {
        _this.toggle();
      });
      this.yearsContainer.addEventListener('click', function (_ref) {
        var target = _ref.target;
        var el = target.closest('.selectDateRange__years .el');

        if (!el) {
          return;
        }

        _this.selectYear(el);
      });
      this.monthsContainer.addEventListener('click', function (_ref2) {
        var target = _ref2.target;
        var el = target.closest('.selectDateRange__months .el');

        if (!el) {
          return;
        }

        _this.selectMonth(el);
      });
    }
  }, {
    key: "setMonth",
    value: function setMonth(month) {
      this.selectedDate.month = month;
    }
  }, {
    key: "setYear",
    value: function setYear(year) {
      this.selectedDate.year = year;
    }
  }, {
    key: "selectYear",
    value: function selectYear(el) {
      // work with data
      var year = el.textContent;
      this.setYear(year); // work with DOM

      if (Number(year) === (0, _date.getCurrentYear)()) {
        this.lockNonPurchasedMonth();
      } else {
        this.unlockAllMonth();
      }

      selectEl(el);

      if (this.selectedDate.month) {
        var _selectedDate = this.selectedDate,
            month = _selectedDate.month,
            _year = _selectedDate.year;
        insertInto(this.titleElem, "".concat(month, " ").concat(_year));
        this.close();
      }
    }
  }, {
    key: "selectMonth",
    value: function selectMonth(el) {
      if (el.classList.contains('locked')) {
        return;
      } // work with data


      var month = el.textContent;
      this.setMonth(month); // work with DOM

      selectEl(el);

      if (this.selectedDate.year) {
        var _selectedDate2 = this.selectedDate,
            _month = _selectedDate2.month,
            year = _selectedDate2.year;
        insertInto(this.titleElem, "".concat(_month, " ").concat(year));
        this.close();
      }
    }
  }, {
    key: "clickOnWindowHandler",
    value: function clickOnWindowHandler(_ref3) {
      var target = _ref3.target;

      if (!this.element.contains(target)) {
        this.close();
      }
    }
  }, {
    key: "toggle",
    value: function toggle() {
      if (this.isOpened) {
        this.close();
      } else {
        this.open();
      }
    }
  }, {
    key: "close",
    value: function close() {
      window.removeEventListener('click', this.clickOnWindowHandler);
      this.element.classList.remove('isOpened');
      this.dropdown.style.height = 0;
      this.dropdown.classList.add('visuallyhidden');
      this.isOpened = false;
    }
  }, {
    key: "open",
    value: function open() {
      window.addEventListener('click', this.clickOnWindowHandler.bind(this));
      this.element.classList.add('isOpened');
      this.dropdown.classList.remove('visuallyhidden');
      this.dropdown.style.height = this.dropdown.scrollHeight;
      this.isOpened = true;
    }
  }, {
    key: "lockNonPurchasedMonth",
    value: function lockNonPurchasedMonth() {
      var crnMonthNumber = (0, _date.getCurrentMonthNumber)();
      var monthList = this.monthsContainer.querySelectorAll('.el');
      Array.from(monthList).forEach(function (monthEl) {
        var monthName = monthEl.textContent.toLowerCase();
        var monthNumber = (0, _date.getMonthNumber)(monthName);

        if (monthNumber > crnMonthNumber) {
          monthEl.classList.add('locked');
        }
      });
    }
  }, {
    key: "unlockAllMonth",
    value: function unlockAllMonth() {
      var lockedMonthElms = this.monthsContainer.querySelectorAll('.el.locked');

      if (!lockedMonthElms.length) {
        return;
      }

      Array.from(lockedMonthElms).forEach(function (monthEl) {
        monthEl.classList.remove('locked');
      });
    }
  }]);

  return Select;
}();

exports.default = Select;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getMonthNumber = exports.getCurrentMonthNumber = exports.getCurrentYear = void 0;
var currentDate = new Date();
var currentYear = currentDate.getFullYear();
var currentMonth = currentDate.getMonth();
var months = ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'];

var getCurrentYear = function getCurrentYear() {
  return currentYear;
};

exports.getCurrentYear = getCurrentYear;

var getCurrentMonthNumber = function getCurrentMonthNumber() {
  return currentMonth;
};

exports.getCurrentMonthNumber = getCurrentMonthNumber;

var getMonthNumber = function getMonthNumber(monthName) {
  return months.indexOf(monthName);
};

exports.getMonthNumber = getMonthNumber;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _background = _interopRequireDefault(__webpack_require__(/*! ../../layout/js/background */ "./src/layout/js/background.js"));

var _animation = _interopRequireDefault(__webpack_require__(/*! ../../layout/js/animation */ "./src/layout/js/animation.js"));

var _fixHead = _interopRequireDefault(__webpack_require__(/*! ./js/fixHead */ "./src/components/header/js/fixHead.js"));

var _menuTrigger = _interopRequireDefault(__webpack_require__(/*! ./js/menuTrigger */ "./src/components/header/js/menuTrigger.js"));

var _scroll = _interopRequireDefault(__webpack_require__(/*! ../../layout/js/scroll */ "./src/layout/js/scroll.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var BG;
var Menu;

var _default =
/*#__PURE__*/
function (_Animations) {
  _inherits(_default, _Animations);

  function _default() {
    var _this;

    _classCallCheck(this, _default);

    _this = _possibleConstructorReturn(this, (_default.__proto__ || Object.getPrototypeOf(_default)).call(this));
    if (!document.getElementsByClassName('siteHeader')[0]) return _possibleConstructorReturn(_this);
    setTimeout(function () {
      new _fixHead.default();
      new _menuTrigger.default();

      if (document.querySelector('.search')) {
        __webpack_require__.e(/*! import() */ 3).then(__webpack_require__.t.bind(null, /*! ./js/searchTrigger.js */ "./src/components/header/js/searchTrigger.js", 7)).then(function (module) {
          var SearchTrigger = module.default;
          new SearchTrigger();
        });
      }

      new _scroll.default(document.getElementsByClassName('navigationGroup')[0], {
        scrollStyle: {
          'width': '3px',
          'background': 'rgba(255,255,255,0.7)',
          'borderRadius': '3px'
        }
      });
    }, 40);
    _this.header = document.getElementsByClassName('siteHeader')[0];
    _this.headerContainer = _this.header.parentNode;
    _this.bg = _this.headerContainer.querySelector('.siteHeader__bg');
    _this.nav = _this.header.querySelector('.siteHeader__nav');
    _this.links = _this.nav.querySelectorAll('a');
    _this.menu = _this.headerContainer.querySelector('.siteNav__menu');
    BG = new _background.default(_this.bg, [_this.headerContainer].concat(_toConsumableArray(_this.menu.querySelectorAll('[data-menu-block-name]'))), 'height');

    _this.headerLogic();

    return _this;
  }

  _createClass(_default, [{
    key: "headerLogic",
    value: function headerLogic() {
      var _this2 = this;

      [].forEach.call(this.links, function (item) {
        var headBlockName = item.dataset.headBlockName;

        var el = _this2.menu.querySelector("[data-menu-block-name=\"".concat(headBlockName, "\"]"));

        item.addEventListener('mouseenter', function (event) {
          [].forEach.call(_this2.links, function (item) {
            item.classList.remove('--active');
          });
          item.classList.add('--active');

          var active = _this2.menu.querySelector(".fadeIn[data-menu-block-name]");

          if (active == el) return;
          if (active) _this2.fadeOut(active, {
            duration: 150
          }).then(function () {
            showActiveBlock.call(_this2);
          });else {
            showActiveBlock.call(_this2);
          }
          _this2.openedHeader = true;
        });

        function showActiveBlock() {
          if (!el) {
            BG.hide();
            return;
          }

          this.fadeIn(el, {
            delay: 300,
            duration: 150
          });
          BG.show();
        }
      });

      function hideHeadMenu() {
        if (!this.openedHeader) return;
        var el = this.menu.querySelector(".fadeIn[data-menu-block-name]");
        [].forEach.call(this.links, function (item) {
          item.classList.remove('--active');
        });
        BG.hide();
        this.fadeOut(el, {
          duration: 150
        });
      }

      this.headerContainer.addEventListener('mouseleave', function (event) {
        hideHeadMenu.call(_this2);
      });
      document.getElementsByClassName('siteHeader__rightBar')[0].addEventListener('mouseenter', function (event) {
        hideHeadMenu.call(_this2);
      });
      addEventListener('scroll', function (event) {
        hideHeadMenu.call(_this2);
      });
    }
  }]);

  return _default;
}(_animation.default);

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _transitionEnd = _interopRequireDefault(__webpack_require__(/*! ./transitionEnd */ "./src/layout/js/transitionEnd.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _default =
/*#__PURE__*/
function () {
  // передается элемент который показывается/скрывается и элементы, которые надо закрыть параметром "высота"
  function _default(bgElement, parents, parameter, transitionendCallback) {
    _classCallCheck(this, _default);

    this.el = bgElement;
    this.parents = parents || this.el;
    this.parameter = parameter;
    this[this.parameter] = {
      init: parseInt(getComputedStyle(this.el)[this.parameter])
    };
    if (transitionendCallback) this.transitionEnd = new _transitionEnd.default({
      element: this.el,
      callback: transitionendCallback
    });
    this.__animationCount = 0;
  }

  _createClass(_default, [{
    key: "show",
    value: function show() {
      var _this = this;

      this.__showing = true;
      this[this.parameter].start = parseInt(getComputedStyle(this.el)[this.parameter]) || 0;
      this.el.style[this.parameter] = this[this.parameter].start + 'px';
      var animationNumber = this.__animationCount++;
      this.el.style['transition'] = 'height .3s ease';
      requestAnimationFrame(function () {
        requestAnimationFrame(function () {
          var menuHeight = 0;
          if (_this.parents instanceof Array) {
            if (_this.parents.length == 1) {
              menuHeight = parseInt(getComputedStyle(_this.parents[0])[_this.parameter]);
            } else {
              _this.parents.forEach(function (item) {
                var value = parseInt(getComputedStyle(item)[_this.parameter]);
                if (value !== value) return;
                menuHeight += value;
              });
            }
          } else {
            menuHeight = parseInt(getComputedStyle(_this.parents)[_this.parameter]);
          }
          _this.el.style[_this.parameter] = menuHeight + 'px';
        });
      });
    }
  }, {
    key: "hide",
    value: function hide() {
      var _this2 = this;

      this.__hiding = true;
      this.el.style['transition'] = 'height .3s ease .2s';
      if (!this.__showing && !this.__showed) return;
      requestAnimationFrame(function () {
        requestAnimationFrame(function () {
          _this2.el.style[_this2.parameter] = '0px';
        });
      });
    }
  }, {
    key: "removeCallback",
    value: function removeCallback() {
      this.transitionEnd && this.transitionEnd.end();
    }
  }]);

  return _default;
}();

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var TransitionEnd =
/*#__PURE__*/
function () {
  function TransitionEnd(options) {
    _classCallCheck(this, TransitionEnd);

    this.element = options.element || window;
    this.callback = options.callback.bind(this);
    this.parent = options.parent || null;
    this.Listener();
  }

  _createClass(TransitionEnd, [{
    key: "Listener",
    value: function Listener() {
      this.element.addEventListener('transitionend', this.callback);
    }
  }, {
    key: "end",
    value: function end() {
      this.element.removeEventListener('transitionend', this.callback);
    }
  }]);

  return TransitionEnd;
}();

exports.default = TransitionEnd;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _default =
/*#__PURE__*/
function () {
  function _default() {
    var _this = this;

    _classCallCheck(this, _default);

    this.header = document.getElementsByClassName('container__siteHeader')[0];
    this.panels = document.querySelector('.panels');
    var headerHeight = parseInt(getComputedStyle(this.header).height);
    var pageNav = document.querySelectorAll(['.pageNav', '.siteTitle'])[0];
    if (!pageNav || !document.querySelector('.siteTitle')) return;

    var _pageNav$getBoundingC = pageNav.getBoundingClientRect(),
        bottom = _pageNav$getBoundingC.bottom;

    bottom += window.pageYOffset;
    addEventListener('scroll', function (event) {
      var scroll = window.pageYOffset;

      if (scroll > bottom) {
        if (!_this.__fixed) _this.fix();
      } else if (scroll === 0) {
        _this.unFix();
      }

      if (scroll > bottom / 4 * 2) {
        _this.show();
      } else {
        if (!_this.__fixed) {
          _this.hide();
        }
      }
    });
  }

  _createClass(_default, [{
    key: "fix",
    value: function fix() {
      this.__fixed = true;
      this.header.classList.add('container__siteHeader--fixed');
      var helperDiv = document.createElement("div");
      helperDiv.style.height = this.header.offsetHeight + "px";
      helperDiv.classList.add('helperDiv');
      var parentDiv = this.header.parentNode;
      parentDiv.insertBefore(helperDiv, parentDiv.firstChild);
      this.show();
    }
  }, {
    key: "unFix",
    value: function unFix() {
      this.__fixed = false;
      this.header.classList.remove('container__siteHeader--fixed');
      var helperDiv = document.getElementsByClassName('helperDiv')[0];
      helperDiv && helperDiv.parentNode.removeChild(helperDiv);
      this.hide();
    }
  }, {
    key: "show",
    value: function show() {
      this.header.classList.add('container__siteHeader-animationToTop');
    }
  }, {
    key: "hide",
    value: function hide() {
      this.header.classList.remove('container__siteHeader-animationToTop');
    }
  }]);

  return _default;
}();

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _default =
/*#__PURE__*/
function () {
  function _default() {
    var _this = this;

    _classCallCheck(this, _default);

    this.trigger = document.getElementById('menu-trigger');
    this.header = document.querySelector('.container__siteHeader');
    this.menu = document.querySelector('.siteNav__menuLarge');
    this.closeBtn = this.menu.querySelector('.siteNav__menuLarge-close');
    var count = 0;
    this.__scrollWidth = window.innerWidth - document.body.offsetWidth;
    this.trigger.addEventListener('change', function (event) {
      if (_this.trigger.checked) {
        if (!document.documentElement.classList.contains('mobile')) {
          document.body.style.marginRight = _this.__scrollWidth + 'px';
          _this.header.style.paddingRight = _this.__scrollWidth + 'px';
        }

        document.body.classList.add('remove-scroll');

        if (count++ == 0) {
          event.preventDefault();
          _this.menu.style.visibility = 'visible';
          requestAnimationFrame(function () {
            _this.open();
          });
        }
      } else {
        if (!document.documentElement.classList.contains('mobile')) {
          document.body.style.marginRight = '';
          _this.header.style.paddingRight = '';
        }

        document.body.classList.remove('remove-scroll');
      }
    });
    this.closeBtn.addEventListener('click', function (event) {
      _this.open() || _this.close();
    });
    window.addEventListener('keydown', function (event) {
      if (event.key == 'Escape' || event.key == 'Esc' || event.keyCode == 27) {
        _this.close();
      }
    });
    document.querySelector('.navigationGroup').addEventListener('click', function (event) {
      if (event.target.closest('a')) {
        _this.close();
      }
    });
  }

  _createClass(_default, [{
    key: "open",
    value: function open() {
      if (this.trigger.checked) return;
      this.trigger.click();
      return true;
    }
  }, {
    key: "close",
    value: function close() {
      if (!this.trigger.checked) return;
      this.trigger.click();
      return true;
    }
  }]);

  return _default;
}();

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var Scrollbar =
/*#__PURE__*/
function () {
  function Scrollbar(element) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    _classCallCheck(this, Scrollbar);

    this.__el = element;
    this.__el.style.marginRight = '-85px';
    this.__el.style.paddingRight = '70px';
    this.__el.parentNode.style.overflow = 'hidden';
    this.scrollStyle = options.scrollStyle;
    this.scrollHeight = this.__el.scrollHeight;
    this.height = this.__el.offsetHeight;
    this.generateBar();
    this.barStyles();
    this.listener();
    this.generateContainer();
  }

  _createClass(Scrollbar, [{
    key: "generateBar",
    value: function generateBar() {
      this.scrollContainer = document.createElement('div');
      this.scrollPanel = document.createElement('div');
      this.scrollContainer.appendChild(this.scrollPanel);

      this.__el.parentNode.append(this.scrollContainer);
    }
  }, {
    key: "generateContainer",
    value: function generateContainer() {// console.log(this.__el.childNodes);
    }
  }, {
    key: "barStyles",
    value: function barStyles() {
      var cSty = this.scrollContainer.style;
      var pSty = this.scrollPanel.style;
      cSty.position = 'absolute';
      cSty.right = 0;
      cSty.top = 0;
      cSty.width = '10px';
      cSty.height = '100%';
      cSty.background = '';
      pSty.position = 'absolute';

      if (!this.scrollStyle) {
        pSty.width = '5px';
        pSty.right = 1;
        pSty.background = 'linear-gradient(180deg,#83eb67,#0ca480)';
      } else {
        for (var parameter in this.scrollStyle) {
          pSty[parameter] = this.scrollStyle[parameter];
        }
      }

      this.setScroll();
    }
  }, {
    key: "listener",
    value: function listener() {
      var _this = this;

      this.__el.addEventListener('scroll', function () {
        _this.setScroll();
      });

      this.__el.addEventListener('setScrollOnMap', function (event) {
        _this.setScroll();
      });

      addEventListener('resize', function (event) {
        _this.setScroll();
      });
    }
  }, {
    key: "setScroll",
    value: function setScroll() {
      this.scrollHeight = this.__el.scrollHeight;
      this.height = parseInt(getComputedStyle(this.__el).height);
      var height = this.height / this.scrollHeight * 100;
      var top = this.__el.scrollTop / this.scrollHeight * 100;
      if (height == 100) height = 0;
      this.scrollPanel.style.height = height + '%';
      this.scrollPanel.style.top = top + '%';
    }
  }]);

  return Scrollbar;
}();

exports.default = Scrollbar;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var _default = function _default() {
  var _this = this;

  _classCallCheck(this, _default);

  this.trigger = document.getElementById('search-trigger');
  this.header = document.querySelector('.container__siteHeader');
  this.close = document.querySelector('.searchForm__close');
  this.bg = document.querySelector('.searchForm__bg');
  this.input = document.querySelector('.searchForm__form input');
  this.__scrollWidth = window.innerWidth - document.body.offsetWidth;

  if (document.querySelector('.headerBlog__icon--search')) {
    this.headerBlockIcon = document.querySelector('.headerBlog__icon--search');
  }

  this.trigger.addEventListener('change', function (event) {
    if (_this.trigger.checked) {
      document.body.style.marginRight = _this.__scrollWidth + 'px';

      if (_this.header.classList.contains('container__siteHeader--fixed')) {
        _this.header.style.paddingRight = _this.__scrollWidth + 'px';
      }

      if (document.querySelector('.headerBlog__icon--search')) {
        _this.headerBlockIcon.classList.add('--opened');
      }

      document.body.classList.add('remove-scroll');
    } else {
      document.body.style.marginRight = '';

      if (_this.header.classList.contains('container__siteHeader--fixed')) {
        _this.header.style.paddingRight = '';
      }

      if (document.querySelector('.headerBlog__icon--search')) {
        _this.headerBlockIcon.classList.remove('--opened');
      }

      document.body.classList.remove('remove-scroll');
    }
  });
  this.close.addEventListener('click', function (event) {
    _this.trigger.click();

    _this.input.value = '';
  });
  this.bg.addEventListener('click', function (event) {
    _this.trigger.click();

    _this.input.value = '';
  });
  window.addEventListener('keydown', function (event) {
    if (event.key == 'Escape' || event.key == 'Esc' || event.keyCode == 27) {
      if (_this.trigger.checked) {
        // this.trigger.checked = false;
        // this.trigger.dispatchEvent(new Event('change'));
        _this.trigger.click();

        _this.input.value = '';
      }
    }
  });
};

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _background = _interopRequireDefault(__webpack_require__(/*! ../../layout/js/background */ "./src/layout/js/background.js"));

var _animation = _interopRequireDefault(__webpack_require__(/*! ../../layout/js/animation */ "./src/layout/js/animation.js"));

var _menuTrigger = _interopRequireDefault(__webpack_require__(/*! ../header/js/menuTrigger */ "./src/components/header/js/menuTrigger.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var _default =
/*#__PURE__*/
function (_Animations) {
  _inherits(_default, _Animations);

  function _default() {
    var _this;

    _classCallCheck(this, _default);

    _this = _possibleConstructorReturn(this, (_default.__proto__ || Object.getPrototypeOf(_default)).call(this));
    _this.menu = document.querySelectorAll('.--hasChildren');

    _this.__listeners();

    setTimeout(function () {
      // new FixHead();
      new _menuTrigger.default(); // if (document.querySelector('.search')) {
      // 	import('../header/js/searchTrigger.js')
      //     .then( (module)=> {
      //       const SearchTrigger = module.default;
      //       new SearchTrigger();
      //     });
      // }
    }, 40);
    return _this;
  }

  _createClass(_default, [{
    key: "__listeners",
    value: function __listeners() {
      for (var i = 0; i < this.menu.length; i++) {
        this.menu[i].addEventListener('click', function (event) {
          event.stopPropagation();
          var childListWrap = event.target.closest('li').querySelector('.childNav');
          var childList = childListWrap.querySelector('ul');
          var childHeight = parseInt(getComputedStyle(childList).height);

          if (event.target.closest('li').classList.contains('--open')) {
            childListWrap.style.height = 0;
            event.target.closest('li').classList.remove('--open');
          } else {
            childListWrap.style.height = childHeight + 'px';
            event.target.closest('li').classList.add('--open');
          }
        });
      }
    }
  }]);

  return _default;
}(_animation.default);

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _fixHead = _interopRequireDefault(__webpack_require__(/*! ../header/js/fixHead */ "./src/components/header/js/fixHead.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var HeaderBlog =
/*#__PURE__*/
function () {
  function HeaderBlog() {
    _classCallCheck(this, HeaderBlog);

    if (!document.querySelector('.headerBlog')) return;
    this.container = document.querySelector('.js-headerBlog-logo');
    this.logo = document.querySelector('.js-headerBlog-logoImg');
    this.hiddenEl = document.querySelector('.js-headerBlog-hover');
    this.closeIconMobile = document.querySelector('.mobile .js-headerBlog__logoHoverClose');
    this.listeners();
    setTimeout(function () {
      new _fixHead.default();

      if (document.querySelector('.search')) {
        __webpack_require__.e(/*! import() */ 3).then(__webpack_require__.t.bind(null, /*! ../header/js/searchTrigger.js */ "./src/components/header/js/searchTrigger.js", 7)).then(function (module) {
          var SearchTrigger = module.default;
          new SearchTrigger();
        });
      }

      if (document.querySelector('.subscribe')) {
        __webpack_require__.e(/*! import() */ 40).then(__webpack_require__.t.bind(null, /*! ./js/subscribeTrigger.js */ "./src/components/headerBlog/js/subscribeTrigger.js", 7)).then(function (module) {
          var SubscribeTrigger = module.default;
          new SubscribeTrigger();
        });
      }
    }, 40);
  }

  _createClass(HeaderBlog, [{
    key: "listeners",
    value: function listeners() {
      var _this = this;

      this.logo.addEventListener('mouseover', function (event) {
        _this.container.classList.add('--active');

        _this.hiddenEl.classList.add('--active');
      });
      this.container.addEventListener('mouseleave', function (event) {
        _this.container.classList.remove('--active');

        _this.hiddenEl.classList.remove('--active');
      });

      if (this.closeIconMobile) {
        this.closeIconMobile.addEventListener('click', function (event) {
          _this.container.classList.remove('--active');

          _this.hiddenEl.classList.remove('--active');
        });
      }
    }
  }]);

  return HeaderBlog;
}();

exports.default = HeaderBlog;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _default =
/*#__PURE__*/
function () {
  function _default() {
    _classCallCheck(this, _default);

    this.header = document.querySelector('.container__siteHeader');
    this.trigger = document.getElementById('subscribe-trigger');
    this.closeButton = document.querySelector('.subscribe__formClose');
    this.bg = document.querySelector('.subscribe__bg');
    this.input = document.querySelector('.subscribe__form input[type="text"]');
    this.scrollWidth = window.innerWidth - document.body.offsetWidth;

    if (document.querySelector('.headerBlog__icon--subscribe')) {
      this.headerBlockIcon = document.querySelector('.headerBlog__icon--subscribe');
    }

    this.listeners();
  }

  _createClass(_default, [{
    key: "listeners",
    value: function listeners() {
      var _this = this;

      this.trigger.addEventListener('change', function (event) {
        _this.showSubscribe();
      });
      this.closeButton.addEventListener('click', function (event) {
        _this.closeSubscribe();
      });
      this.bg.addEventListener('click', function (event) {
        _this.closeSubscribe();
      });
      window.addEventListener('keydown', function (event) {
        _this.closeKeys();
      });
    }
  }, {
    key: "showSubscribe",
    value: function showSubscribe() {
      if (this.trigger.checked) {
        document.body.style.marginRight = this.scrollWidth + 'px';
        document.body.classList.add('remove-scroll');
        this.headerBlockIcon.classList.add('--opened');

        if (this.header.classList.contains('container__siteHeader--fixed')) {
          this.header.style.paddingRight = this.scrollWidth + 'px';
        }
      } else {
        this.input.value = '';
        document.body.style.marginRight = '';
        document.body.classList.remove('remove-scroll');
        this.headerBlockIcon.classList.remove('--opened');

        if (this.header.classList.contains('container__siteHeader--fixed')) {
          this.header.style.paddingRight = '';
        }
      }
    }
  }, {
    key: "closeSubscribe",
    value: function closeSubscribe() {
      this.trigger.click();
      this.input.value = '';
    }
  }, {
    key: "closeKeys",
    value: function closeKeys() {
      if (event.key == 'Escape' || event.key == 'Esc' || event.keyCode == 27) {
        if (this.trigger.checked) {
          this.trigger.click();
          this.input.value = '';
        }
      }
    }
  }]);

  return _default;
}();

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _default =
/*#__PURE__*/
function () {
  function _default() {
    _classCallCheck(this, _default);

    this.header = document.querySelector('.headerBlog');
    this.trigger = document.getElementById('menu-trigger');
    this.burderBG = document.querySelector('.headerBlog__menuHidden-bg');
    this.scrollWidth = window.innerWidth - document.body.offsetWidth;
    this.listeners();
  }

  _createClass(_default, [{
    key: "listeners",
    value: function listeners() {
      var _this = this;

      this.trigger.addEventListener('change', function (event) {
        _this.showBurger();
      });
      this.burderBG.addEventListener('click', function (event) {
        _this.closeBurger();
      });
      window.addEventListener('keydown', function (event) {
        _this.closeKeys();
      });
    }
  }, {
    key: "showBurger",
    value: function showBurger() {
      if (this.trigger.checked) {
        document.body.style.marginRight = this.scrollWidth + 'px';
        document.body.classList.add('remove-scroll');

        if (this.header.classList.contains('container__siteHeader--fixed')) {
          this.header.style.paddingRight = this.scrollWidth + 'px';
        }
      } else {
        document.body.style.marginRight = '';
        document.body.classList.remove('remove-scroll');

        if (this.header.classList.contains('container__siteHeader--fixed')) {
          this.header.style.paddingRight = '';
        }
      }
    }
  }, {
    key: "closeBurger",
    value: function closeBurger() {
      this.trigger.click();
    }
  }, {
    key: "closeKeys",
    value: function closeKeys() {
      if (event.key == 'Escape' || event.key == 'Esc' || event.keyCode == 27) {
        if (this.trigger.checked) {
          this.trigger.click();
        }
      }
    }
  }]);

  return _default;
}();

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var TagsFilter =
/*#__PURE__*/
function () {
  function TagsFilter() {
    _classCallCheck(this, TagsFilter);

    this.tagsContainer = document.querySelector('.tagsFilter');
    if (!this.tagsContainer) return;
    this.tags = _toConsumableArray(document.querySelectorAll('.js-tagFilter'));
    this.tagHeight = this.tags[0].getBoundingClientRect().height;
    this.tagMargin = getComputedStyle(this.tags[0]).marginBottom;
    this.tagMarginNumber = this.tagMargin.replace('px', '');
    this.heightIndicator = document.querySelector('.tagsFilter__container').getBoundingClientRect().height;
    this.tagsContainerHeight = this.tagsContainer.getBoundingClientRect().height;
    this.rowHeight = this.tagHeight + +this.tagMarginNumber;
    this.maxHeight = this.rowHeight * 4;
    this.button = document.querySelector('.js-tags-btn');
    this.buttonTrigger = document.querySelector('.js-tags-btn .buttonMore-link');
    this.listeners();
    this.setBlock();
  }

  _createClass(TagsFilter, [{
    key: "listeners",
    value: function listeners() {
      var _this = this;

      this.tags.forEach(function (tag) {
        tag.addEventListener('click', function (event) {
          _this.tagActive(tag);
        });
      });
      this.buttonTrigger.addEventListener('click', function (event) {
        _this.buttonActive();
      });
    }
  }, {
    key: "tagActive",
    value: function tagActive(tag) {
      if (!tag.classList.contains('active')) {
        tag.classList.add('active');
      } else {
        tag.classList.remove('active');
      }
    }
  }, {
    key: "buttonActive",
    value: function buttonActive() {
      if (!this.button.classList.contains('--open')) {
        this.button.classList.add('--open');
        this.buttonTrigger.innerText = 'Скрыть теги...';
        this.tagsContainer.style.height = this.heightIndicator + 'px';
      } else {
        this.button.classList.remove('--open');
        this.buttonTrigger.innerText = 'Показать все теги...';
        this.tagsContainer.style.height = this.maxHeight + 'px';
      }
    }
  }, {
    key: "setBlock",
    value: function setBlock() {
      if (this.tagsContainerHeight > this.maxHeight) {
        this.button.classList.add('--show');
        this.tagsContainer.style.height = this.maxHeight + 'px';
      }
    }
  }]);

  return TagsFilter;
}();

exports.default = TagsFilter;module.exports = __webpack_require__(/*! regenerator-runtime */ "./node_modules/regenerator-runtime/runtime-module.js");
/**
 * Copyright (c) 2014-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

// This method of obtaining a reference to the global object needs to be
// kept identical to the way it is obtained in runtime.js
var g = (function() { return this })() || Function("return this")();

// Use `getOwnPropertyNames` because not all browsers support calling
// `hasOwnProperty` on the global `self` object in a worker. See #183.
var hadRuntime = g.regeneratorRuntime &&
  Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;

// Save the old regeneratorRuntime in case it needs to be restored later.
var oldRuntime = hadRuntime && g.regeneratorRuntime;

// Force reevalutation of runtime.js.
g.regeneratorRuntime = undefined;

module.exports = __webpack_require__(/*! ./runtime */ "./node_modules/regenerator-runtime/runtime.js");

if (hadRuntime) {
  // Restore the original runtime.
  g.regeneratorRuntime = oldRuntime;
} else {
  // Remove the global property added by runtime.js.
  try {
    delete g.regeneratorRuntime;
  } catch(e) {
    g.regeneratorRuntime = undefined;
  }
}
/**
 * Copyright (c) 2014-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

!(function(global) {
  "use strict";

  var Op = Object.prototype;
  var hasOwn = Op.hasOwnProperty;
  var undefined; // More compressible than void 0.
  var $Symbol = typeof Symbol === "function" ? Symbol : {};
  var iteratorSymbol = $Symbol.iterator || "@@iterator";
  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";

  var inModule = typeof module === "object";
  var runtime = global.regeneratorRuntime;
  if (runtime) {
    if (inModule) {
      // If regeneratorRuntime is defined globally and we're in a module,
      // make the exports object identical to regeneratorRuntime.
      module.exports = runtime;
    }
    // Don't bother evaluating the rest of this file if the runtime was
    // already defined globally.
    return;
  }

  // Define the runtime globally (as expected by generated code) as either
  // module.exports (if we're in a module) or a new, empty object.
  runtime = global.regeneratorRuntime = inModule ? module.exports : {};

  function wrap(innerFn, outerFn, self, tryLocsList) {
    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
    var generator = Object.create(protoGenerator.prototype);
    var context = new Context(tryLocsList || []);

    // The ._invoke method unifies the implementations of the .next,
    // .throw, and .return methods.
    generator._invoke = makeInvokeMethod(innerFn, self, context);

    return generator;
  }
  runtime.wrap = wrap;

  // Try/catch helper to minimize deoptimizations. Returns a completion
  // record like context.tryEntries[i].completion. This interface could
  // have been (and was previously) designed to take a closure to be
  // invoked without arguments, but in all the cases we care about we
  // already have an existing method we want to call, so there's no need
  // to create a new function object. We can even get away with assuming
  // the method takes exactly one argument, since that happens to be true
  // in every case, so we don't have to touch the arguments object. The
  // only additional allocation required is the completion record, which
  // has a stable shape and so hopefully should be cheap to allocate.
  function tryCatch(fn, obj, arg) {
    try {
      return { type: "normal", arg: fn.call(obj, arg) };
    } catch (err) {
      return { type: "throw", arg: err };
    }
  }

  var GenStateSuspendedStart = "suspendedStart";
  var GenStateSuspendedYield = "suspendedYield";
  var GenStateExecuting = "executing";
  var GenStateCompleted = "completed";

  // Returning this object from the innerFn has the same effect as
  // breaking out of the dispatch switch statement.
  var ContinueSentinel = {};

  // Dummy constructor functions that we use as the .constructor and
  // .constructor.prototype properties for functions that return Generator
  // objects. For full spec compliance, you may wish to configure your
  // minifier not to mangle the names of these two functions.
  function Generator() {}
  function GeneratorFunction() {}
  function GeneratorFunctionPrototype() {}

  // This is a polyfill for %IteratorPrototype% for environments that
  // don't natively support it.
  var IteratorPrototype = {};
  IteratorPrototype[iteratorSymbol] = function () {
    return this;
  };

  var getProto = Object.getPrototypeOf;
  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
  if (NativeIteratorPrototype &&
      NativeIteratorPrototype !== Op &&
      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
    // This environment has a native %IteratorPrototype%; use it instead
    // of the polyfill.
    IteratorPrototype = NativeIteratorPrototype;
  }

  var Gp = GeneratorFunctionPrototype.prototype =
    Generator.prototype = Object.create(IteratorPrototype);
  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
  GeneratorFunctionPrototype.constructor = GeneratorFunction;
  GeneratorFunctionPrototype[toStringTagSymbol] =
    GeneratorFunction.displayName = "GeneratorFunction";

  // Helper for defining the .next, .throw, and .return methods of the
  // Iterator interface in terms of a single ._invoke method.
  function defineIteratorMethods(prototype) {
    ["next", "throw", "return"].forEach(function(method) {
      prototype[method] = function(arg) {
        return this._invoke(method, arg);
      };
    });
  }

  runtime.isGeneratorFunction = function(genFun) {
    var ctor = typeof genFun === "function" && genFun.constructor;
    return ctor
      ? ctor === GeneratorFunction ||
        // For the native GeneratorFunction constructor, the best we can
        // do is to check its .name property.
        (ctor.displayName || ctor.name) === "GeneratorFunction"
      : false;
  };

  runtime.mark = function(genFun) {
    if (Object.setPrototypeOf) {
      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
    } else {
      genFun.__proto__ = GeneratorFunctionPrototype;
      if (!(toStringTagSymbol in genFun)) {
        genFun[toStringTagSymbol] = "GeneratorFunction";
      }
    }
    genFun.prototype = Object.create(Gp);
    return genFun;
  };

  // Within the body of any async function, `await x` is transformed to
  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
  // `hasOwn.call(value, "__await")` to determine if the yielded value is
  // meant to be awaited.
  runtime.awrap = function(arg) {
    return { __await: arg };
  };

  function AsyncIterator(generator) {
    function invoke(method, arg, resolve, reject) {
      var record = tryCatch(generator[method], generator, arg);
      if (record.type === "throw") {
        reject(record.arg);
      } else {
        var result = record.arg;
        var value = result.value;
        if (value &&
            typeof value === "object" &&
            hasOwn.call(value, "__await")) {
          return Promise.resolve(value.__await).then(function(value) {
            invoke("next", value, resolve, reject);
          }, function(err) {
            invoke("throw", err, resolve, reject);
          });
        }

        return Promise.resolve(value).then(function(unwrapped) {
          // When a yielded Promise is resolved, its final value becomes
          // the .value of the Promise<{value,done}> result for the
          // current iteration. If the Promise is rejected, however, the
          // result for this iteration will be rejected with the same
          // reason. Note that rejections of yielded Promises are not
          // thrown back into the generator function, as is the case
          // when an awaited Promise is rejected. This difference in
          // behavior between yield and await is important, because it
          // allows the consumer to decide what to do with the yielded
          // rejection (swallow it and continue, manually .throw it back
          // into the generator, abandon iteration, whatever). With
          // await, by contrast, there is no opportunity to examine the
          // rejection reason outside the generator function, so the
          // only option is to throw it from the await expression, and
          // let the generator function handle the exception.
          result.value = unwrapped;
          resolve(result);
        }, reject);
      }
    }

    var previousPromise;

    function enqueue(method, arg) {
      function callInvokeWithMethodAndArg() {
        return new Promise(function(resolve, reject) {
          invoke(method, arg, resolve, reject);
        });
      }

      return previousPromise =
        // If enqueue has been called before, then we want to wait until
        // all previous Promises have been resolved before calling invoke,
        // so that results are always delivered in the correct order. If
        // enqueue has not been called before, then it is important to
        // call invoke immediately, without waiting on a callback to fire,
        // so that the async generator function has the opportunity to do
        // any necessary setup in a predictable way. This predictability
        // is why the Promise constructor synchronously invokes its
        // executor callback, and why async functions synchronously
        // execute code before the first await. Since we implement simple
        // async functions in terms of async generators, it is especially
        // important to get this right, even though it requires care.
        previousPromise ? previousPromise.then(
          callInvokeWithMethodAndArg,
          // Avoid propagating failures to Promises returned by later
          // invocations of the iterator.
          callInvokeWithMethodAndArg
        ) : callInvokeWithMethodAndArg();
    }

    // Define the unified helper method that is used to implement .next,
    // .throw, and .return (see defineIteratorMethods).
    this._invoke = enqueue;
  }

  defineIteratorMethods(AsyncIterator.prototype);
  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
    return this;
  };
  runtime.AsyncIterator = AsyncIterator;

  // Note that simple async functions are implemented on top of
  // AsyncIterator objects; they just return a Promise for the value of
  // the final result produced by the iterator.
  runtime.async = function(innerFn, outerFn, self, tryLocsList) {
    var iter = new AsyncIterator(
      wrap(innerFn, outerFn, self, tryLocsList)
    );

    return runtime.isGeneratorFunction(outerFn)
      ? iter // If outerFn is a generator, return the full iterator.
      : iter.next().then(function(result) {
          return result.done ? result.value : iter.next();
        });
  };

  function makeInvokeMethod(innerFn, self, context) {
    var state = GenStateSuspendedStart;

    return function invoke(method, arg) {
      if (state === GenStateExecuting) {
        throw new Error("Generator is already running");
      }

      if (state === GenStateCompleted) {
        if (method === "throw") {
          throw arg;
        }

        // Be forgiving, per 25.3.3.3.3 of the spec:
        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
        return doneResult();
      }

      context.method = method;
      context.arg = arg;

      while (true) {
        var delegate = context.delegate;
        if (delegate) {
          var delegateResult = maybeInvokeDelegate(delegate, context);
          if (delegateResult) {
            if (delegateResult === ContinueSentinel) continue;
            return delegateResult;
          }
        }

        if (context.method === "next") {
          // Setting context._sent for legacy support of Babel's
          // function.sent implementation.
          context.sent = context._sent = context.arg;

        } else if (context.method === "throw") {
          if (state === GenStateSuspendedStart) {
            state = GenStateCompleted;
            throw context.arg;
          }

          context.dispatchException(context.arg);

        } else if (context.method === "return") {
          context.abrupt("return", context.arg);
        }

        state = GenStateExecuting;

        var record = tryCatch(innerFn, self, context);
        if (record.type === "normal") {
          // If an exception is thrown from innerFn, we leave state ===
          // GenStateExecuting and loop back for another invocation.
          state = context.done
            ? GenStateCompleted
            : GenStateSuspendedYield;

          if (record.arg === ContinueSentinel) {
            continue;
          }

          return {
            value: record.arg,
            done: context.done
          };

        } else if (record.type === "throw") {
          state = GenStateCompleted;
          // Dispatch the exception by looping back around to the
          // context.dispatchException(context.arg) call above.
          context.method = "throw";
          context.arg = record.arg;
        }
      }
    };
  }

  // Call delegate.iterator[context.method](context.arg) and handle the
  // result, either by returning a { value, done } result from the
  // delegate iterator, or by modifying context.method and context.arg,
  // setting context.delegate to null, and returning the ContinueSentinel.
  function maybeInvokeDelegate(delegate, context) {
    var method = delegate.iterator[context.method];
    if (method === undefined) {
      // A .throw or .return when the delegate iterator has no .throw
      // method always terminates the yield* loop.
      context.delegate = null;

      if (context.method === "throw") {
        if (delegate.iterator.return) {
          // If the delegate iterator has a return method, give it a
          // chance to clean up.
          context.method = "return";
          context.arg = undefined;
          maybeInvokeDelegate(delegate, context);

          if (context.method === "throw") {
            // If maybeInvokeDelegate(context) changed context.method from
            // "return" to "throw", let that override the TypeError below.
            return ContinueSentinel;
          }
        }

        context.method = "throw";
        context.arg = new TypeError(
          "The iterator does not provide a 'throw' method");
      }

      return ContinueSentinel;
    }

    var record = tryCatch(method, delegate.iterator, context.arg);

    if (record.type === "throw") {
      context.method = "throw";
      context.arg = record.arg;
      context.delegate = null;
      return ContinueSentinel;
    }

    var info = record.arg;

    if (! info) {
      context.method = "throw";
      context.arg = new TypeError("iterator result is not an object");
      context.delegate = null;
      return ContinueSentinel;
    }

    if (info.done) {
      // Assign the result of the finished delegate to the temporary
      // variable specified by delegate.resultName (see delegateYield).
      context[delegate.resultName] = info.value;

      // Resume execution at the desired location (see delegateYield).
      context.next = delegate.nextLoc;

      // If context.method was "throw" but the delegate handled the
      // exception, let the outer generator proceed normally. If
      // context.method was "next", forget context.arg since it has been
      // "consumed" by the delegate iterator. If context.method was
      // "return", allow the original .return call to continue in the
      // outer generator.
      if (context.method !== "return") {
        context.method = "next";
        context.arg = undefined;
      }

    } else {
      // Re-yield the result returned by the delegate method.
      return info;
    }

    // The delegate iterator is finished, so forget it and continue with
    // the outer generator.
    context.delegate = null;
    return ContinueSentinel;
  }

  // Define Generator.prototype.{next,throw,return} in terms of the
  // unified ._invoke helper method.
  defineIteratorMethods(Gp);

  Gp[toStringTagSymbol] = "Generator";

  // A Generator should always return itself as the iterator object when the
  // @@iterator function is called on it. Some browsers' implementations of the
  // iterator prototype chain incorrectly implement this, causing the Generator
  // object to not be returned from this call. This ensures that doesn't happen.
  // See https://github.com/facebook/regenerator/issues/274 for more details.
  Gp[iteratorSymbol] = function() {
    return this;
  };

  Gp.toString = function() {
    return "[object Generator]";
  };

  function pushTryEntry(locs) {
    var entry = { tryLoc: locs[0] };

    if (1 in locs) {
      entry.catchLoc = locs[1];
    }

    if (2 in locs) {
      entry.finallyLoc = locs[2];
      entry.afterLoc = locs[3];
    }

    this.tryEntries.push(entry);
  }

  function resetTryEntry(entry) {
    var record = entry.completion || {};
    record.type = "normal";
    delete record.arg;
    entry.completion = record;
  }

  function Context(tryLocsList) {
    // The root entry object (effectively a try statement without a catch
    // or a finally block) gives us a place to store values thrown from
    // locations where there is no enclosing try statement.
    this.tryEntries = [{ tryLoc: "root" }];
    tryLocsList.forEach(pushTryEntry, this);
    this.reset(true);
  }

  runtime.keys = function(object) {
    var keys = [];
    for (var key in object) {
      keys.push(key);
    }
    keys.reverse();

    // Rather than returning an object with a next method, we keep
    // things simple and return the next function itself.
    return function next() {
      while (keys.length) {
        var key = keys.pop();
        if (key in object) {
          next.value = key;
          next.done = false;
          return next;
        }
      }

      // To avoid creating an additional object, we just hang the .value
      // and .done properties off the next function object itself. This
      // also ensures that the minifier will not anonymize the function.
      next.done = true;
      return next;
    };
  };

  function values(iterable) {
    if (iterable) {
      var iteratorMethod = iterable[iteratorSymbol];
      if (iteratorMethod) {
        return iteratorMethod.call(iterable);
      }

      if (typeof iterable.next === "function") {
        return iterable;
      }

      if (!isNaN(iterable.length)) {
        var i = -1, next = function next() {
          while (++i < iterable.length) {
            if (hasOwn.call(iterable, i)) {
              next.value = iterable[i];
              next.done = false;
              return next;
            }
          }

          next.value = undefined;
          next.done = true;

          return next;
        };

        return next.next = next;
      }
    }

    // Return an iterator with no values.
    return { next: doneResult };
  }
  runtime.values = values;

  function doneResult() {
    return { value: undefined, done: true };
  }

  Context.prototype = {
    constructor: Context,

    reset: function(skipTempReset) {
      this.prev = 0;
      this.next = 0;
      // Resetting context._sent for legacy support of Babel's
      // function.sent implementation.
      this.sent = this._sent = undefined;
      this.done = false;
      this.delegate = null;

      this.method = "next";
      this.arg = undefined;

      this.tryEntries.forEach(resetTryEntry);

      if (!skipTempReset) {
        for (var name in this) {
          // Not sure about the optimal order of these conditions:
          if (name.charAt(0) === "t" &&
              hasOwn.call(this, name) &&
              !isNaN(+name.slice(1))) {
            this[name] = undefined;
          }
        }
      }
    },

    stop: function() {
      this.done = true;

      var rootEntry = this.tryEntries[0];
      var rootRecord = rootEntry.completion;
      if (rootRecord.type === "throw") {
        throw rootRecord.arg;
      }

      return this.rval;
    },

    dispatchException: function(exception) {
      if (this.done) {
        throw exception;
      }

      var context = this;
      function handle(loc, caught) {
        record.type = "throw";
        record.arg = exception;
        context.next = loc;

        if (caught) {
          // If the dispatched exception was caught by a catch block,
          // then let that catch block handle the exception normally.
          context.method = "next";
          context.arg = undefined;
        }

        return !! caught;
      }

      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        var record = entry.completion;

        if (entry.tryLoc === "root") {
          // Exception thrown outside of any try block that could handle
          // it, so set the completion value of the entire function to
          // throw the exception.
          return handle("end");
        }

        if (entry.tryLoc <= this.prev) {
          var hasCatch = hasOwn.call(entry, "catchLoc");
          var hasFinally = hasOwn.call(entry, "finallyLoc");

          if (hasCatch && hasFinally) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            } else if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }

          } else if (hasCatch) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            }

          } else if (hasFinally) {
            if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }

          } else {
            throw new Error("try statement without catch or finally");
          }
        }
      }
    },

    abrupt: function(type, arg) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.tryLoc <= this.prev &&
            hasOwn.call(entry, "finallyLoc") &&
            this.prev < entry.finallyLoc) {
          var finallyEntry = entry;
          break;
        }
      }

      if (finallyEntry &&
          (type === "break" ||
           type === "continue") &&
          finallyEntry.tryLoc <= arg &&
          arg <= finallyEntry.finallyLoc) {
        // Ignore the finally entry if control is not jumping to a
        // location outside the try/catch block.
        finallyEntry = null;
      }

      var record = finallyEntry ? finallyEntry.completion : {};
      record.type = type;
      record.arg = arg;

      if (finallyEntry) {
        this.method = "next";
        this.next = finallyEntry.finallyLoc;
        return ContinueSentinel;
      }

      return this.complete(record);
    },

    complete: function(record, afterLoc) {
      if (record.type === "throw") {
        throw record.arg;
      }

      if (record.type === "break" ||
          record.type === "continue") {
        this.next = record.arg;
      } else if (record.type === "return") {
        this.rval = this.arg = record.arg;
        this.method = "return";
        this.next = "end";
      } else if (record.type === "normal" && afterLoc) {
        this.next = afterLoc;
      }

      return ContinueSentinel;
    },

    finish: function(finallyLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.finallyLoc === finallyLoc) {
          this.complete(entry.completion, entry.afterLoc);
          resetTryEntry(entry);
          return ContinueSentinel;
        }
      }
    },

    "catch": function(tryLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.tryLoc === tryLoc) {
          var record = entry.completion;
          if (record.type === "throw") {
            var thrown = record.arg;
            resetTryEntry(entry);
          }
          return thrown;
        }
      }

      // The context.catch method must only be called with a location
      // argument that corresponds to a known catch block.
      throw new Error("illegal catch attempt");
    },

    delegateYield: function(iterable, resultName, nextLoc) {
      this.delegate = {
        iterator: values(iterable),
        resultName: resultName,
        nextLoc: nextLoc
      };

      if (this.method === "next") {
        // Deliberately forget the last sent value so that we don't
        // accidentally pass it on to the delegate.
        this.arg = undefined;
      }

      return ContinueSentinel;
    }
  };
})(
  // In sloppy mode, unbound `this` refers to the global object, fallback to
  // Function constructor if we're in global strict mode. That is sadly a form
  // of indirect eval which violates Content Security Policy.
  (function() { return this })() || Function("return this")()
);
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Modal; });


function Modal(options) {

  if (!options) return;

  this.__parseOptions(options);

  if (!window.ModalCount__QasRfmwORkdasRs) window.ModalCount__QasRfmwORkdasRs = 0;

  if (!window.AfmJdnJREQjos__modalStyles) this.__styles();
  if (this.hash) this.__hashListener();

  this.__resizes();
}

Modal.prototype.open = function (options) {

  if (this.closing || this.opening) return Promise.reject();
  if (this.__opened) return Promise.reject();
  this.__dinamic && this.element(this.__query);
  if (!this.__el) {
    this.opening = null;
    throw new Error("Не задан элемент ~ element:'.asd' || element:document.querySelector('.asd') ~ ");
  }
  if (window.__ModalOpen__AdaNHRGUWundqU == this.__el) return Promise.reject();
  this.opening = true;
  window.__ModalOpen__AdaNHRGUWundqU = this.__el;


  document.body.style.width = document.documentElement.clientWidth + 'px';
  document.body.style.overflow = 'hidden';
  this.__scrollbarSize = document.documentElement.clientWidth - document.body.clientWidth;

  if (this.__modalStyle) {
    for (var variable in this.__modalStyle) {
      this.__el.style[variable] = this.__modalStyle[variable];
    }
  }
  options && this.__parseOptions(options);
  this.__openCallback && this.__openCallback();
  this.__setBg();
  var _this = this;
  return this.__showElement().then(function () {

    _this.__buttonsListener = function (e) {
      if (e.target.closest('.modal__close')) {
        this.close();
        this.__el.removeEventListener('click', this.__buttonsListener);
      }
    }.bind(_this);

    _this.__el.addEventListener('click', _this.__buttonsListener);

    if (_this.hash) location.hash = _this.hash;
    _this.__opened = true;
    _this.opening = null;
    _this.__afterOpenCallback && _this.__afterOpenCallback();
  });
};

Modal.prototype.close = function (options) {
  var _this = this;
  options && this.__parseOptions(options);

  if (this.closing || this.opening) {

    return new Promise(function (resolve, reject) {

      if (_this.timeout) clearTimeout(_this.timeout);

      _this.timeout = setTimeout(function () {
        resolve();
        _this.__el.removeEventListener('transitionend', transitionEndF);
        console.warn('Авайрийное закрытие попапа. Не правильно сработал скрипт закрытия. Необходимо разобраться.', new Error().stack);
        _this.__bg.remove();
        window.__ModalOpen__AdaNHRGUWundqU = null;
        _this.__el.style.display = '';
        _this.__el.style.opacity = '';
        _this.__opened = false;
        _this.opening = null;
        _this.closing = null;
      }, 3000);

      function transitionEndF() {
        requestAnimationFrame(function () {
          requestAnimationFrame(function () {

            _this.close().then(function () {
              resolve();
              clearTimeout(_this.timeout);
            }, function () {
            });
          });
        });
        _this.__el.removeEventListener('transitionend', transitionEndF);
      }

      _this.__el.addEventListener('transitionend', transitionEndF);
    });
  }

  if (!this.__opened) return Promise.reject();
  this.closing = true;
  window.__ModalOpen__AdaNHRGUWundqU = null;
  this.__closeCallback && this.__closeCallback();
  this.__bg.classList.remove('modal--open');
  this.__bg.addEventListener('transitionend', function () {
    _this.__bg.remove();
  });
  return this.__hideElement().then(function () {
    document.body.style.width = '';
    document.body.style.overflow = '';
    _this.__el.removeEventListener('click', _this.__buttonsListener);
    if (_this.hash && _this.hash == location.hash) {
      history.replaceState({}, document.title, location.pathname.replace(/#/, ''));
      // window.dispatchEvent(new Event('hashchange'));
    }
    _this.__opened = false;
    _this.closing = null;
    _this.__afterCloseCallback && _this.__afterCloseCallback();
  });
};

Modal.prototype.toggle = function (options) {
  options && this.__parseOptions(options);
  return this.__opened ? this.close() : this.open();
};
Modal.open = function (element, options) {
  if (!window.ModalCount__QasRfmwORkdasRs) window.ModalCount__QasRfmwORkdasRs = 0;

  //bg
  var bg = document.createElement('div');
  bg.classList.add('modal--bg');
  bg.dataset.modalId = element.id;
  bg.style.zIndex = '900' + window.ModalCount__QasRfmwORkdasRs++;

  requestAnimationFrame(function () {
    requestAnimationFrame(function () {
      bg.classList.add('modal--open');
    });
  });
  bg.addEventListener('click', function (e) {

    bg.classList.remove('modal--open');
    bg.addEventListener('transitionend', function () {
      bg.remove();
    });
  }, false);
  document.body.insertAdjacentElement('beforeend', bg);

  // el
  element.style.zIndex = '999' + window.ModalCount__QasRfmwORkdasRs++;
  element.style.display = 'flex';

  requestAnimationFrame(function () {
    requestAnimationFrame(function () {
      element.style.transform = 'translate(0,-50%) scale(1)';
      element.style.opacity = '1';
    });
  });
  new Promise(function (resolve, reject) {

    var a = function a(e) {
      element.style.transition = '';
      element.removeEventListener('transitionend', a);
      resolve();
    };
    element.addEventListener('transitionend', a, false);
  }).then(function () {});

  [].forEach.call(element.querySelectorAll('.modal__close'), function (button) {
    button.addEventListener('click', function () {
      bg.classList.remove('modal--open');
      bg.addEventListener('transitionend', function () {
        bg.remove();
      });
    });
  });
};
Modal.close = function (element, options) {

  var bg = document.querySelector('[data-modal-id="' + element.id + '"]');
  bg.classList.remove('modal--open');
};
// Modal.toggle = function(element, options){

// }

Modal.prototype.__setHeight = function (element) {
  if (!this.__el) return;
  let bottom = this.__el.style.bottom;
  this.__el.style.height = '';
  this.__el.style.bottom = '';
  let height = this.__el.scrollHeight;

  [].forEach.call( this.__el.children, (item) => {
    height += item.scrollHeight - item.clientHeight;
  });

  this.__el.style.height = height + 'px';
  this.__el.style.bottom = bottom;

}

Modal.prototype.__observer = function () {
  if (!this.__el) return;
  if (this._observerObj) {
    this._observerObj.disconnect();
  }

  this._observerObj = new MutationObserver(( mutations ) => {
    mutations.forEach((item,index) => {
      if (item.addedNodes.length || item.removedNodes.length) {
        this.__setHeight();
      }
    });
  });


  this._observerObj.observe(this.__el, {
    childList: true,
    subtree: true
  })
}

Modal.prototype.element = function (element) {
  if (!element) return this.__el;

  if (typeof element == 'string') {
    if (!this.formatedQuery) {

      if (element.indexOf('#') !== 0)
      element = element.substring(element.indexOf('#'));
      if (element.indexOf('%'))
      element = decodeURIComponent(element);
      //если не цифра и не буква
        //удаляем решетку из хэша
      if (element[1].toLowerCase() === element[1].toUpperCase())
        element = element.substring(1);
      this.formatedQuery = true;
    }
    this.__el = document.querySelector(element);
  } else if ('' + element == '[object HTMLCollection]') {
    this.__el = element[0];
  } else if (element instanceof Object) {
    this.__el = element;
  }
  this.__query = element;
  this.__observer();

  if (!element) throw new Error("Не задан элемент ~ element:'.asd' || element:document.querySelector('.asd') ~ ", this.__el);
};
Modal.prototype.__setBg = function () {
  this.__bg = document.createElement('div');
  this.__bg.classList.add('modal--bg');
  this.__bg.style.zIndex = '999' + window.ModalCount__QasRfmwORkdasRs++;

  if (this.__bgStyle) {
    for (var variable in this.__bgStyle) {
      this.__bg.style[variable] = this.__bgStyle[variable];
    }
  }

  var _this = this;

  requestAnimationFrame(function () {
    requestAnimationFrame(function () {
      _this.__bg.classList.add('modal--open');
    });
  });

  this.__bg.addEventListener('click', function (e) {
    _this.close.call(_this).then(function () {
      _this.__BGcloseCallback && _this.__BGcloseCallback();
    }, function () {});
  }, false);

  this.__el.insertAdjacentElement('beforebegin', this.__bg);
};
Modal.prototype.__showElement = function () {
  var _this = this;

  this.__el.style.zIndex = '999' + window.ModalCount__QasRfmwORkdasRs++;
  this.__el.style.display = 'flex';
  this.__setHeight();
  this.__el.style.top = '0';
  this.__el.style.bottom = '0';
  this.__el.style.transition = 'bottom .3s ease,opacity .3s ease,transform .3s ease';

  requestAnimationFrame(function () {
    requestAnimationFrame(function () {
      _this.__el.style.bottom = '3%';
      _this.__el.style.transform = 'scale(1)';
      _this.__el.style.opacity = '1';
    });
  });

  return new Promise(function (resolve, reject) {

    var a = function a(e) {
      _this.__el.removeEventListener('transitionend', a);
      resolve();
    };
    _this.__el.addEventListener('transitionend', a, false);
  });
};
Modal.prototype.__hideElement = function () {
  var _this = this;

  this.__el.style.transform = '';
  this.__el.style.opacity = '0';
  _this.__el.style.bottom = '0';

  return new Promise(function (resolve, reject) {
    function hide(e) {

      resolve();
      _this.__el.removeEventListener('transitionend', hide);
      _this.__el.style.display = '';
      _this.__el.style.opacity = '';
      _this.__el.style.transition = '';
    }
    _this.__el.addEventListener('transitionend', hide, false);
  });
};

Modal.prototype.__parseOptions = function (options) {

  if (options.tagName || typeof options == 'string') {
    this.element(options);
    return;
  };
  options.element && this.element(options.element);

  if (options.open !== undefined) this.__openCallback = options.open;

  if (options.close !== undefined) this.__closeCallback = options.close;

  if (options.BGclose !== undefined) this.__BGcloseCallback = options.BGclose;

  if (options.afterOpen !== undefined) this.__afterOpenCallback = options.afterOpen;

  if (options.afterClose !== undefined) this.__afterCloseCallback = options.afterClose;

  if (options.hash !== undefined) {

    if (options.hash === true) {
      if (typeof this.__query == 'string' && /#/.test(this.__query)) {

        if (+this.__query[1] !== +this.__query[1] || this.__query[1].toLowerCase() !== this.__query[1].toUpperCase())
          //удаляем решетку из хэша
          this.hash = this.__query.substring(this.__query.indexOf('#'));
        else
          this.hash = this.__query;
      }
    } else {
      if (+options.hash[1] !== +options.hash[1] || options.hash[1].toLowerCase() !== options.hash[1].toUpperCase())
        //удаляем решетку из хэша
        this.hash = options.hash.substring(options.hash.indexOf('#'));
      else
        this.hash = options.hash;
    }
    if (!this.__hashListenerBinded) {
      this.__hashListenerBinded = this.__hashListener.bind(this);
      window.addEventListener("hashchange", this.__hashListenerBinded);
    }
  }

  if (options.modalStyle) this.__modalStyle = options.modalStyle;

  if (options.bgStyle) this.__bgStyle = options.bgStyle;

  if (options.dinamic !== undefined) this.__dinamic = options.dinamic;
};

Modal.prototype.__hashListener = function (options) {

  if (this.hash == location.hash && !this.__opened) {
    this.open();
  } else if (this.hash != location.hash && this.__opened) {
    this.close();
  }
};

Modal.prototype.__styles = function () {
  window.AfmJdnJREQjos__modalStyles = true;
  var styles = document.createElement('style');
  styles.innerHTML = `
  .modal--bg {
    position: fixed;
    will-change: opacity;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    background-color: rgba(255,255,255,.9);
    opacity: 0;
    transition: all .2s ease .1s;
  }

  @supports (-webkit-backdrop-filter: blur(20px)) or (backdrop-filter: blur(20px)) {
    .modal--bg {
      -webkit-backdrop-filter: blur(20px);
      backdrop-filter: blur(20px);
      background-color: rgba(255,255,255,.0);
    }
  }
  .modal--bg.modal--open {
    opacity: 1;
    top:0;
    transition: all .3s ease .1s;
  }
  .modal {
    color:#333;
    background: #fff;
    position: fixed;
    top: 5%;
    left: 0%;
    right: 0%;
    will-change: transform, top, opacity;
    display: none;
    opacity: 0;
    width: 55%;
    min-height: 177px;
    max-width: 1000px;
    max-height: 90%;
    height:auto;
    padding: 0;
    transform: scale(.9, 1);
    margin: auto;
    border-radius: 6px;
    box-sizing: border-box ;
    box-shadow: 0 10px 32px rgba(0, 0, 0, 0.15);
    box-shadow: 0 16px 28px 0 rgba(0, 0, 0, 0.22), 0 25px 55px 0 rgba(0, 0, 0, 0.21);
    overflow: hidden;
    flex-direction:column;
  }
  .modal__content {
    min-height: 120px;
    max-height:400px;
    max-height: 90vh;
    margin: 0;
    overflow-y: auto;
    padding: 30px;
    box-sizing: border-box;
    order:1;
  }
  .modal__footer {
    order:2;
    display: flex;
    margin: 0 10px;
    padding:0 6px;
    height: 56px;
    min-height: 56px;
    margin-top:-56px;
    align-items: center;
    justify-content: space-between;
    border-top: 1px solid #e0e0e0;
  }
  .modal__footer .btn {
    font-size: .85rem;
    display: flex;
    align-items: center;
  }
  .modal__footer ~ .modal__content {
    max-height: calc(90vh - 56px);
    margin-bottom: 56px;
  }

  @media (max-width:1000px) {
    .modal {
      width: 65%;
      max-width: 1000px;
    }
  }
  @media (max-width:800px) {
    .modal {
      width: 65%;
      max-width: 1000px;
    }
  }
  @media (max-width:600px) {
    .modal {
      width: 75%;
      max-width: 1000px;
    }
  }
  @media (max-width:480px) {
    .modal {
      width: 85%;
      max-width: 1000px;
    }
  }
  @media (max-width:360px) {
    .modal {
      width: 95%;
    }
  }
  `;
  document.body.append(styles);
};

Modal.prototype.__resizes = function(){
  this._resizeFn && removeEventListener('resize', this._resizeFn)
  var _this = this;
  this._resizeFn = function(event) {
    _this.__setHeight();
    if (_this.__opened) {
      document.body.style.width = document.documentElement.clientWidth - (this.__scrollbarSize || 15) + 'px';
    }
  };

  addEventListener( 'resize', this._resizeFn);
}

;+function () {
  addEventListener('DOMContentLoaded', function () {

    var elements = document.querySelectorAll('.modal__trigger');

    for (var i = 0; i < elements.length; i++) {
      var href = elements[i].getAttribute('href');
      var options = {
        element: href,
        hash: href
      };
      if (elements[i].classList.contains('modal__dinamic')) options.dinamic = true;
      new Modal(options);
    }
  });
}();


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"));

var _swiper = _interopRequireDefault(__webpack_require__(/*! swiper/dist/js/swiper.js */ "./node_modules/swiper/dist/js/swiper.js"));

var _popupWindowModule = _interopRequireDefault(__webpack_require__(/*! popup-window-module */ "./node_modules/popup-window-module/index.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _next(value) { step("next", value); } function _throw(err) { step("throw", err); } _next(); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _default =
/*#__PURE__*/
function () {
  function _default(card, target) {
    _classCallCheck(this, _default);

    this.logic(card, target);
  }

  _createClass(_default, [{
    key: "generateModalHTML",
    value: function generateModalHTML() {
      var ModalEl = document.createElement('div');
      ModalEl.className = 'forPhoto';
      ModalEl.id = 'forPhoto';
      ModalEl.innerHTML = "\n\t\t\t<div class=\"forPhoto__content\">\n\n\t\t\t</div>\n\t\t";
      this.content = ModalEl.querySelector('.forPhoto__content');
      document.body.appendChild(ModalEl);
      return ModalEl;
    }
  }, {
    key: "logic",
    value: function () {
      var _logic = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee(card, target) {
        var _this = this;

        var el, initialSlide, data, galleryTop, galleryThumbs;
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                el = target.closest('.newsCard__image') || target.closest('.newsCard__head') || target.closest('.justifiedGallery'); //

                if (el) {
                  _context.next = 3;
                  break;
                }

                return _context.abrupt("return");

              case 3:
                initialSlide = target.closest('[data-slide]').dataset.slide || 0;
                console.log(initialSlide);
                this.el = this.generateModalHTML();
                _context.next = 8;
                return fetch(el.getAttribute('href'));

              case 8:
                data = _context.sent;
                _context.next = 11;
                return data.json();

              case 11:
                data = _context.sent;
                this.el.innerHTML = "\n\t\t<div class=\"swiper-container gallery-top\">\n\t\t\t<div class=\"swiper-wrapper\">\n\t\t\t\t".concat(data.map(function (item) {
                  return "\n\t\t\t\t\t\t<div class=\"swiper-slide\">\n\t\t\t\t\t\t\t<div class=\"forPhoto__slide\">\n\t\t\t\t\t\t\t\t<img src=\"".concat(item.image.thumb, "\" alt=\"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u043F\u043E\u0440\u0442\u043C\u043E\u043D\u0435\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t");
                }).join(''), "\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"swiper-container gallery-bottom\">\n\t\t\t<div class=\"forPhoto__close\"></div>\n\t\t\t<div class=\"swiper-wrapper\">\n\t\t\t\t").concat(data.map(function (item) {
                  return "\n\t\t\t\t\t\t<div class=\"swiper-slide\">\n\t\t\t\t\t\t\t<div class=\"forPhoto__slide\">\n\t\t\t\t\t\t\t\t<img src=\"".concat(item.image.normal, "\" alt=\"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u043F\u043E\u0440\u0442\u043C\u043E\u043D\u0435\" />\n\t\t\t\t\t\t\t\t<div class=\"forPhoto__content\">\n\t\t\t\t\t\t\t\t\t<div class=\"sectionName\">").concat(item.title, "</div>\n\t\t\t\t\t\t\t\t\t<div class=\"\">").concat(item.album, "</div>\n\t\t\t\t\t\t\t\t\t<div class=\"\">").concat(item.description, "</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t");
                }).join(''), "\n\t\t\t</div>\n\t\t</div>\n\t\t");
                this.el.querySelector('.forPhoto__close').addEventListener('click', function (event) {
                  _this.destroy();
                });
                ;
                galleryTop = new _swiper.default('.gallery-top', {
                  spaceBetween: 10,
                  initialSlide: initialSlide,
                  centeredSlides: true,
                  slidesPerView: 'auto',
                  touchRatio: .2,
                  slideToClickedSlide: true
                });
                galleryThumbs = new _swiper.default('.gallery-bottom', {
                  spaceBetween: 10,
                  initialSlide: initialSlide,
                  navigation: {
                    nextEl: '.swiper-button-next',
                    prevEl: '.swiper-button-prev'
                  },
                  pagination: {
                    el: '.swiper-pagination'
                  }
                });
                galleryTop.controller.control = galleryThumbs;
                galleryThumbs.controller.control = galleryTop;

              case 19:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      return function logic(_x, _x2) {
        return _logic.apply(this, arguments);
      };
    }()
  }, {
    key: "destroy",
    value: function destroy() {
      this.el.remove();
      this.el = null;
    }
  }]);

  return _default;
}(); // {
// 	title: 'Название',
// 	description: 'Описание',
// 	album: 'Название альбома',
// 	image: {
// 		width: '4000',
// 		height: '3000',
// 		thumb: '/adfafa.jpg',
// 		normal: '/zdfagag',
// 		original: '/fdfadfa',
// 		extension: 'jpg',
// 		originalName: 'Можно еще передать оригинальное название файла, незнаю зачем'
// 	}
// }


exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _animation = _interopRequireDefault(__webpack_require__(/*! ../../../layout/js/animation.js */ "./src/layout/js/animation.js"));

var _click = _interopRequireDefault(__webpack_require__(/*! ../../../layout/js/click.js */ "./src/layout/js/click.js"));

var _customListener = _interopRequireDefault(__webpack_require__(/*! ../../../layout/js/customListener.js */ "./src/layout/js/customListener.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var Ball =
/*#__PURE__*/
function (_Animation) {
  _inherits(Ball, _Animation);

  function Ball() {
    var _this;

    _classCallCheck(this, Ball);

    _this = _possibleConstructorReturn(this, (Ball.__proto__ || Object.getPrototypeOf(Ball)).call(this));
    _this.__balls = {};

    var a = _toConsumableArray(document.querySelectorAll('[data-click-ball]'));

    a.forEach(function (item) {
      return _this.initBall(item);
    });
    return _this;
  }

  _createClass(Ball, [{
    key: "initBall",
    value: function initBall(item) {
      var _this2 = this;

      var scrollToTop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
      var Name = item.dataset.clickBall;
      var container = document.querySelector("[data-ball-click=\"".concat(Name, "\"]"));
      var bg = container.querySelector('div');

      var fn = function fn(event) {
        if (event.target.closest('.newsCard__tag')) {
          return;
        }

        var windowWidth = document.documentElement.clientWidth;
        document.body.style.width = document.documentElement.clientWidth + 'px';
        document.body.style.overflow = 'hidden';
        var scrollBar = document.documentElement.clientWidth - windowWidth;
        _this2.resizeListener = new _customListener.default({
          listener: 'resize',
          callback: function callback() {
            document.body.style.width = document.documentElement.offsetWidth - scrollBar + 'px';
          }
        });
        var x = event.x,
            y = event.y;
        var scroll = window.pageYOffset;
        _this2.__balls[Name] = {
          container: container,
          bg: bg,
          close: container.querySelector('[data-ball-close]'),
          scroll: scroll,
          x: x,
          y: y
        };
        requestAnimationFrame(function () {
          container.style.display = 'block';
          container.style.top = y + 'px';
          container.style.left = x + 'px';
          bg.style.left = -x + 'px';
          bg.style.top = -y + 'px';

          if (scrollToTop) {
            window.dispatchEvent(new CustomEvent('scrollToTop'));
          }

          _this2.openContainer(Name);
        });

        _this2.videoSettings(Name);
      };

      item.addEventListener('click', fn);
      return fn;
    }
  }, {
    key: "openContainer",
    value: function openContainer(Name) {
      var _this3 = this;

      var _balls$Name = this.__balls[Name],
          container = _balls$Name.container,
          x = _balls$Name.x,
          y = _balls$Name.y,
          bg = _balls$Name.bg,
          scroll = _balls$Name.scroll,
          close = _balls$Name.close;
      var start = Date.now();
      var _document$documentEle = document.documentElement,
          clientWidth = _document$documentEle.clientWidth,
          clientHeight = _document$documentEle.clientHeight;
      var Size = Math.sqrt(Math.pow(clientWidth, 2) + Math.pow(clientHeight, 2)) * 2;

      var animate = function animate() {
        var progress = _this3.__progress(start, 1000);

        var progressSize = Size * progress;
        container.style.width = progressSize + 'px';
        container.style.height = progressSize + 'px';
        var top = y + (clientHeight / 2 - y - Size / 2) * progress;
        var left = x + (clientWidth / 2 - x - Size / 2) * progress;
        container.style.top = top + 'px';
        container.style.left = left + 'px';
        bg.style.top = -top + 'px';
        bg.style.left = -left + 'px';

        if (progress === 1) {
          var closeClickListener = new _click.default({
            element: close,
            callback: function callback() {
              _this3.closeContainer(Name);

              closeClickListener.end();
            }
          });
          return;
        }

        requestAnimationFrame(animate);
      };

      requestAnimationFrame(animate);
    }
  }, {
    key: "closeContainer",
    value: function closeContainer(Name) {
      var _this4 = this;

      var newScroll = window.pageYOffset;
      var _balls$Name2 = this.__balls[Name],
          container = _balls$Name2.container,
          scroll = _balls$Name2.scroll,
          close = _balls$Name2.close,
          bg = _balls$Name2.bg,
          video = _balls$Name2.video;

      if (video) {
        video.pause();
        this.videoListeners.forEach(function (item) {
          item.end();
        });
      }

      var _balls$Name3 = this.__balls[Name],
          x = _balls$Name3.x,
          y = _balls$Name3.y;
      y = scroll + y - newScroll;
      var start = Date.now();
      var _document$documentEle2 = document.documentElement,
          clientWidth = _document$documentEle2.clientWidth,
          clientHeight = _document$documentEle2.clientHeight;
      var Size = parseInt(getComputedStyle(container).width);

      var animate = function animate() {
        var progress = 1 - _this4.__progress(start, 500);

        var progressSize = Size * progress;
        container.style.width = progressSize + 'px';
        container.style.height = progressSize + 'px';
        var top = y + (clientHeight / 2 - y - Size / 2) * progress;
        var left = x + (clientWidth / 2 - x - Size / 2) * progress;
        container.style.top = top + 'px';
        container.style.left = left + 'px';
        bg.style.top = -top + 'px';
        bg.style.left = -left + 'px';

        if (progress === 0) {
          document.body.style.overflow = '';
          document.body.style.width = '';

          _this4.resizeListener.end();

          container.style.display = 'none';

          if (container.querySelector('iframe')) {
            var iframe = container.querySelector('iframe');
            var nextEl = iframe.nextElementSibling;
            iframe.parentNode.insertBefore(!iframe.remove() && iframe, nextEl);
          }

          return;
        }

        requestAnimationFrame(animate);
      };

      requestAnimationFrame(animate);
    }
  }, {
    key: "videoSettings",
    value: function videoSettings(Name) {
      var _this5 = this;

      this.videoListeners = [];
      var content = this.__balls[Name].bg;
      var video = content.querySelector('.video');
      if (!video) return;
      this.__balls[Name].video = video;
      var progress = content.querySelector('.video__progress-actual');
      var stopButton = content.querySelector('.video__stop');
      video.play().then(function () {
        function togglePlay() {
          if (status == 'played') {
            video.pause();
            status = 'stopped';
          } else if (status == 'stopped') {
            video.play();
            status = 'played';
          }
        }

        _this5.videoListeners.push(new _click.default({
          element: stopButton,
          callback: function callback() {
            togglePlay();
          }
        }));

        _this5.videoListeners.push(new _click.default({
          element: video,
          callback: function callback() {
            togglePlay();
          }
        }));

        _this5.videoListeners.push(new _customListener.default({
          element: video,
          listener: 'timeupdate',
          callback: _this5.videoSetProgress(video)
        }));

        var status = 'played';

        _this5.videoListeners.push(new _customListener.default({
          element: video,
          listener: 'play',
          callback: function callback() {
            status = 'played';
            stopButton.classList.remove('video__stop--stopped');
          }
        }));

        _this5.videoListeners.push(new _customListener.default({
          element: video,
          listener: 'pause',
          callback: function callback() {
            status = 'stopped';
            stopButton.classList.add('video__stop--stopped');
          }
        }));

        _this5.videoListeners.push(new _customListener.default({
          listener: 'keyup',
          callback: function callback(e) {
            if (e.which !== 32) return;
            stopButton.classList.add('video__stop--stopped');
            togglePlay();
          }
        }));

        _this5.videoListeners.push(new _click.default({
          element: content.getElementsByClassName('video__progress')[0],
          callback: function callback(e) {
            var x = e.x;
            var clickProgress = x / this.offsetWidth;
            video.currentTime = video.duration * clickProgress;
          }
        }));

        var mute = new _click.default({
          element: content.getElementsByClassName('video__mute')[0],
          callback: function callback() {
            if (!video.muted) {
              video.muted = true;
              mute.element.classList.add('video__mute--muted');
            } else {
              video.muted = false;
              mute.element.classList.remove('video__mute--muted');
            }
          }
        });

        _this5.videoListeners.push(mute);
      }).catch(function () {
        console.log('Не запустилось');
      });
    }
  }, {
    key: "videoSetProgress",
    value: function videoSetProgress(video) {
      var container = video.parentElement;
      var actualProgress = container.querySelector('.video__progress-actual');
      var actualTime = container.getElementsByClassName('video__actualTime')[0];
      var actualTime_minutes = actualTime.querySelector('.video__actualTime-minutes');
      var actualTime_seconds = actualTime.querySelector('.video__actualTime-seconds');
      var fullTime = container.getElementsByClassName('video__fullTime')[0];
      var fullTime_minutes = fullTime.querySelector('.video__fullTime-minutes');
      var fullTime_seconds = fullTime.querySelector('.video__fullTime-seconds');
      var fullMin = ~~(video.duration / 60);
      var fullSec = ~~(video.duration % 60);
      if (fullMin < 10) fullMin = '0' + fullMin;
      if (fullSec < 10) fullSec = '0' + fullSec;
      fullTime_minutes.textContent = fullMin;
      fullTime_seconds.textContent = fullSec;
      return function () {
        var progress = video.currentTime / video.duration;
        var actualMin = ~~(video.currentTime / 60);
        var actualSec = ~~(video.currentTime % 60);
        if (actualMin < 10) actualMin = '0' + actualMin;
        if (actualSec < 10) actualSec = '0' + actualSec;
        actualTime_minutes.textContent = actualMin;
        actualTime_seconds.textContent = actualSec;
        actualProgress.style.transition = 'width .2s linear';
        actualProgress.style.width = progress * 100 + '%';
      };
    }
  }]);

  return Ball;
}(_animation.default);

exports.default = Ball;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

// version 0.0.0
var Click =
/*#__PURE__*/
function () {
  function Click(options) {
    _classCallCheck(this, Click);

    this.element = options.element || window;
    this.callback = options.callback;
    this.parent = options.parent || null;
    this.Listener();
  }

  _createClass(Click, [{
    key: "Listener",
    value: function Listener() {
      this.element.addEventListener('click', this.callback);
    }
  }, {
    key: "end",
    value: function end() {
      this.element.removeEventListener('click', this.callback);
    }
  }]);

  return Click;
}();

exports.default = Click;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

// version 0.0.0
var _default =
/*#__PURE__*/
function () {
  function _default(options) {
    _classCallCheck(this, _default);

    this.element = options.element || window;
    this.callback = options.callback;
    this.listener = options.listener;
    this.parent = options.parent || null;
    this.Listener();
  }

  _createClass(_default, [{
    key: "Listener",
    value: function Listener() {
      this.element.addEventListener(this.listener, this.callback);
    }
  }, {
    key: "end",
    value: function end() {
      this.element.removeEventListener(this.listener, this.callback);
    }
  }]);

  return _default;
}();

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ball = _interopRequireDefault(__webpack_require__(/*! ../../../pages/title/js/ball.js */ "./src/pages/title/js/ball.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var ball = new _ball.default();
var templateNumber = 0;

var Video =
/*#__PURE__*/
function () {
  function Video(card, target, clickEvent) {
    _classCallCheck(this, Video);

    if (card.classList.contains('js-generatedClickBall')) return;

    var buttons = _toConsumableArray(card.querySelectorAll(['.newsCard__image', '.newsCard__head']));

    if (!target.closest('.newsCard__image') && !target.closest('.newsCard__head')) return;
    var templateString = target.closest('[data-video-string]');
    templateString = templateString && templateString.dataset.videoString;
    if (!templateString) return;
    card.dataset.clickBall = 'video' + templateNumber;
    var div = document.createElement('div');
    div.innerHTML = this.template(templateString);
    var element = div.firstElementChild;
    document.body.appendChild(element);
    div = null;
    card.classList.add('js-generatedClickBall');
    var fnOpen = ball.initBall(card, false);
    fnOpen(clickEvent);
  }

  _createClass(Video, [{
    key: "template",
    value: function template(string) {
      if (/iframe/.test(string)) return "\n\t\t\t\t<div data-ball-click=\"video".concat(templateNumber++, "\">\n\t\t\t\t\t<div style=\" background: #000;\">\n\t\t\t\t\t\t").concat(string, "\n\n\t\t\t\t\t\t<div class=\"container\">\n\t\t\t\t\t\t\t<div data-ball-close=\"video\"></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>");else return "\n\t\t\t\t<div data-ball-click=\"video".concat(templateNumber++, "\">\n\t\t\t\t\t<div style=\" background: #000;\">\n\n\t\t\t\t\t\t<video class=\"video\" preload=\"none\" width=\"1000px\" height=\"1000px\">\n\t\t\t\t\t\t\t<source src=\"").concat(string, "\" type=\"video/mp4\">\n\t\t\t\t\t\t</video>\n\n\t\t\t\t\t\t<div class=\"video__controls\">\n\t\t\t\t\t\t\t<div class=\"video__stop\"></div>\n\t\t\t\t\t\t\t<div class=\"video__mute\"></div>\n\t\t\t\t\t\t\t<div class=\"video__time\"><span class=\"video__actualTime\"><span class=\"video__actualTime-minutes\"></span>:<span class=\"video__actualTime-seconds\"></span></span>/<span class=\"video__fullTime\"><span class=\"video__fullTime-minutes\"></span>:<span class=\"video__fullTime-seconds\"></span></span></div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div class=\"video__progress\">\n\t\t\t\t\t\t\t<div class=\"video__progress-actual\"></div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div class=\"container\">\n\t\t\t\t\t\t\t<div data-ball-close=\"video\"></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>");
    }
  }]);

  return Video;
}();

exports.default = Video;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _default =
/*#__PURE__*/
function () {
  function _default() {
    _classCallCheck(this, _default);

    this.on();
  }

  _createClass(_default, [{
    key: "on",
    value: function on() {
      if ('serviceWorker' in navigator) {
        var unregWorkers = function unregWorkers() {
          var regs = navigator.serviceWorker.getRegistrations().then(function (arr) {
            arr.forEach(function (reg) {
              reg.unregister();
            });
          });
        };

        // Весь код регистрации у нас асинхронный.
        navigator.serviceWorker.register('/serviceWorkerLogic.js').then(function () {
          return navigator.serviceWorker.ready;
        }).catch(function (err) {
          return console.log(err);
        });
        window.del = unregWorkers;
      }
    }
  }]);

  return _default;
}();

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"));

var _popupWindowModule = _interopRequireDefault(__webpack_require__(/*! popup-window-module */ "./node_modules/popup-window-module/index.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _next(value) { step("next", value); } function _throw(err) { step("throw", err); } _next(); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _default =
/*#__PURE__*/
function () {
  function _default(card, target) {
    _classCallCheck(this, _default);

    this.logic(card, target);
  }

  _createClass(_default, [{
    key: "generateModalHTML",
    value: function generateModalHTML() {
      var ModalEl = document.createElement('div');
      ModalEl.className = 'PDFViewer modal';
      ModalEl.id = 'PDFViewer';
      document.body.appendChild(ModalEl);
      return ModalEl;
    }
  }, {
    key: "logic",
    value: function () {
      var _logic = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee(card, target) {
        var _this = this;

        var el;
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                el = target.closest('.newsCard__image') || target.closest('.newsCard__head');

                if (el) {
                  _context.next = 3;
                  break;
                }

                return _context.abrupt("return");

              case 3:
                this.el = this.generateModalHTML();
                this.el.innerHTML = "\n\t\t\t<div class=\"modal__footer\">\n\t\t\t\t<a class=\"modal__close\" href=\"".concat(el.getAttribute('href'), "\">\u0421\u043A\u0430\u0447\u0430\u0442\u044C</a>\n\t\t\t\t<a class=\"fullScreen\" >\u041F\u043E\u043B\u043D\u043E\u044D\u043A\u0440\u0430\u043D\u043D\u044B\u0439 \u0440\u0435\u0436\u0438\u043C</a>\n\t\t\t\t<div class=\"modal__close\" >\u0417\u0430\u043A\u0440\u044B\u0442\u044C</div>\n\t\t\t</div>\n\t\t\t<div class=\"modal__content\" style=\"padding:0;\">\n\t\t\t\t<iframe src=\"").concat(el.getAttribute('href'), "\" style=\"width: 100%; height: 100%;\" frameborder=\"0\">\n\t\t\t\t\t\u0424\u0430\u0439\u043B\u044B \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\n\t\t\t\t</iframe>\n\t\t\t</div>\n\t\t");
                new _popupWindowModule.default({
                  element: this.el,
                  afterClose: function afterClose() {
                    _this.destroy();
                  }
                }).open().then(function () {
                  var flscr = false;

                  var button = _this.el.querySelector('.fullScreen');

                  var originalText = button.innerText;
                  button.addEventListener('click', function (event) {
                    if (!flscr) {
                      flscr = true;
                      button.innerText = 'Уменьшить';
                      _this.el.style.maxWidth = '98%';
                      _this.el.style.width = '98%';
                      _this.el.style.maxHeight = '98%';
                      _this.el.style.height = '98%';
                      _this.el.querySelector('.modal__content').style.maxHeight = 'calc(98vh - 56px)';
                      _this.el.style.bottom = '1%';
                    } else {
                      flscr = false;
                      button.innerText = originalText;
                      _this.el.style.maxWidth = '';
                      _this.el.style.width = '';
                      _this.el.style.maxHeight = '';
                      _this.el.querySelector('.modal__content').style.maxHeight = '';
                      _this.el.style.bottom = '3%';
                    }
                  });
                });

              case 6:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      return function logic(_x, _x2) {
        return _logic.apply(this, arguments);
      };
    }()
  }, {
    key: "destroy",
    value: function destroy() {
      this.el.remove();
      this.el = null;
    }
  }]);

  return _default;
}();

exports.default = _default;var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
 * justifiedGallery - v3.7.0
 * http://miromannino.github.io/Justified-Gallery/
 * Copyright (c) 2018 Miro Mannino
 * Licensed under the MIT license.
 */
(function (factory) {
  if (true) {
    // AMD. Register as an anonymous module.
    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  } else {}
}(function ($) {

  /**
   * Justified Gallery controller constructor
   *
   * @param $gallery the gallery to build
   * @param settings the settings (the defaults are in JustifiedGallery.defaults)
   * @constructor
   */
  var JustifiedGallery = function ($gallery, settings) {

    this.settings = settings;
    this.checkSettings();

    this.imgAnalyzerTimeout = null;
    this.entries = null;
    this.buildingRow = {
      entriesBuff : [],
      width : 0,
      height : 0,
      aspectRatio : 0
    };
    this.lastFetchedEntry = null;
    this.lastAnalyzedIndex = -1;
    this.yield = {
      every : 2, // do a flush every n flushes (must be greater than 1)
      flushed : 0 // flushed rows without a yield
    };
    this.border = settings.border >= 0 ? settings.border : settings.margins;
    this.maxRowHeight = this.retrieveMaxRowHeight();
    this.suffixRanges = this.retrieveSuffixRanges();
    this.offY = this.border;
    this.rows = 0;
    this.spinner = {
      phase : 0,
      timeSlot : 150,
      $el : $('<div class="spinner"><span></span><span></span><span></span></div>'),
      intervalId : null
    };
    this.scrollBarOn = false;
    this.checkWidthIntervalId = null;
    this.galleryWidth = $gallery.width();
    this.$gallery = $gallery;

  };

  /** @returns {String} the best suffix given the width and the height */
  JustifiedGallery.prototype.getSuffix = function (width, height) {
    var longestSide, i;
    longestSide = (width > height) ? width : height;
    for (i = 0; i < this.suffixRanges.length; i++) {
      if (longestSide <= this.suffixRanges[i]) {
        return this.settings.sizeRangeSuffixes[this.suffixRanges[i]];
      }
    }
    return this.settings.sizeRangeSuffixes[this.suffixRanges[i - 1]];
  };

  /**
   * Remove the suffix from the string
   *
   * @returns {string} a new string without the suffix
   */
  JustifiedGallery.prototype.removeSuffix = function (str, suffix) {
    return str.substring(0, str.length - suffix.length);
  };

  /**
   * @returns {boolean} a boolean to say if the suffix is contained in the str or not
   */
  JustifiedGallery.prototype.endsWith = function (str, suffix) {
    return str.indexOf(suffix, str.length - suffix.length) !== -1;
  };

  /**
   * Get the used suffix of a particular url
   *
   * @param str
   * @returns {String} return the used suffix
   */
  JustifiedGallery.prototype.getUsedSuffix = function (str) {
    for (var si in this.settings.sizeRangeSuffixes) {
      if (this.settings.sizeRangeSuffixes.hasOwnProperty(si)) {
        if (this.settings.sizeRangeSuffixes[si].length === 0) continue;
        if (this.endsWith(str, this.settings.sizeRangeSuffixes[si])) return this.settings.sizeRangeSuffixes[si];
      }
    }
    return '';
  };

  /**
   * Given an image src, with the width and the height, returns the new image src with the
   * best suffix to show the best quality thumbnail.
   *
   * @returns {String} the suffix to use
   */
  JustifiedGallery.prototype.newSrc = function (imageSrc, imgWidth, imgHeight, image) {
    var newImageSrc;

    if (this.settings.thumbnailPath) {
      newImageSrc = this.settings.thumbnailPath(imageSrc, imgWidth, imgHeight, image);
    } else {
      var matchRes = imageSrc.match(this.settings.extension);
      var ext = (matchRes !== null) ? matchRes[0] : '';
      newImageSrc = imageSrc.replace(this.settings.extension, '');
      newImageSrc = this.removeSuffix(newImageSrc, this.getUsedSuffix(newImageSrc));
      newImageSrc += this.getSuffix(imgWidth, imgHeight) + ext;
    }

    return newImageSrc;
  };

  /**
   * Shows the images that is in the given entry
   *
   * @param $entry the entry
   * @param callback the callback that is called when the show animation is finished
   */
  JustifiedGallery.prototype.showImg = function ($entry, callback) {
    if (this.settings.cssAnimation) {
      $entry.addClass('entry-visible');
      if (callback) callback();
    } else {
      $entry.stop().fadeTo(this.settings.imagesAnimationDuration, 1.0, callback);
      $entry.find(this.settings.imgSelector).stop().fadeTo(this.settings.imagesAnimationDuration, 1.0, callback);
    }
  };

  /**
   * Extract the image src form the image, looking from the 'safe-src', and if it can't be found, from the
   * 'src' attribute. It saves in the image data the 'jg.originalSrc' field, with the extracted src.
   *
   * @param $image the image to analyze
   * @returns {String} the extracted src
   */
  JustifiedGallery.prototype.extractImgSrcFromImage = function ($image) {
    var imageSrc = (typeof $image.data('safe-src') !== 'undefined') ? $image.data('safe-src') : $image.attr('src');
    $image.data('jg.originalSrc', imageSrc);
    return imageSrc;
  };

  /** @returns {jQuery} the image in the given entry */
  JustifiedGallery.prototype.imgFromEntry = function ($entry) {
    var $img = $entry.find(this.settings.imgSelector);
    return $img.length === 0 ? null : $img;
  };

  /** @returns {jQuery} the caption in the given entry */
  JustifiedGallery.prototype.captionFromEntry = function ($entry) {
    var $caption = $entry.find('> .caption');
    return $caption.length === 0 ? null : $caption;
  };

  /**
   * Display the entry
   *
   * @param {jQuery} $entry the entry to display
   * @param {int} x the x position where the entry must be positioned
   * @param y the y position where the entry must be positioned
   * @param imgWidth the image width
   * @param imgHeight the image height
   * @param rowHeight the row height of the row that owns the entry
   */
  JustifiedGallery.prototype.displayEntry = function ($entry, x, y, imgWidth, imgHeight, rowHeight) {
    $entry.width(imgWidth);
    $entry.height(rowHeight);
    $entry.css('top', y);
    $entry.css('left', x);

    var $image = this.imgFromEntry($entry);
    if ($image !== null) {
      $image.css('width', imgWidth);
      $image.css('height', imgHeight);
      $image.css('margin-left', - imgWidth / 2);
      $image.css('margin-top', - imgHeight / 2);

      // Image reloading for an high quality of thumbnails
      var imageSrc = $image.attr('src');
      var newImageSrc = this.newSrc(imageSrc, imgWidth, imgHeight, $image[0]);

      $image.one('error', function () {
        $image.attr('src', $image.data('jg.originalSrc')); //revert to the original thumbnail, we got it.
      });

      var loadNewImage = function () {
        if (imageSrc !== newImageSrc) { //load the new image after the fadeIn
          $image.attr('src', newImageSrc);
        }
      };

      if ($entry.data('jg.loaded') === 'skipped') {
        this.onImageEvent(imageSrc, $.proxy(function() {
          this.showImg($entry, loadNewImage);
          $entry.data('jg.loaded', true);
        }, this));
      } else {
        this.showImg($entry, loadNewImage);
      }

    } else {
      this.showImg($entry);
    }

    this.displayEntryCaption($entry);
  };

  /**
   * Display the entry caption. If the caption element doesn't exists, it creates the caption using the 'alt'
   * or the 'title' attributes.
   *
   * @param {jQuery} $entry the entry to process
   */
  JustifiedGallery.prototype.displayEntryCaption = function ($entry) {
    var $image = this.imgFromEntry($entry);
    if ($image !== null && this.settings.captions) {
      var $imgCaption = this.captionFromEntry($entry);

      // Create it if it doesn't exists
      if ($imgCaption === null) {
        var caption = $image.attr('alt');
        if (!this.isValidCaption(caption)) caption = $entry.attr('title');
        if (this.isValidCaption(caption)) { // Create only we found something
          $imgCaption = $('<div class="caption">' + caption + '</div>');
          $entry.append($imgCaption);
          $entry.data('jg.createdCaption', true);
        }
      }

      // Create events (we check again the $imgCaption because it can be still inexistent)
      if ($imgCaption !== null) {
        if (!this.settings.cssAnimation) $imgCaption.stop().fadeTo(0, this.settings.captionSettings.nonVisibleOpacity);
        this.addCaptionEventsHandlers($entry);
      }
    } else {
      this.removeCaptionEventsHandlers($entry);
    }
  };

  /**
   * Validates the caption
   *
   * @param caption The caption that should be validated
   * @return {boolean} Validation result
   */
  JustifiedGallery.prototype.isValidCaption = function (caption) {
    return (typeof caption !== 'undefined' && caption.length > 0);
  };

  /**
   * The callback for the event 'mouseenter'. It assumes that the event currentTarget is an entry.
   * It shows the caption using jQuery (or using CSS if it is configured so)
   *
   * @param {Event} eventObject the event object
   */
  JustifiedGallery.prototype.onEntryMouseEnterForCaption = function (eventObject) {
    var $caption = this.captionFromEntry($(eventObject.currentTarget));
    if (this.settings.cssAnimation) {
      $caption.addClass('caption-visible').removeClass('caption-hidden');
    } else {
      $caption.stop().fadeTo(this.settings.captionSettings.animationDuration,
          this.settings.captionSettings.visibleOpacity);
    }
  };

  /**
   * The callback for the event 'mouseleave'. It assumes that the event currentTarget is an entry.
   * It hides the caption using jQuery (or using CSS if it is configured so)
   *
   * @param {Event} eventObject the event object
   */
  JustifiedGallery.prototype.onEntryMouseLeaveForCaption = function (eventObject) {
    var $caption = this.captionFromEntry($(eventObject.currentTarget));
    if (this.settings.cssAnimation) {
      $caption.removeClass('caption-visible').removeClass('caption-hidden');
    } else {
      $caption.stop().fadeTo(this.settings.captionSettings.animationDuration,
          this.settings.captionSettings.nonVisibleOpacity);
    }
  };

  /**
   * Add the handlers of the entry for the caption
   *
   * @param $entry the entry to modify
   */
  JustifiedGallery.prototype.addCaptionEventsHandlers = function ($entry) {
    var captionMouseEvents = $entry.data('jg.captionMouseEvents');
    if (typeof captionMouseEvents === 'undefined') {
      captionMouseEvents = {
        mouseenter: $.proxy(this.onEntryMouseEnterForCaption, this),
        mouseleave: $.proxy(this.onEntryMouseLeaveForCaption, this)
      };
      $entry.on('mouseenter', undefined, undefined, captionMouseEvents.mouseenter);
      $entry.on('mouseleave', undefined, undefined, captionMouseEvents.mouseleave);
      $entry.data('jg.captionMouseEvents', captionMouseEvents);
    }
  };

  /**
   * Remove the handlers of the entry for the caption
   *
   * @param $entry the entry to modify
   */
  JustifiedGallery.prototype.removeCaptionEventsHandlers = function ($entry) {
    var captionMouseEvents = $entry.data('jg.captionMouseEvents');
    if (typeof captionMouseEvents !== 'undefined') {
      $entry.off('mouseenter', undefined, captionMouseEvents.mouseenter);
      $entry.off('mouseleave', undefined, captionMouseEvents.mouseleave);
      $entry.removeData('jg.captionMouseEvents');
    }
  };

  /**
   * Clear the building row data to be used for a new row
   */
  JustifiedGallery.prototype.clearBuildingRow = function () {
    this.buildingRow.entriesBuff = [];
    this.buildingRow.aspectRatio = 0;
    this.buildingRow.width = 0;
  };

  /**
   * Justify the building row, preparing it to
   *
   * @param isLastRow
   * @returns a boolean to know if the row has been justified or not
   */
  JustifiedGallery.prototype.prepareBuildingRow = function (isLastRow) {
    var i, $entry, imgAspectRatio, newImgW, newImgH, justify = true;
    var minHeight = 0;
    var availableWidth = this.galleryWidth - 2 * this.border - (
        (this.buildingRow.entriesBuff.length - 1) * this.settings.margins);
    var rowHeight = availableWidth / this.buildingRow.aspectRatio;
    var defaultRowHeight = this.settings.rowHeight;
    var justifiable = this.buildingRow.width / availableWidth > this.settings.justifyThreshold;

    //Skip the last row if we can't justify it and the lastRow == 'hide'
    if (isLastRow && this.settings.lastRow === 'hide' && !justifiable) {
      for (i = 0; i < this.buildingRow.entriesBuff.length; i++) {
        $entry = this.buildingRow.entriesBuff[i];
        if (this.settings.cssAnimation)
          $entry.removeClass('entry-visible');
        else {
          $entry.stop().fadeTo(0, 0.1);
          $entry.find('> img, > a > img').fadeTo(0, 0);
        }
      }
      return -1;
    }

    // With lastRow = nojustify, justify if is justificable (the images will not become too big)
    if (isLastRow && !justifiable && this.settings.lastRow !== 'justify' && this.settings.lastRow !== 'hide') {
      justify = false;

      if (this.rows > 0) {
        defaultRowHeight = (this.offY - this.border - this.settings.margins * this.rows) / this.rows;
        justify = defaultRowHeight * this.buildingRow.aspectRatio / availableWidth > this.settings.justifyThreshold;
      }
    }

    for (i = 0; i < this.buildingRow.entriesBuff.length; i++) {
      $entry = this.buildingRow.entriesBuff[i];
      imgAspectRatio = $entry.data('jg.width') / $entry.data('jg.height');

      if (justify) {
        newImgW = (i === this.buildingRow.entriesBuff.length - 1) ? availableWidth : rowHeight * imgAspectRatio;
        newImgH = rowHeight;
      } else {
        newImgW = defaultRowHeight * imgAspectRatio;
        newImgH = defaultRowHeight;
      }

      availableWidth -= Math.round(newImgW);
      $entry.data('jg.jwidth', Math.round(newImgW));
      $entry.data('jg.jheight', Math.ceil(newImgH));
      if (i === 0 || minHeight > newImgH) minHeight = newImgH;
    }

    this.buildingRow.height = minHeight;
    return justify;
  };

  /**
   * Flush a row: justify it, modify the gallery height accordingly to the row height
   *
   * @param isLastRow
   */
  JustifiedGallery.prototype.flushRow = function (isLastRow) {
    var settings = this.settings;
    var $entry, buildingRowRes, offX = this.border, i;

    buildingRowRes = this.prepareBuildingRow(isLastRow);
    if (isLastRow && settings.lastRow === 'hide' && buildingRowRes === -1) {
      this.clearBuildingRow();
      return;
    }

    if(this.maxRowHeight) {
      if(this.maxRowHeight < this.buildingRow.height)  this.buildingRow.height = this.maxRowHeight;
    }

    //Align last (unjustified) row
    if (isLastRow && (settings.lastRow === 'center' || settings.lastRow === 'right')) {
      var availableWidth = this.galleryWidth - 2 * this.border - (this.buildingRow.entriesBuff.length - 1) * settings.margins;

      for (i = 0; i < this.buildingRow.entriesBuff.length; i++) {
        $entry = this.buildingRow.entriesBuff[i];
        availableWidth -= $entry.data('jg.jwidth');
      }

      if (settings.lastRow === 'center')
        offX += availableWidth / 2;
      else if (settings.lastRow === 'right')
        offX += availableWidth;
    }

    var lastEntryIdx = this.buildingRow.entriesBuff.length - 1;
    for (i = 0; i <= lastEntryIdx; i++) {
      $entry = this.buildingRow.entriesBuff[ this.settings.rtl ? lastEntryIdx - i : i ];
      this.displayEntry($entry, offX, this.offY, $entry.data('jg.jwidth'), $entry.data('jg.jheight'), this.buildingRow.height);
      offX += $entry.data('jg.jwidth') + settings.margins;
    }

    //Gallery Height
    this.galleryHeightToSet = this.offY + this.buildingRow.height + this.border;
    this.setGalleryTempHeight(this.galleryHeightToSet + this.getSpinnerHeight());

    if (!isLastRow || (this.buildingRow.height <= settings.rowHeight && buildingRowRes)) {
      //Ready for a new row
      this.offY += this.buildingRow.height + settings.margins;
      this.rows += 1;
      this.clearBuildingRow();
      this.settings.triggerEvent.call(this, 'jg.rowflush');
    }
  };


  // Scroll position not restoring: https://github.com/miromannino/Justified-Gallery/issues/221
  var galleryPrevStaticHeight = 0;

  JustifiedGallery.prototype.rememberGalleryHeight = function () {
    galleryPrevStaticHeight = this.$gallery.height();
    this.$gallery.height(galleryPrevStaticHeight);
  };

  // grow only
  JustifiedGallery.prototype.setGalleryTempHeight = function (height) {
    galleryPrevStaticHeight = Math.max(height, galleryPrevStaticHeight);
    this.$gallery.height(galleryPrevStaticHeight);
  };

  JustifiedGallery.prototype.setGalleryFinalHeight = function (height) {
    galleryPrevStaticHeight = height;
    this.$gallery.height(height);
  };

  /**
   * @returns {boolean} a boolean saying if the scrollbar is active or not
   */
  function hasScrollBar() {
    return $("body").height() > $(window).height();
  }

  /**
   * Checks the width of the gallery container, to know if a new justification is needed
   */
  JustifiedGallery.prototype.checkWidth = function () {
    this.checkWidthIntervalId = setInterval($.proxy(function () {

      // if the gallery is not currently visible, abort.
      if (!this.$gallery.is(":visible")) return;

      var galleryWidth = parseFloat(this.$gallery.width());
      if (hasScrollBar() === this.scrollBarOn) {
        if (Math.abs(galleryWidth - this.galleryWidth) > this.settings.refreshSensitivity) {
          this.galleryWidth = galleryWidth;
          this.rewind();

          this.rememberGalleryHeight();

          // Restart to analyze
          this.startImgAnalyzer(true);
        }
      } else {
        this.scrollBarOn = hasScrollBar();
        this.galleryWidth = galleryWidth;
      }
    }, this), this.settings.refreshTime);
  };

  /**
   * @returns {boolean} a boolean saying if the spinner is active or not
   */
  JustifiedGallery.prototype.isSpinnerActive = function () {
    return this.spinner.intervalId !== null;
  };

  /**
   * @returns {int} the spinner height
   */
  JustifiedGallery.prototype.getSpinnerHeight = function () {
    return this.spinner.$el.innerHeight();
  };

  /**
   * Stops the spinner animation and modify the gallery height to exclude the spinner
   */
  JustifiedGallery.prototype.stopLoadingSpinnerAnimation = function () {
    clearInterval(this.spinner.intervalId);
    this.spinner.intervalId = null;
    this.setGalleryTempHeight(this.$gallery.height() - this.getSpinnerHeight());
    this.spinner.$el.detach();
  };

  /**
   * Starts the spinner animation
   */
  JustifiedGallery.prototype.startLoadingSpinnerAnimation = function () {
    var spinnerContext = this.spinner;
    var $spinnerPoints = spinnerContext.$el.find('span');
    clearInterval(spinnerContext.intervalId);
    this.$gallery.append(spinnerContext.$el);
    this.setGalleryTempHeight(this.offY + this.buildingRow.height + this.getSpinnerHeight());
    spinnerContext.intervalId = setInterval(function () {
      if (spinnerContext.phase < $spinnerPoints.length) {
        $spinnerPoints.eq(spinnerContext.phase).fadeTo(spinnerContext.timeSlot, 1);
      } else {
        $spinnerPoints.eq(spinnerContext.phase - $spinnerPoints.length).fadeTo(spinnerContext.timeSlot, 0);
      }
      spinnerContext.phase = (spinnerContext.phase + 1) % ($spinnerPoints.length * 2);
    }, spinnerContext.timeSlot);
  };

  /**
   * Rewind the image analysis to start from the first entry.
   */
  JustifiedGallery.prototype.rewind = function () {
    this.lastFetchedEntry = null;
    this.lastAnalyzedIndex = -1;
    this.offY = this.border;
    this.rows = 0;
    this.clearBuildingRow();
  };

  /**
   * Update the entries searching it from the justified gallery HTML element
   *
   * @param norewind if norewind only the new entries will be changed (i.e. randomized, sorted or filtered)
   * @returns {boolean} true if some entries has been founded
   */
  JustifiedGallery.prototype.updateEntries = function (norewind) {
    var newEntries;

    if (norewind && this.lastFetchedEntry != null) {
      newEntries = $(this.lastFetchedEntry).nextAll(this.settings.selector).toArray();
    } else {
      this.entries = [];
      newEntries = this.$gallery.children(this.settings.selector).toArray();
    }

    if (newEntries.length > 0) {

      // Sort or randomize
      if ($.isFunction(this.settings.sort)) {
        newEntries = this.sortArray(newEntries);
      } else if (this.settings.randomize) {
        newEntries = this.shuffleArray(newEntries);
      }
      this.lastFetchedEntry = newEntries[newEntries.length - 1];

      // Filter
      if (this.settings.filter) {
        newEntries = this.filterArray(newEntries);
      } else {
        this.resetFilters(newEntries);
      }

    }

    this.entries = this.entries.concat(newEntries);
    return true;
  };

  /**
   * Apply the entries order to the DOM, iterating the entries and appending the images
   *
   * @param entries the entries that has been modified and that must be re-ordered in the DOM
   */
  JustifiedGallery.prototype.insertToGallery = function (entries) {
    var that = this;
    $.each(entries, function () {
      $(this).appendTo(that.$gallery);
    });
  };

  /**
   * Shuffle the array using the Fisher-Yates shuffle algorithm
   *
   * @param a the array to shuffle
   * @return the shuffled array
   */
  JustifiedGallery.prototype.shuffleArray = function (a) {
    var i, j, temp;
    for (i = a.length - 1; i > 0; i--) {
      j = Math.floor(Math.random() * (i + 1));
      temp = a[i];
      a[i] = a[j];
      a[j] = temp;
    }
    this.insertToGallery(a);
    return a;
  };

  /**
   * Sort the array using settings.comparator as comparator
   *
   * @param a the array to sort (it is sorted)
   * @return the sorted array
   */
  JustifiedGallery.prototype.sortArray = function (a) {
    a.sort(this.settings.sort);
    this.insertToGallery(a);
    return a;
  };

  /**
   * Reset the filters removing the 'jg-filtered' class from all the entries
   *
   * @param a the array to reset
   */
  JustifiedGallery.prototype.resetFilters = function (a) {
    for (var i = 0; i < a.length; i++) $(a[i]).removeClass('jg-filtered');
  };

  /**
   * Filter the entries considering theirs classes (if a string has been passed) or using a function for filtering.
   *
   * @param a the array to filter
   * @return the filtered array
   */
  JustifiedGallery.prototype.filterArray = function (a) {
    var settings = this.settings;
    if ($.type(settings.filter) === 'string') {
      // Filter only keeping the entries passed in the string
      return a.filter(function (el) {
        var $el = $(el);
        if ($el.is(settings.filter)) {
          $el.removeClass('jg-filtered');
          return true;
        } else {
          $el.addClass('jg-filtered').removeClass('jg-visible');
          return false;
        }
      });
    } else if ($.isFunction(settings.filter)) {
      // Filter using the passed function
      var filteredArr = a.filter(settings.filter);
      for (var i = 0; i < a.length; i++) {
        if (filteredArr.indexOf(a[i]) === -1) {
          $(a[i]).addClass('jg-filtered').removeClass('jg-visible');
        } else {
          $(a[i]).removeClass('jg-filtered');
        }
      }
      return filteredArr;
    }
  };

  /**
   * Destroy the Justified Gallery instance.
   *
   * It clears all the css properties added in the style attributes. We doesn't backup the original
   * values for those css attributes, because it costs (performance) and because in general one
   * shouldn't use the style attribute for an uniform set of images (where we suppose the use of
   * classes). Creating a backup is also difficult because JG could be called multiple times and
   * with different style attributes.
   */
  JustifiedGallery.prototype.destroy = function () {
    clearInterval(this.checkWidthIntervalId);

    $.each(this.entries, $.proxy(function(_, entry) {
      var $entry = $(entry);

      // Reset entry style
      $entry.css('width', '');
      $entry.css('height', '');
      $entry.css('top', '');
      $entry.css('left', '');
      $entry.data('jg.loaded', undefined);
      $entry.removeClass('jg-entry');

      // Reset image style
      var $img = this.imgFromEntry($entry);
      $img.css('width', '');
      $img.css('height', '');
      $img.css('margin-left', '');
      $img.css('margin-top', '');
      $img.attr('src', $img.data('jg.originalSrc'));
      $img.data('jg.originalSrc', undefined);

      // Remove caption
      this.removeCaptionEventsHandlers($entry);
      var $caption = this.captionFromEntry($entry);
      if ($entry.data('jg.createdCaption')) {
        // remove also the caption element (if created by jg)
        $entry.data('jg.createdCaption', undefined);
        if ($caption !== null) $caption.remove();
      } else {
        if ($caption !== null) $caption.fadeTo(0, 1);
      }

    }, this));

    this.$gallery.css('height', '');
    this.$gallery.removeClass('justified-gallery');
    this.$gallery.data('jg.controller', undefined);
  };

  /**
   * Analyze the images and builds the rows. It returns if it found an image that is not loaded.
   *
   * @param isForResize if the image analyzer is called for resizing or not, to call a different callback at the end
   */
  JustifiedGallery.prototype.analyzeImages = function (isForResize) {
    for (var i = this.lastAnalyzedIndex + 1; i < this.entries.length; i++) {
      var $entry = $(this.entries[i]);
      if ($entry.data('jg.loaded') === true || $entry.data('jg.loaded') === 'skipped') {
        var availableWidth = this.galleryWidth - 2 * this.border - (
            (this.buildingRow.entriesBuff.length - 1) * this.settings.margins);
        var imgAspectRatio = $entry.data('jg.width') / $entry.data('jg.height');
        if (availableWidth / (this.buildingRow.aspectRatio + imgAspectRatio) < this.settings.rowHeight) {
          this.flushRow(false);

          if(++this.yield.flushed >= this.yield.every) {
            this.startImgAnalyzer(isForResize);
            return;
          }
        }

        this.buildingRow.entriesBuff.push($entry);
        this.buildingRow.aspectRatio += imgAspectRatio;
        this.buildingRow.width += imgAspectRatio * this.settings.rowHeight;
        this.lastAnalyzedIndex = i;

      } else if ($entry.data('jg.loaded') !== 'error') {
        return;
      }
    }

    // Last row flush (the row is not full)
    if (this.buildingRow.entriesBuff.length > 0) this.flushRow(true);

    if (this.isSpinnerActive()) {
      this.stopLoadingSpinnerAnimation();
    }

    /* Stop, if there is, the timeout to start the analyzeImages.
     This is because an image can be set loaded, and the timeout can be set,
     but this image can be analyzed yet.
     */
    this.stopImgAnalyzerStarter();

    //On complete callback
    this.settings.triggerEvent.call(this, isForResize ? 'jg.resize' : 'jg.complete');
    this.setGalleryFinalHeight(this.galleryHeightToSet);
  };

  /**
   * Stops any ImgAnalyzer starter (that has an assigned timeout)
   */
  JustifiedGallery.prototype.stopImgAnalyzerStarter = function () {
    this.yield.flushed = 0;
    if (this.imgAnalyzerTimeout !== null) {
      clearTimeout(this.imgAnalyzerTimeout);
      this.imgAnalyzerTimeout = null;
    }
  };

  /**
   * Starts the image analyzer. It is not immediately called to let the browser to update the view
   *
   * @param isForResize specifies if the image analyzer must be called for resizing or not
   */
  JustifiedGallery.prototype.startImgAnalyzer = function (isForResize) {
    var that = this;
    this.stopImgAnalyzerStarter();
    this.imgAnalyzerTimeout = setTimeout(function () {
      that.analyzeImages(isForResize);
    }, 0.001); // we can't start it immediately due to a IE different behaviour
  };

  /**
   * Checks if the image is loaded or not using another image object. We cannot use the 'complete' image property,
   * because some browsers, with a 404 set complete = true.
   *
   * @param imageSrc the image src to load
   * @param onLoad callback that is called when the image has been loaded
   * @param onError callback that is called in case of an error
   */
  JustifiedGallery.prototype.onImageEvent = function (imageSrc, onLoad, onError) {
    if (!onLoad && !onError) return;

    var memImage = new Image();
    var $memImage = $(memImage);
    if (onLoad) {
      $memImage.one('load', function () {
        $memImage.off('load error');
        onLoad(memImage);
      });
    }
    if (onError) {
      $memImage.one('error', function() {
        $memImage.off('load error');
        onError(memImage);
      });
    }
    memImage.src = imageSrc;
  };

  /**
   * Init of Justified Gallery controlled
   * It analyzes all the entries starting theirs loading and calling the image analyzer (that works with loaded images)
   */
  JustifiedGallery.prototype.init = function () {
    var imagesToLoad = false, skippedImages = false, that = this;
    $.each(this.entries, function (index, entry) {
      var $entry = $(entry);
      var $image = that.imgFromEntry($entry);

      $entry.addClass('jg-entry');

      if ($entry.data('jg.loaded') !== true && $entry.data('jg.loaded') !== 'skipped') {

        // Link Rel global overwrite
        if (that.settings.rel !== null) $entry.attr('rel', that.settings.rel);

        // Link Target global overwrite
        if (that.settings.target !== null) $entry.attr('target', that.settings.target);

        if ($image !== null) {

          // Image src
          var imageSrc = that.extractImgSrcFromImage($image);
          $image.attr('src', imageSrc);

          /* If we have the height and the width, we don't wait that the image is loaded, but we start directly
           * with the justification */
          if (that.settings.waitThumbnailsLoad === false) {
            var width = parseFloat($image.prop('width'));
            var height = parseFloat($image.prop('height'));
            if (!isNaN(width) && !isNaN(height)) {
              $entry.data('jg.width', width);
              $entry.data('jg.height', height);
              $entry.data('jg.loaded', 'skipped');
              skippedImages = true;
              that.startImgAnalyzer(false);
              return true; // continue
            }
          }

          $entry.data('jg.loaded', false);
          imagesToLoad = true;

          // Spinner start
          if (!that.isSpinnerActive()) that.startLoadingSpinnerAnimation();

          that.onImageEvent(imageSrc, function (loadImg) { // image loaded
            $entry.data('jg.width', loadImg.width);
            $entry.data('jg.height', loadImg.height);
            $entry.data('jg.loaded', true);
            that.startImgAnalyzer(false);
          }, function () { // image load error
            $entry.data('jg.loaded', 'error');
            that.startImgAnalyzer(false);
          });

        } else {
          $entry.data('jg.loaded', true);
          $entry.data('jg.width', $entry.width() | parseFloat($entry.css('width')) | 1);
          $entry.data('jg.height', $entry.height() | parseFloat($entry.css('height')) | 1);
        }

      }

    });

    if (!imagesToLoad && !skippedImages) this.startImgAnalyzer(false);
    this.checkWidth();
  };

  /**
   * Checks that it is a valid number. If a string is passed it is converted to a number
   *
   * @param settingContainer the object that contains the setting (to allow the conversion)
   * @param settingName the setting name
   */
  JustifiedGallery.prototype.checkOrConvertNumber = function (settingContainer, settingName) {
    if ($.type(settingContainer[settingName]) === 'string') {
      settingContainer[settingName] = parseFloat(settingContainer[settingName]);
    }

    if ($.type(settingContainer[settingName]) === 'number') {
      if (isNaN(settingContainer[settingName])) throw 'invalid number for ' + settingName;
    } else {
      throw settingName + ' must be a number';
    }
  };

  /**
   * Checks the sizeRangeSuffixes and, if necessary, converts
   * its keys from string (e.g. old settings with 'lt100') to int.
   */
  JustifiedGallery.prototype.checkSizeRangesSuffixes = function () {
    if ($.type(this.settings.sizeRangeSuffixes) !== 'object') {
      throw 'sizeRangeSuffixes must be defined and must be an object';
    }

    var suffixRanges = [];
    for (var rangeIdx in this.settings.sizeRangeSuffixes) {
      if (this.settings.sizeRangeSuffixes.hasOwnProperty(rangeIdx)) suffixRanges.push(rangeIdx);
    }

    var newSizeRngSuffixes = {0: ''};
    for (var i = 0; i < suffixRanges.length; i++) {
      if ($.type(suffixRanges[i]) === 'string') {
        try {
          var numIdx = parseInt(suffixRanges[i].replace(/^[a-z]+/, ''), 10);
          newSizeRngSuffixes[numIdx] = this.settings.sizeRangeSuffixes[suffixRanges[i]];
        } catch (e) {
          throw 'sizeRangeSuffixes keys must contains correct numbers (' + e + ')';
        }
      } else {
        newSizeRngSuffixes[suffixRanges[i]] = this.settings.sizeRangeSuffixes[suffixRanges[i]];
      }
    }

    this.settings.sizeRangeSuffixes = newSizeRngSuffixes;
  };

  /**
   * check and convert the maxRowHeight setting
   * requires rowHeight to be already set
   * TODO: should be always called when only rowHeight is changed
   * @return number or null
   */
  JustifiedGallery.prototype.retrieveMaxRowHeight = function () {
    var newMaxRowHeight = null;
    var rowHeight = this.settings.rowHeight;

    if ($.type(this.settings.maxRowHeight) === 'string') {
      if (this.settings.maxRowHeight.match(/^[0-9]+%$/)) {
        newMaxRowHeight = rowHeight * parseFloat(this.settings.maxRowHeight.match(/^([0-9]+)%$/)[1]) / 100;
      } else {
        newMaxRowHeight = parseFloat(this.settings.maxRowHeight);
      }
    } else if ($.type(this.settings.maxRowHeight) === 'number') {
      newMaxRowHeight = this.settings.maxRowHeight;
    } else if (this.settings.maxRowHeight === false || this.settings.maxRowHeight == null) {
      return null;
    } else {
      throw 'maxRowHeight must be a number or a percentage';
    }

    // check if the converted value is not a number
    if (isNaN(newMaxRowHeight)) throw 'invalid number for maxRowHeight';

    // check values, maxRowHeight must be >= rowHeight
    if (newMaxRowHeight < rowHeight) newMaxRowHeight = rowHeight;

    return newMaxRowHeight;
  };

  /**
   * Checks the settings
   */
  JustifiedGallery.prototype.checkSettings = function () {
    this.checkSizeRangesSuffixes();

    this.checkOrConvertNumber(this.settings, 'rowHeight');
    this.checkOrConvertNumber(this.settings, 'margins');
    this.checkOrConvertNumber(this.settings, 'border');

    var lastRowModes = [
      'justify',
      'nojustify',
      'left',
      'center',
      'right',
      'hide'
    ];
    if (lastRowModes.indexOf(this.settings.lastRow) === -1) {
      throw 'lastRow must be one of: ' + lastRowModes.join(', ');
    }

    this.checkOrConvertNumber(this.settings, 'justifyThreshold');
    if (this.settings.justifyThreshold < 0 || this.settings.justifyThreshold > 1) {
      throw 'justifyThreshold must be in the interval [0,1]';
    }
    if ($.type(this.settings.cssAnimation) !== 'boolean') {
      throw 'cssAnimation must be a boolean';
    }

    if ($.type(this.settings.captions) !== 'boolean') throw 'captions must be a boolean';
    this.checkOrConvertNumber(this.settings.captionSettings, 'animationDuration');

    this.checkOrConvertNumber(this.settings.captionSettings, 'visibleOpacity');
    if (this.settings.captionSettings.visibleOpacity < 0 ||
        this.settings.captionSettings.visibleOpacity > 1) {
      throw 'captionSettings.visibleOpacity must be in the interval [0, 1]';
    }

    this.checkOrConvertNumber(this.settings.captionSettings, 'nonVisibleOpacity');
    if (this.settings.captionSettings.nonVisibleOpacity < 0 ||
        this.settings.captionSettings.nonVisibleOpacity > 1) {
      throw 'captionSettings.nonVisibleOpacity must be in the interval [0, 1]';
    }

    this.checkOrConvertNumber(this.settings, 'imagesAnimationDuration');
    this.checkOrConvertNumber(this.settings, 'refreshTime');
    this.checkOrConvertNumber(this.settings, 'refreshSensitivity');
    if ($.type(this.settings.randomize) !== 'boolean') throw 'randomize must be a boolean';
    if ($.type(this.settings.selector) !== 'string') throw 'selector must be a string';

    if (this.settings.sort !== false && !$.isFunction(this.settings.sort)) {
      throw 'sort must be false or a comparison function';
    }

    if (this.settings.filter !== false && !$.isFunction(this.settings.filter) &&
        $.type(this.settings.filter) !== 'string') {
      throw 'filter must be false, a string or a filter function';
    }
  };

  /**
   * It brings all the indexes from the sizeRangeSuffixes and it orders them. They are then sorted and returned.
   * @returns {Array} sorted suffix ranges
   */
  JustifiedGallery.prototype.retrieveSuffixRanges = function () {
    var suffixRanges = [];
    for (var rangeIdx in this.settings.sizeRangeSuffixes) {
      if (this.settings.sizeRangeSuffixes.hasOwnProperty(rangeIdx)) suffixRanges.push(parseInt(rangeIdx, 10));
    }
    suffixRanges.sort(function (a, b) { return a > b ? 1 : a < b ? -1 : 0; });
    return suffixRanges;
  };

  /**
   * Update the existing settings only changing some of them
   *
   * @param newSettings the new settings (or a subgroup of them)
   */
  JustifiedGallery.prototype.updateSettings = function (newSettings) {
    // In this case Justified Gallery has been called again changing only some options
    this.settings = $.extend({}, this.settings, newSettings);
    this.checkSettings();

    // As reported in the settings: negative value = same as margins, 0 = disabled
    this.border = this.settings.border >= 0 ? this.settings.border : this.settings.margins;

    this.maxRowHeight = this.retrieveMaxRowHeight();
    this.suffixRanges = this.retrieveSuffixRanges();
  };

  JustifiedGallery.prototype.defaults = {
    sizeRangeSuffixes: { }, /* e.g. Flickr configuration
        {
          100: '_t',  // used when longest is less than 100px
          240: '_m',  // used when longest is between 101px and 240px
          320: '_n',  // ...
          500: '',
          640: '_z',
          1024: '_b'  // used as else case because it is the last
        }
    */
    thumbnailPath: undefined, /* If defined, sizeRangeSuffixes is not used, and this function is used to determine the
    path relative to a specific thumbnail size. The function should accept respectively three arguments:
    current path, width and height */
    rowHeight: 120, // required? required to be > 0?
    maxRowHeight: false, // false or negative value to deactivate. Positive number to express the value in pixels,
                         // A string '[0-9]+%' to express in percentage (e.g. 300% means that the row height
                         // can't exceed 3 * rowHeight)
    margins: 1,
    border: -1, // negative value = same as margins, 0 = disabled, any other value to set the border

    lastRow: 'nojustify', // … which is the same as 'left', or can be 'justify', 'center', 'right' or 'hide'

    justifyThreshold: 0.90, /* if row width / available space > 0.90 it will be always justified
                             * (i.e. lastRow setting is not considered) */
    waitThumbnailsLoad: true,
    captions: true,
    cssAnimation: true,
    imagesAnimationDuration: 500, // ignored with css animations
    captionSettings: { // ignored with css animations
      animationDuration: 500,
      visibleOpacity: 0.7,
      nonVisibleOpacity: 0.0
    },
    rel: null, // rewrite the rel of each analyzed links
    target: null, // rewrite the target of all links
    extension: /\.[^.\\/]+$/, // regexp to capture the extension of an image
    refreshTime: 200, // time interval (in ms) to check if the page changes its width
    refreshSensitivity: 0, // change in width allowed (in px) without re-building the gallery
    randomize: false,
    rtl: false, // right-to-left mode
    sort: false, /*
      - false: to do not sort
      - function: to sort them using the function as comparator (see Array.prototype.sort())
    */
    filter: false, /*
      - false, null or undefined: for a disabled filter
      - a string: an entry is kept if entry.is(filter string) returns true
                  see jQuery's .is() function for further information
      - a function: invoked with arguments (entry, index, array). Return true to keep the entry, false otherwise.
                    It follows the specifications of the Array.prototype.filter() function of JavaScript.
    */
    selector: 'a, div:not(.spinner)', // The selector that is used to know what are the entries of the gallery
    imgSelector: '> img, > a > img', // The selector that is used to know what are the images of each entry
    triggerEvent: function (event) { // This is called to trigger events, the default behavior is to call $.trigger
      this.$gallery.trigger(event);  // Consider that 'this' is this set to the JustifiedGallery object, so it can
    }                                // access to fields such as $gallery, useful to trigger events with jQuery.
  };

  /**
   * Justified Gallery plugin for jQuery
   *
   * Events
   *  - jg.complete : called when all the gallery has been created
   *  - jg.resize : called when the gallery has been resized
   *  - jg.rowflush : when a new row appears
   *
   * @param arg the action (or the settings) passed when the plugin is called
   * @returns {*} the object itself
   */
  $.fn.justifiedGallery = function (arg) {
    return this.each(function (index, gallery) {

      var $gallery = $(gallery);
      $gallery.addClass('justified-gallery');

      var controller = $gallery.data('jg.controller');
      if (typeof controller === 'undefined') {
        // Create controller and assign it to the object data
        if (typeof arg !== 'undefined' && arg !== null && $.type(arg) !== 'object') {
          if (arg === 'destroy') return; // Just a call to an unexisting object
          throw 'The argument must be an object';
        }
        controller = new JustifiedGallery($gallery, $.extend({}, JustifiedGallery.prototype.defaults, arg));
        $gallery.data('jg.controller', controller);
      } else if (arg === 'norewind') {
        // In this case we don't rewind: we analyze only the latest images (e.g. to complete the last unfinished row
        // ... left to be more readable
      } else if (arg === 'destroy') {
        controller.destroy();
        return;
      } else {
        // In this case Justified Gallery has been called again changing only some options
        controller.updateSettings(arg);
        controller.rewind();
      }

      // Update the entries list
      if (!controller.updateEntries(arg === 'norewind')) return;

      // Init justified gallery
      controller.init();

    });
  };

}));

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = _default;

var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"));

__webpack_require__(/*! justifiedGallery/dist/js/jquery.justifiedGallery.js */ "./node_modules/justifiedGallery/dist/js/jquery.justifiedGallery.js");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _next(value) { step("next", value); } function _throw(err) { step("throw", err); } _next(); }); }; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _default() {
  var $ = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");

  if (!$('.justifiedGallery')) {
    return;
  }

  $('.justifiedGallery').justifiedGallery({
    rowHeight: 200,
    lastRow: 'nojustify',
    margins: 6
  });

  var els = _toConsumableArray(document.querySelectorAll('.justifiedGallery a'));

  els.forEach(function (item) {
    item.addEventListener('click',
    /*#__PURE__*/
    function () {
      var _ref = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee(event) {
        var module;
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                event.preventDefault();
                _context.next = 3;
                return Promise.all(/*! import() */[__webpack_require__.e(1), __webpack_require__.e(41)]).then(__webpack_require__.t.bind(null, /*! ./js/photo.js */ "./src/components/justifiedGallery/js/photo.js", 7));

              case 3:
                module = _context.sent;
                new module.default(document.querySelector('.justifiedGallery'), event.target);

              case 5:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      return function (_x) {
        return _ref.apply(this, arguments);
      };
    }());
  });
}

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _next(value) { step("next", value); } function _throw(err) { step("throw", err); } _next(); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var NewsItem =
/*#__PURE__*/
function () {
  function NewsItem() {
    var _this = this;

    _classCallCheck(this, NewsItem);

    if (document.querySelector('.newsCard__video')) {
      Promise.all(/*! import() */[__webpack_require__.e(5), __webpack_require__.e(42)]).then(__webpack_require__.t.bind(null, /*! ./js/video.js */ "./src/components/newsItem/js/video.js", 7)).then(function (module) {
        _this.videoOpenBall = module.default;
      });
    }

    document.addEventListener('click', function (event) {
      var card = event.target.closest('.newsCard');
      var target = event.target;

      if (!card) {
        return;
      }

      var classList = card.classList;
      var action = card.dataset.action;

      switch (true) {
        case action && action == 'video':
          /*classList.contains('newsCard__video')*/
          event.preventDefault();

          _this.video(card, target, event);

          break;

        case action && action == 'photo':
          /*classList.contains('newsCard__photo')*/
          event.preventDefault();

          _this.photo(card, target);

          break;

        case action && action == 'pdfviewer':
          event.preventDefault();

          _this.pdfviewer(card, target);

          break;

        case classList.contains('newsCard__event'):
          break;

        case classList.contains('newsCard__audio'):
          break;

        case classList.contains('newsCard__book'):
          break;

        /*case classList.contains('newsCard__presentation'):
        	event.preventDefault();
        	this.presentation(card, target);
        	break;*/

        /*case classList.contains('newsCard__infographics'):
        	event.preventDefault();
        	this.infographics(card, target);
        	break;*/

        default:
      }
    });
  }

  _createClass(NewsItem, [{
    key: "photo",
    value: function () {
      var _photo = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee(card, target) {
        var module;
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                if (this.PhotosCarousel) {
                  _context.next = 5;
                  break;
                }

                _context.next = 3;
                return Promise.all(/*! import() */[__webpack_require__.e(1), __webpack_require__.e(43)]).then(__webpack_require__.t.bind(null, /*! ./js/photo.js */ "./src/components/newsItem/js/photo.js", 7));

              case 3:
                module = _context.sent;
                this.PhotosCarousel = module.default;

              case 5:
                new this.PhotosCarousel(card, target);

              case 6:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      return function photo(_x, _x2) {
        return _photo.apply(this, arguments);
      };
    }()
  }, {
    key: "video",
    value: function () {
      var _video = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee2(card, target, event) {
        return _regenerator.default.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                if (this.videoOpenBall) {
                  _context2.next = 2;
                  break;
                }

                return _context2.abrupt("return");

              case 2:
                new this.videoOpenBall(card, target, event);

              case 3:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this);
      }));

      return function video(_x3, _x4, _x5) {
        return _video.apply(this, arguments);
      };
    }()
  }, {
    key: "pdfviewer",
    value: function () {
      var _pdfviewer = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee3(card, target) {
        var module;
        return _regenerator.default.wrap(function _callee3$(_context3) {
          while (1) {
            switch (_context3.prev = _context3.next) {
              case 0:
                if (this.PDFViewer) {
                  _context3.next = 5;
                  break;
                }

                _context3.next = 3;
                return Promise.all(/*! import() */[__webpack_require__.e(1), __webpack_require__.e(44)]).then(__webpack_require__.t.bind(null, /*! ./js/PDFViewer.js */ "./src/components/newsItem/js/PDFViewer.js", 7));

              case 3:
                module = _context3.sent;
                this.PDFViewer = module.default;

              case 5:
                new this.PDFViewer(card, target);

              case 6:
              case "end":
                return _context3.stop();
            }
          }
        }, _callee3, this);
      }));

      return function pdfviewer(_x6, _x7) {
        return _pdfviewer.apply(this, arguments);
      };
    }()
    /*
    async presentation(card, target) {
    	if ( !this.PDFViewer ) {
    		let module =  await import('./js/PDFViewer.js');
    		this.PDFViewer = module.default;
    	}
    		new this.PDFViewer(card, target);
    }
    async infographics(card, target) {
    	if ( !this.PDFViewer ) {
    		let module =  await import('./js/PDFViewer.js');
    		this.PDFViewer = module.default;
    	}
    		new this.PDFViewer(card, target);
    }
    */

  }, {
    key: "book",
    value: function book() {}
  }]);

  return NewsItem;
}();

exports.default = NewsItem;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _swiper = _interopRequireDefault(__webpack_require__(/*! swiper/dist/js/swiper.js */ "./node_modules/swiper/dist/js/swiper.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var sliders = document.querySelectorAll('[data-style="slider"]');

// import 'swiper/dist/css/swiper.css';
var Slider = function Slider(element) {
  _classCallCheck(this, Slider);

  this.element = element;
  var interleaveOffset = 0.5;
  this.slider = new _swiper.default(element, {
    loop: true,
    speed: 700,
    autoplay: {
      delay: 5500
    },
    parallax: true,
    grabCursor: true,
    watchSlidesProgress: true,
    navigation: {
      nextEl: '.swiper-button-next',
      prevEl: '.swiper-button-prev'
    },
    pagination: {
      el: '.swiper-pagination',
      type: 'bullets',
      clickable: true
    }
  });
  return this.slider;
};

var Sliders =
/*#__PURE__*/
function () {
  function Sliders() {
    var _this = this;

    _classCallCheck(this, Sliders);

    this.sliders = [];
    [].forEach.call(sliders, function (item) {
      _this.sliders.push({
        element: item,
        sliderObject: new Slider(item)
      });
    });
  }

  _createClass(Sliders, [{
    key: "getSliderObject",
    value: function getSliderObject(element) {
      for (var i = 0; i < this.sliders.length; i++) {
        if (this.sliders[i].element === element) {
          //
          // return {}
          return this.sliders[i].sliderObject;
        }
      }

      console.warn('На этом элементе нет объекта слайдера.');
    }
  }]);

  return Sliders;
}();

exports.default = Sliders;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var CardProfile = function CardProfile(element) {
  var _this = this;

  _classCallCheck(this, CardProfile);

  this.element = element;
  this.state = 'closed';
  var activeClass = 'cardProfile__item--active';
  this.element.addEventListener('click', function (event) {
    switch (_this.state) {
      case 'closed':
        {
          event.preventDefault();

          _this.element.classList.add(activeClass);

          _this.state = 'opened';
          break;
        }

      case 'opened':
        {
          if (!event.target.closest('.cardProfile__hoverClose')) {
            return;
          }

          event.preventDefault();
          _this.state = 'closed';

          _this.element.classList.remove(activeClass);

          break;
        }
    }
  });
};

var _default = function _default() {
  var elements = document.querySelectorAll('.cardProfile__item--hover');
  Array.from(elements).forEach(function (element) {
    new CardProfile(element);
  });
};

exports.default = _default;/**
 * Simple, lightweight, usable local autocomplete library for modern browsers
 * Because there weren’t enough autocomplete scripts in the world? Because I’m completely insane and have NIH syndrome? Probably both. :P
 * @author Lea Verou http://leaverou.github.io/awesomplete
 * MIT license
 */

(function () {

var _ = function (input, o) {
	var me = this;

	// Setup

	this.isOpened = false;

	this.input = $(input);
	this.input.setAttribute("autocomplete", "off");
	this.input.setAttribute("aria-autocomplete", "list");

	o = o || {};

	configure(this, {
		minChars: 2,
		maxItems: 10,
		autoFirst: false,
		data: _.DATA,
		filter: _.FILTER_CONTAINS,
		sort: o.sort === false ? false : _.SORT_BYLENGTH,
		item: _.ITEM,
		replace: _.REPLACE
	}, o);

	this.index = -1;

	// Create necessary elements

	this.container = $.create("div", {
		className: "awesomplete",
		around: input
	});

	this.ul = $.create("ul", {
		hidden: "hidden",
		inside: this.container
	});

	this.status = $.create("span", {
		className: "visually-hidden",
		role: "status",
		"aria-live": "assertive",
		"aria-relevant": "additions",
		inside: this.container
	});

	// Bind events

	this._events = {
		input: {
			"input": this.evaluate.bind(this),
			"blur": this.close.bind(this, { reason: "blur" }),
			"keydown": function(evt) {
				var c = evt.keyCode;

				// If the dropdown `ul` is in view, then act on keydown for the following keys:
				// Enter / Esc / Up / Down
				if(me.opened) {
					if (c === 13 && me.selected) { // Enter
						evt.preventDefault();
						me.select();
					}
					else if (c === 27) { // Esc
						me.close({ reason: "esc" });
					}
					else if (c === 38 || c === 40) { // Down/Up arrow
						evt.preventDefault();
						me[c === 38? "previous" : "next"]();
					}
				}
			}
		},
		form: {
			"submit": this.close.bind(this, { reason: "submit" })
		},
		ul: {
			"mousedown": function(evt) {
				var li = evt.target;

				if (li !== this) {

					while (li && !/li/i.test(li.nodeName)) {
						li = li.parentNode;
					}

					if (li && evt.button === 0) {  // Only select on left click
						evt.preventDefault();
						me.select(li, evt.target);
					}
				}
			}
		}
	};

	$.bind(this.input, this._events.input);
	$.bind(this.input.form, this._events.form);
	$.bind(this.ul, this._events.ul);

	if (this.input.hasAttribute("list")) {
		this.list = "#" + this.input.getAttribute("list");
		this.input.removeAttribute("list");
	}
	else {
		this.list = this.input.getAttribute("data-list") || o.list || [];
	}

	_.all.push(this);
};

_.prototype = {
	set list(list) {
		if (Array.isArray(list)) {
			this._list = list;
		}
		else if (typeof list === "string" && list.indexOf(",") > -1) {
				this._list = list.split(/\s*,\s*/);
		}
		else { // Element or CSS selector
			list = $(list);

			if (list && list.children) {
				var items = [];
				slice.apply(list.children).forEach(function (el) {
					if (!el.disabled) {
						var text = el.textContent.trim();
						var value = el.value || text;
						var label = el.label || text;
						if (value !== "") {
							items.push({ label: label, value: value });
						}
					}
				});
				this._list = items;
			}
		}

		if (document.activeElement === this.input) {
			this.evaluate();
		}
	},

	get selected() {
		return this.index > -1;
	},

	get opened() {
		return this.isOpened;
	},

	close: function (o) {
		if (!this.opened) {
			return;
		}

		this.ul.setAttribute("hidden", "");
		this.isOpened = false;
		this.index = -1;

		$.fire(this.input, "awesomplete-close", o || {});
	},

	open: function () {
		this.ul.removeAttribute("hidden");
		this.isOpened = true;

		if (this.autoFirst && this.index === -1) {
			this.goto(0);
		}

		$.fire(this.input, "awesomplete-open");
	},

	destroy: function() {
		//remove events from the input and its form
		$.unbind(this.input, this._events.input);
		$.unbind(this.input.form, this._events.form);

		//move the input out of the awesomplete container and remove the container and its children
		var parentNode = this.container.parentNode;

		parentNode.insertBefore(this.input, this.container);
		parentNode.removeChild(this.container);

		//remove autocomplete and aria-autocomplete attributes
		this.input.removeAttribute("autocomplete");
		this.input.removeAttribute("aria-autocomplete");

		//remove this awesomeplete instance from the global array of instances
		var indexOfAwesomplete = _.all.indexOf(this);

		if (indexOfAwesomplete !== -1) {
			_.all.splice(indexOfAwesomplete, 1);
		}
	},

	next: function () {
		var count = this.ul.children.length;
		this.goto(this.index < count - 1 ? this.index + 1 : (count ? 0 : -1) );
	},

	previous: function () {
		var count = this.ul.children.length;
		var pos = this.index - 1;

		this.goto(this.selected && pos !== -1 ? pos : count - 1);
	},

	// Should not be used, highlights specific item without any checks!
	goto: function (i) {
		var lis = this.ul.children;

		if (this.selected) {
			lis[this.index].setAttribute("aria-selected", "false");
		}

		this.index = i;

		if (i > -1 && lis.length > 0) {
			lis[i].setAttribute("aria-selected", "true");
			this.status.textContent = lis[i].textContent;

			// scroll to highlighted element in case parent's height is fixed
			this.ul.scrollTop = lis[i].offsetTop - this.ul.clientHeight + lis[i].clientHeight;

			$.fire(this.input, "awesomplete-highlight", {
				text: this.suggestions[this.index]
			});
		}
	},

	select: function (selected, origin) {
		if (selected) {
			this.index = $.siblingIndex(selected);
		} else {
			selected = this.ul.children[this.index];
		}

		if (selected) {
			var suggestion = this.suggestions[this.index];

			var allowed = $.fire(this.input, "awesomplete-select", {
				text: suggestion,
				origin: origin || selected
			});

			if (allowed) {
				this.replace(suggestion);
				this.close({ reason: "select" });
				$.fire(this.input, "awesomplete-selectcomplete", {
					text: suggestion
				});
			}
		}
	},

	evaluate: function() {
		var me = this;
		var value = this.input.value;

		if (value.length >= this.minChars && this._list.length > 0) {
			this.index = -1;
			// Populate list with options that match
			this.ul.innerHTML = "";

			this.suggestions = this._list
				.map(function(item) {
					return new Suggestion(me.data(item, value));
				})
				.filter(function(item) {
					return me.filter(item, value);
				});

			if (this.sort !== false) {
				this.suggestions = this.suggestions.sort(this.sort);
			}

			this.suggestions = this.suggestions.slice(0, this.maxItems);

			this.suggestions.forEach(function(text) {
					me.ul.appendChild(me.item(text, value));
				});

			if (this.ul.children.length === 0) {
				this.close({ reason: "nomatches" });
			} else {
				this.open();
			}
		}
		else {
			this.close({ reason: "nomatches" });
		}
	}
};

// Static methods/properties

_.all = [];

_.FILTER_CONTAINS = function (text, input) {
	return RegExp($.regExpEscape(input.trim()), "i").test(text);
};

_.FILTER_STARTSWITH = function (text, input) {
	return RegExp("^" + $.regExpEscape(input.trim()), "i").test(text);
};

_.SORT_BYLENGTH = function (a, b) {
	if (a.length !== b.length) {
		return a.length - b.length;
	}

	return a < b? -1 : 1;
};

_.ITEM = function (text, input) {
	var html = input.trim() === "" ? text : text.replace(RegExp($.regExpEscape(input.trim()), "gi"), "<mark>$&</mark>");
	return $.create("li", {
		innerHTML: html,
		"aria-selected": "false"
	});
};

_.REPLACE = function (text) {
	this.input.value = text.value;
};

_.DATA = function (item/*, input*/) { return item; };

// Private functions

function Suggestion(data) {
	var o = Array.isArray(data)
	  ? { label: data[0], value: data[1] }
	  : typeof data === "object" && "label" in data && "value" in data ? data : { label: data, value: data };

	this.label = o.label || o.value;
	this.value = o.value;
}
Object.defineProperty(Suggestion.prototype = Object.create(String.prototype), "length", {
	get: function() { return this.label.length; }
});
Suggestion.prototype.toString = Suggestion.prototype.valueOf = function () {
	return "" + this.label;
};

function configure(instance, properties, o) {
	for (var i in properties) {
		var initial = properties[i],
		    attrValue = instance.input.getAttribute("data-" + i.toLowerCase());

		if (typeof initial === "number") {
			instance[i] = parseInt(attrValue);
		}
		else if (initial === false) { // Boolean options must be false by default anyway
			instance[i] = attrValue !== null;
		}
		else if (initial instanceof Function) {
			instance[i] = null;
		}
		else {
			instance[i] = attrValue;
		}

		if (!instance[i] && instance[i] !== 0) {
			instance[i] = (i in o)? o[i] : initial;
		}
	}
}

// Helpers

var slice = Array.prototype.slice;

function $(expr, con) {
	return typeof expr === "string"? (con || document).querySelector(expr) : expr || null;
}

function $$(expr, con) {
	return slice.call((con || document).querySelectorAll(expr));
}

$.create = function(tag, o) {
	var element = document.createElement(tag);

	for (var i in o) {
		var val = o[i];

		if (i === "inside") {
			$(val).appendChild(element);
		}
		else if (i === "around") {
			var ref = $(val);
			ref.parentNode.insertBefore(element, ref);
			element.appendChild(ref);
		}
		else if (i in element) {
			element[i] = val;
		}
		else {
			element.setAttribute(i, val);
		}
	}

	return element;
};

$.bind = function(element, o) {
	if (element) {
		for (var event in o) {
			var callback = o[event];

			event.split(/\s+/).forEach(function (event) {
				element.addEventListener(event, callback);
			});
		}
	}
};

$.unbind = function(element, o) {
	if (element) {
		for (var event in o) {
			var callback = o[event];

			event.split(/\s+/).forEach(function(event) {
				element.removeEventListener(event, callback);
			});
		}
	}
};

$.fire = function(target, type, properties) {
	var evt = document.createEvent("HTMLEvents");

	evt.initEvent(type, true, true );

	for (var j in properties) {
		evt[j] = properties[j];
	}

	return target.dispatchEvent(evt);
};

$.regExpEscape = function (s) {
	return s.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&");
};

$.siblingIndex = function (el) {
	/* eslint-disable no-cond-assign */
	for (var i = 0; el = el.previousElementSibling; i++);
	return i;
};

// Initialization

function init() {
	$$("input.awesomplete").forEach(function (input) {
		new _(input);
	});
}

// Are we in a browser? Check for Document constructor
if (typeof Document !== "undefined") {
	// DOM already loaded?
	if (document.readyState !== "loading") {
		init();
	}
	else {
		// Wait for it
		document.addEventListener("DOMContentLoaded", init);
	}
}

_.$ = $;
_.$$ = $$;

// Make sure to export Awesomplete on self when in a browser
if (typeof self !== "undefined") {
	self.Awesomplete = _;
}

// Expose Awesomplete as a CJS module
if (typeof module === "object" && module.exports) {
	module.exports = _;
}

return _;

}());


Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = run;

var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"));

var _awesomplete = _interopRequireDefault(__webpack_require__(/*! awesomplete */ "./node_modules/awesomplete/awesomplete.js"));

var _axios = _interopRequireDefault(__webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'axios'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _next(value) { step("next", value); } function _throw(err) { step("throw", err); } _next(); }); }; }

function run() {
  var input = document.querySelector('.js-awesomplete');
  var awesomeplete = new _awesomplete.default(input); // убрать async у ф-ции если используется xhr

  var autocomplete =
  /*#__PURE__*/
  function () {
    var _ref = _asyncToGenerator(
    /*#__PURE__*/
    _regenerator.default.mark(function _callee(term) {
      var _ref2, data;

      return _regenerator.default.wrap(function _callee$(_context) {
        while (1) {
          switch (_context.prev = _context.next) {
            case 0:
              if (!(term.length < 2)) {
                _context.next = 2;
                break;
              }

              return _context.abrupt("return");

            case 2:
              _context.next = 4;
              return _axios.default.get('/search', {
                params: {
                  term: term
                }
              });

            case 4:
              _ref2 = _context.sent;
              data = _ref2.data;

              /* С использованием fetch
              const url = new URL('/search', window.location.origin);
              url.searchParams.set('term', term);
              const data = await fetch(url).then(res => res.json());
              **/

              /* С использованием xhr
              const url = new URL('/search', window.location.origin);
              url.searchParams.set('term', term);
              const xhr = new XMLHttpRequest();
              xhr.open('GET', url.href, true);
                xhr.onreadystatechange = function() {
                if (xhr.readyState !== 4) {
                  return;
                }
                  if (xhr.status !== 200) {
                  throw new Error(`${xhr.status}:${xhr.statusText}`);
                  return;
                }
                  const data = JSON.parse(xhr.responseText);
                awesomeplete.list = data;
              }
                xhr.send();
              **/
              awesomeplete.list = data; // закомментировать если используется xhr

            case 7:
            case "end":
              return _context.stop();
          }
        }
      }, _callee, this);
    }));

    return function autocomplete(_x) {
      return _ref.apply(this, arguments);
    };
  }();

  var timerId = null;
  input.addEventListener('input', function (_ref3) {
    var target = _ref3.target;
    clearTimeout(timerId);
    timerId = setTimeout(autocomplete, 500, target.value);
  });
}

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.initNewsFilterSelect = exports.default = void 0;

var _switchSelect = _interopRequireWildcard(__webpack_require__(/*! ../switchSelect/switchSelect */ "./src/components/switchSelect/switchSelect.js"));

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var Filters =
/*#__PURE__*/
function () {
  function Filters(panel) {
    _classCallCheck(this, Filters);

    this.panel = panel || document.querySelector('.newsFilter');
    if (!this.panel) return;
    this.contentBlock = this.panel.closest('.newsFilter__content') || document.querySelector('.newsFilter__content');
    this.labels = _toConsumableArray(document.querySelectorAll('.newsFilter__label'));
    this.inputs = _toConsumableArray(document.querySelectorAll('input[name="filter"]'));
    this.clickLogic();
    this.filterLogic();
  }

  _createClass(Filters, [{
    key: "clickLogic",
    value: function clickLogic() {
      var clear = this.panel.querySelector('input[value="clear"]');
      var prevFilter;
      this.inputs.forEach(function (item, index) {
        item.addEventListener('click', function (event) {
          event.stopPropagation();

          if (item.value == prevFilter) {
            item.checked = false;
            clear.dispatchEvent(new Event('change'));
            prevFilter = null;
          } else {
            prevFilter = item.value;
          }
        });
      });
    }
  }, {
    key: "filterLogic",
    value: function filterLogic() {
      var FilterElements = _toConsumableArray(document.querySelectorAll('[data-filter-type]'));

      this.inputs.forEach(function (item, index) {
        item.addEventListener('change', function (event) {
          var filterType = item.value;
          FilterElements.forEach(function (item, index) {
            if (item.dataset.filterType === filterType || filterType === 'clear') {
              item.style.display = item.dataset.filterDisplay || 'block';
            } else {
              item.style.display = 'none';
            }
          });
        });
      });
    }
  }]);

  return Filters;
}();

exports.default = Filters;

var NewsFilterSelect =
/*#__PURE__*/
function (_SwitchSelect) {
  _inherits(NewsFilterSelect, _SwitchSelect);

  function NewsFilterSelect(element) {
    _classCallCheck(this, NewsFilterSelect);

    return _possibleConstructorReturn(this, (NewsFilterSelect.__proto__ || Object.getPrototypeOf(NewsFilterSelect)).call(this, element));
  }

  _createClass(NewsFilterSelect, [{
    key: "selectItem",
    value: function selectItem(item) {
      var selectedItem = this.element.querySelector(_switchSelect.Selector.SELECTED_ITEM);

      if (!selectedItem) {
        item.classList.add(_switchSelect.ClassName.SELECTED_ITEM);
        this.triggerContentEl.innerHTML = item.innerHTML;
        this.close();
        return;
      }

      if (selectedItem === item) {
        item.classList.remove(_switchSelect.ClassName.SELECTED_ITEM);
        this.triggerContentEl.innerHTML = 'Выберите фильтр';
      } else {
        selectedItem.classList.remove(_switchSelect.ClassName.SELECTED_ITEM);
        item.classList.add(_switchSelect.ClassName.SELECTED_ITEM);
        this.triggerContentEl.innerHTML = item.innerHTML;
      }

      this.close();
    }
  }]);

  return NewsFilterSelect;
}(_switchSelect.default);

var initNewsFilterSelect = function initNewsFilterSelect() {
  _toConsumableArray(document.querySelectorAll('.newsFilterSelect')).forEach(function (item) {
    new NewsFilterSelect(item);
  });
};

exports.initNewsFilterSelect = initNewsFilterSelect;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.ClassName = exports.Selector = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var Selector = {
  ITEM: '.switchSelect__item',
  SELECTED_ITEM: '.switchSelect__item--isSelected',
  ITEMS_WRAP: '.switchSelect__dropdownInner',
  DROPDOWN: '.switchSelect__dropdown',
  TRIGGER: '.switchSelect__trigger',
  TRIGGER_CONTENT: '.switchSelect__trigger .content'
};
exports.Selector = Selector;
var ClassName = {
  OPENED: 'switchSelect--isOpened',
  SELECTED_ITEM: 'switchSelect__item--isSelected'
};
exports.ClassName = ClassName;

var SwitchSelect =
/*#__PURE__*/
function () {
  function SwitchSelect(element) {
    _classCallCheck(this, SwitchSelect);

    if (!element) {
      return;
    }

    this.element = element;
    this.dropdown = this.element.querySelector(Selector.DROPDOWN);
    this.trigger = this.element.querySelector(Selector.TRIGGER);
    this.triggerContentEl = this.element.querySelector(Selector.TRIGGER_CONTENT);
    this.items = this.element.querySelectorAll(Selector.ITEM);
    this.itemsWrap = this.element.querySelector(Selector.ITEMS_WRAP);
    this.dropdownPaddingTop = 35;
    this.dropdownPaddingBottom = 20;
    this.isOpened = false;
    var isMultiselect = !!this.element.dataset.multiselect;

    if (isMultiselect) {
      this.selectMethod = 'multiselectItem';
      this.selectedValues = new Set([]);
    } else {
      this.selectMethod = 'selectItem';
      this.selectedValue = null;
    }

    this.setDefaultSelectedItem();
    this.addEventListeners();
  }

  _createClass(SwitchSelect, [{
    key: "addEventListeners",
    value: function addEventListeners() {
      var _this = this;

      this.dropdown.addEventListener('click', function (_ref) {
        var target = _ref.target;
        var item = target.closest(Selector.ITEM);

        if (!item) {
          return;
        }

        _this[_this.selectMethod](item);
      });
      this.trigger.addEventListener('click', function (event) {
        event.preventDefault();

        _this.toggle();
      });
    }
  }, {
    key: "handleDocumentClick",
    value: function handleDocumentClick(_ref2) {
      var target = _ref2.target;

      if (!this.element.contains(target)) {
        this.close();
      }
    } // TODO: требуется рефакторинг

  }, {
    key: "selectItem",
    value: function selectItem(item) {
      var value = item.dataset.value;

      if (this.selectedValue && this.selectedValue !== value) {
        var prevSelectedItem = this.element.querySelector(Selector.SELECTED_ITEM);
        prevSelectedItem.classList.remove(ClassName.SELECTED_ITEM);
      }

      if (this.selectedValue !== value) {
        this.selectedValue = value;
        this.triggerContentEl.innerHTML = item.innerHTML;
        item.classList.add(ClassName.SELECTED_ITEM);
      }

      this.close();
    } // TODO: требуется рефакторинг

  }, {
    key: "multiselectItem",
    value: function multiselectItem(item) {
      var value = item.dataset.value;

      if (this.selectedValues.has(value)) {
        this.selectedValues.delete(value);
        item.classList.remove(ClassName.SELECTED_ITEM);

        if (this.selectedValues.size === 0) {
          this.triggerContentEl.innerHTML = 'Выберите теги';
        } else {
          this.triggerContentEl.innerHTML = "\u0412\u044B\u0431\u0440\u0430\u043D\u043E ".concat(this.selectedValues.size);
        }
      } else {
        this.selectedValues.add(value);
        item.classList.add(ClassName.SELECTED_ITEM);
        this.triggerContentEl.innerHTML = "\u0412\u044B\u0431\u0440\u0430\u043D\u043E ".concat(this.selectedValues.size);
      }

      this.close();
    }
  }, {
    key: "toggle",
    value: function toggle() {
      if (this.isOpened) {
        this.close();
      } else {
        this.open();
      }
    }
  }, {
    key: "open",
    value: function open() {
      document.addEventListener('click', this.handleDocumentClick.bind(this));
      this.setScroll();
      this.element.classList.add(ClassName.OPENED);
      this.setPaddingOnDropdown();
      this.dropdown.style.height = this.getOpenHeight();
      this.isOpened = true;
    }
  }, {
    key: "close",
    value: function close() {
      document.removeEventListener('click', this.handleDocumentClick.bind(this));
      this.removeScroll();
      this.element.classList.remove(ClassName.OPENED);
      this.removePaddingOnDropdown();
      this.dropdown.style.height = 0;
      this.isOpened = false;
    }
  }, {
    key: "getOpenHeight",
    value: function getOpenHeight() {
      return this.itemsWrap.scrollHeight + this.dropdownPaddingTop + this.dropdownPaddingBottom;
    }
  }, {
    key: "setPaddingOnDropdown",
    value: function setPaddingOnDropdown() {
      this.dropdown.style.paddingTop = this.dropdownPaddingTop;
      this.dropdown.style.paddingBottom = this.dropdownPaddingBottom;
    }
  }, {
    key: "removePaddingOnDropdown",
    value: function removePaddingOnDropdown() {
      this.dropdown.style.paddingTop = '';
      this.dropdown.style.paddingBottom = '';
    }
  }, {
    key: "setScroll",
    value: function setScroll() {
      var _this2 = this;

      var handle = function handle() {
        _this2.itemsWrap.style.overflowY = 'auto';

        _this2.dropdown.removeEventListener('transitionend', handle);
      };

      this.dropdown.addEventListener('transitionend', handle);
    }
  }, {
    key: "removeScroll",
    value: function removeScroll() {
      this.itemsWrap.style.overflowY = '';
    }
  }, {
    key: "setIndex",
    value: function setIndex(indexValue) {
      this.element.style.zIndex = indexValue;
    }
  }, {
    key: "setDefaultSelectedItem",
    value: function setDefaultSelectedItem() {
      var defaultSelectedItemEl = this.element.querySelector('[data-default]');

      if (!defaultSelectedItemEl) {
        return;
      }

      this.selectItem(defaultSelectedItemEl);
    }
  }]);

  return SwitchSelect;
}();

exports.default = SwitchSelect;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Router = exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var PageDraw =
/*#__PURE__*/
function () {
  function PageDraw() {
    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

    _classCallCheck(this, PageDraw);

    this.id = Date.now() * Math.random();
    this.__data = {};

    if (options.data) {
      this.data = options.data; // использовать ли кэш в js

      this.cache = options.cache || 1;
    }

    if (options.localData) {
      this.localData = options.localData;
    } // позиция, куда все это вставляется


    this.position = options.position || null; // Конфигурация родительского элемента, в котором будет контент

    this.__element = options.element || 'div';
    this.__className = options.class; // логирование действий скрипта

    this.__indication = options.indication || null; // контент, который можно указать при инициализации.

    this.__cont = options.content || null; // функция запускается после отрисовки и в ней должен быть код, как показать контент.
    // анимация появления

    this.show = options.show || null;
    this.hide = options.hide || null; // функция после анимации появления

    this.__callback = options.callback || null;

    if (options.container) {
      this.__prerender = true;
      this.__drawed = true;
    } // элемент, в который загрузится контент.


    this.block = options.container || document.createElement(this.__element);

    if (this.__className) {
      this.block.className = this.__className;
    }

    if (options.id) {
      this.block.id = options.id;
    } // массив детей, для установки зависимостей


    this.childrenArray = [];
    this.__changedCache = false;
    this.childrenHideModules = [];
  }

  _createClass(PageDraw, [{
    key: "isChildren",
    value: function isChildren(object) {
      for (var i = 0; i < this.childrenArray.length; i++) {
        var child = this.childrenArray[i];
        if (child == object) return true;
      }

      return false;
    }
  }, {
    key: "__drawLogic",
    value: function __drawLogic() {
      if (window.development || this.__indication) {
        if (!this.__cont) {
          this.__drawStart = false;
          throw new Error('Нету контента для отрисовки.');
        }
      }

      if (this.__cont instanceof Function) {
        return this.__drawForFunction();
      } else if (typeof this.__cont == 'string') {
        return this.__drawForString();
      } else {
        this.__drawStart = false;
        var error = new Error('Конетент не функция и не строка, а массив и объект не допустимы.');
        console.error(this.id, error);
        throw error;
      }
    }
  }, {
    key: "__drawForFunction",
    value: function __drawForFunction() {
      var _this = this;

      if (window.development || this.__indication) {
        console.log(this.id, 'Зашло в отрисовку функции');
      }

      var data;

      if (this.url) {
        data = this.cacheControl(this.url);
      } else if (this.localData) {
        data = Promise.resolve(this.localData);

        if (window.development || this.__indication) {
          console.log(this.id, 'Взяло локальные данные');
        }
      }

      return data.then(function (result) {
        if (window.development || _this.__indication) {
          console.log(_this.id, 'Отрисовка из данных');
        }

        if (window.development || _this.__indication) {
          if (!result) {
            console.warn(_this.id, 'Промис не отдал результат или ответ сервера пустой.');
            result = '';
          }
        }

        if (window.development || _this.__indication) {
          if (!_this.__cont(result)) {
            console.warn(_this.id, 'Функция контента ничего не возвращает');
          }
        }

        if (_this.hide && _this.__drawed) {
          return _this.hide().then(function () {
            _this.block.innerHTML = _this.__cont(result);
            _this.__changedCache = false;

            _this.insertCont();
          });
        } else {
          _this.block.innerHTML = _this.__cont(result);
          _this.__changedCache = false;

          if (!_this.block.offsetWidth) {
            _this.insertCont();
          } else {
            if (_this.show) {
              setTimeout(function () {
                _this.show();
              });

              if (window.development || _this.__indication) {
                console.log(_this.id, 'Анимировано', _this.block);
              }
            }

            _this.__drawed = true;
            _this.__drawStart = false;
          }
        }
      }).catch(function (err) {
        if (window.development || _this.__indication) {
          console.warn(_this.id, 'Ошибка в промисе получения данных, возможно 404');
        }

        _this.__drawStart = false;
        throw err;
      });
    }
  }, {
    key: "__drawForString",
    value: function __drawForString() {
      var _this2 = this;

      if (window.development || this.__indication) {
        console.log(this.id, 'Зашло в отрисовку строки');
      }

      if (this.__changedCache && this.__drawed) {
        if (window.development || this.__indication) {
          console.log(this.id, "Остановлено, смена кэша не изменит строку.");
        }

        this.__drawStart = false;
        this.__drawed = true;
        return Promise.reject();
      }

      if (window.development || this.__indication) {
        if (!this.__cont) {
          console.warn(this.id, 'Строка контента пуста');
        }
      }

      if (this.hide && this.__drawed) {
        return this.hide().then(function () {
          _this2.block.innerHTML = _this2.__cont;

          _this2.insertCont();
        });
      } else {
        this.block.innerHTML = this.__cont;

        if (!this.block.offsetWidth) {
          this.insertCont();
        } else {
          if (this.show) {
            setTimeout(function () {
              _this2.show();
            });

            if (window.development || this.__indication) {
              console.log(this.id, 'Анимировано', this.block);
            }
          }

          this.__drawed = true;
          this.__drawStart = false;
        }

        return Promise.resolve();
      }
    }
  }, {
    key: "insertCont",
    value: function insertCont() {
      var _this3 = this;

      var array = this.position;

      if (this.development || this.__indication) {
        if (!array) console.log('Нет позиции');
      }

      for (var index = 0; index < array.length; index++) {
        var _array$index = array[index],
            place = _array$index.place,
            element = _array$index.element,
            father = _array$index.father;
        if (father && father != this.father.__className) continue;
        var searchElement = document.querySelector(element);

        if (searchElement) {
          searchElement.insertAdjacentElement(place, this.block);
          this.__drawed = true;
          break;
        }
      }

      if (!this.__drawed && !searchElement && (this.__indication || window.development)) {
        console.log('%c Не отрисовано, не найден элемент', 'background: #ff0037; color: #fff');
      }

      if (this.childrenArray.length) {
        for (var i = 0; i < this.childrenArray.length; i++) {
          var child = this.childrenArray[i];
          child.drawed = false;
        }
      }

      if (!this.__drawed && searchElement && (window.development || this.__indication)) {
        console.log(this.id, 'Отрисовано', this.block);
      }

      if (this.show) {
        setTimeout(function () {
          _this3.show();
        });

        if (window.development || this.__indication) {
          console.log(this.id, 'Анимировано', this.block);
        }
      } //drawStart -> конец отрисовки


      this.__drawStart = false;
    }
  }, {
    key: "cacheControl",
    value: function cacheControl(url, options, preload) {
      //защита от двойного клика
      // preload == true дает подгрузить данные независимо от загрузки основных данных.
      if (this.loading && !preload) return this[url]; //

      if (!this.cache) {
        this.loadData(url, options);
        return this[url];
      }

      if (!this[url] || !this.__data[url]) {
        this.loadData(url, options);
      } else {
        if (window.development || this.__indication) {
          console.log(this.id, 'Взято из кэша', url);
        }
      }

      return this.__data[url] && Promise.resolve(this.__data[url]) || this[url];
    }
  }, {
    key: "loadData",
    value: function loadData(url) {
      var _this5 = this;

      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

      if (window.development || this.__indication) {
        if (!url) {
          console.error('Нету ссылки на данные');
          return;
        }
      }

      function request() {
        var _this4 = this;

        this.loading = true;
        var xhr = new XMLHttpRequest();
        var method = options.method || 'GET';
        xhr.open(method, url, true);
        var promise = new Promise(function (resolve, reject) {
          xhr.onload = function () {
            if (xhr.status !== 200) {
              reject();
            } else {
              if (window.development || _this4.__indication) {
                console.log(_this4.id, _this4[url], url, 'скачано');
              }

              var data;

              try {
                data = JSON.parse(xhr.responseText);
              } catch (e) {
                data = xhr.responseText;
              }

              resolve(data);
              _this4.__data[url] = data;
            }

            _this4.loading = false;
          };

          xhr.onerror = function (e) {
            _this4.loading = false;
            var error = new Error(xhr.status + ': ' + xhr.statusText);
            console.error(_this4.id, 'Ajax error', error, url);
            delete _this4[url];
            reject(error);
          }; //всегда без кэша, его делает приложение


          xhr.setRequestHeader('Cache-Control', 'no-cache');
          method == 'POST' ? xhr.send(options.body) : xhr.send();
        });
        this[url] = promise;
        return promise;
      }

      var promise = request.call(this);
      return promise.catch(function () {
        return request.call(_this5);
      });
    }
  }, {
    key: "content",
    set: function set(code) {
      if (window.development || this.__indication) {
        console.log(this.id, 'Изменен контент, можно перерисовать.');

        if (code instanceof Function) {
          console.log(this.id, 'Контент - функция');
        } else {
          console.log(this.id, 'Контент - строка');
        }
      }

      this.__cont = code;
      this.__drawed = false;
    },
    get: function get() {
      return this.__cont;
    }
  }, {
    key: "child",
    set: function set(object) {
      if (this.isChildren(object)) return null;
      this.childrenArray.push(object);
      object.father = this;
    }
  }, {
    key: "children",
    get: function get() {
      return this.childrenArray;
    }
  }, {
    key: "removeChild",
    set: function set(object) {
      for (var i = 0; i < this.childrenArray.length; i++) {
        var child = this.childrenArray[i];

        if (child === object) {
          child = null;
          return true;
        }
      }

      return null;
    }
  }, {
    key: "removeChildren",
    get: function get() {
      this.childrenArray = [];

      if (window.development || this.__indication) {
        console.log(this.id, 'Дети(зависимости) удалены');
      }

      return this.childrenArray;
    }
  }, {
    key: "position",
    set: function set(code) {
      if (!code) return;

      if (window.development || this.__indication) {
        console.log(this.id, 'Изменена/добавлена позиция, нужно отрисовать');
      }

      this.__drawed = false; // this.changePosition = true; ** 1

      if (code instanceof Array) {
        this.__pos = code;
        return;
      } else if (code instanceof Object) {
        this.__pos = [code];
        return;
      } // 'afterend .header' || ['afterend',document.querySelector('.header')]
      else if (typeof code == 'string') {
          var arr = code.split(' ');
          this.__pos = [{
            place: arr[0],
            element: arr[1],
            father: arr[2]
          }];
          return;
        }

      if (window.development || this.__indication) {
        if (!(code instanceof Object)) console.error(this.id, "\u041F\u043E\u0437\u0438\u0446\u0438\u044F - \u044D\u0442\u043E \u0441\u0442\u0440\u043E\u043A\u0430, \u043E\u0431\u044A\u0435\u043A\u0442({place:'beforeend',element:'.app'[,father: (this.father.class)]}) \u0438\u043B\u0438 \u043C\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u043E\u0431\u044A\u0435\u043A\u0442\u043E\u0432");
      }
    },
    get: function get() {
      return this.__pos;
    }
  }, {
    key: "draw",
    get: function get() {
      var _this6 = this;

      if (this.__drawStart) {
        if (window.development || this.__indication) {
          console.log(this.id, 'Уже идет отрисовка, вторая параллельно отклонена.');
        }

        return null;
      }

      if (this.__drawed && this.changedChildrens) {
        if (this.childrenArray.length) {
          for (var i = 0; i < this.childrenArray.length; i++) {
            var child = this.childrenArray[i];
            child.drawed = false;
            child.draw;
          }
        }
      }

      if (this.__drawed && !this.__changedCache) {
        if (window.development || this.__indication) {
          console.log(this.id, 'Не отрисовано, изменений не замечено.');
        }

        return null;
      } // drawStart -> Пошла отрисовка


      this.__drawStart = true;
      return this.__drawLogic().then(function () {
        if (_this6.childrenArray.length) {
          for (var i = 0; i < _this6.childrenArray.length; i++) {
            var _child = _this6.childrenArray[i];
            _child.draw;
          }
        }

        if (_this6.__callback) _this6.__callback();
      }).catch(function (e) {
        if (window.development || _this6.__indication) {
          console.log(_this6.id, 'По какой-то причине, отрисовка завершена.', e);
        }
      });
    }
  }, {
    key: "delete",
    get: function get() {
      var _this7 = this;

      if (this.childrenArray.length) {
        for (var i = this.childrenArray.length - 1; i >= 0; i--) {
          this.children[i].delete;
        }
      }

      if (this.hide) {
        var a = this.hide().then(function () {
          if (_this7.childrenHideModules && _this7.childrenHideModules.length) {
            Promise.all(_this7.childrenHideModules).then(function (value) {
              _this7.__drawed = false;

              _this7.block.remove();

              if (window.development || _this7.__indication) {
                console.log(_this7.id, 'Элемент удален');
              }
            }, function (reason) {
              console.warn('Проблемы выполнения просима анимации', _this7.id);
            });
          } else {
            _this7.__drawed = false;

            _this7.block.remove();

            if (window.development || _this7.__indication) {
              console.log(_this7.id, 'Элемент удален');
            }
          }

          _this7.childrenHideModules = []; // end then
        }); // посмотреть где используется и убрать есть не нужно
        // window.hideModules.push(a);

        if (this.father) {
          this.father.childrenHideModules.push(a);

          if (this.childrenHideModules && this.childrenHideModules.length) {
            this.father.childrenHideModules.push(Promise.all(this.childrenHideModules));
          }
        }
      } else {
        this.__drawed = false;
        this.block.remove();

        if (window.development || this.__indication) {
          console.log(this.id, 'Элемент удален');
        }
      }
    }
  }, {
    key: "data",
    set: function set(url) {
      if (this.url == url) {} else {
        this.__changedCache = true;
        this.url = url;
        this.cacheControl(this.url);
      }
    },
    get: function get() {
      if (this.url) {
        return this.cacheControl(this.url);
      } else {
        var error = new Error('Запрошены данные, которых нет.');
        console.error(this.id, 'В this.url нет данных о ссылке, по которой должны были загрузиться данные.', error.stack);
        throw error;
      }
    }
  }, {
    key: "localData",
    set: function set(data) {
      // debugger
      if (this.__localData !== data) {
        this.__localData = data;
        this.__changedCache = true;
      }
    },
    get: function get() {
      if (this.__localData) {
        return this.__localData;
      } else {
        var error = new Error('Запрошены данные, которых нет.');
        console.error(this.id, 'Нету локальных данных', error.stack);
        throw error;
      }
    }
  }]);

  return PageDraw;
}();

exports.default = PageDraw;

var Router =
/*#__PURE__*/
function () {
  function Router(structure) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    _classCallCheck(this, Router);

    this.__indication = options.indication || null;

    if (structure) {
      this.route(structure);
    }
  }

  _createClass(Router, [{
    key: "structure",
    value: function structure(object) {
      function __parse(element, children) {
        element.removeChildren;
        element.changedChildrens = true;

        for (var i = 0; i < children.length; i++) {
          var child = children[i];

          if (child.element) {
            __parse(child.element, child.subjects);

            element.child = child.element;
            child.element.father = element;
          } else {
            element.child = child;
            child.father = element;
          }
        }
      }

      if (this.activeStructure) {
        // this.activeStructure.element.delete;
        if (this.activeStructure == object) return;
        var activeElements = [];
        var newElements = [];

        __parseForDelete(this.activeStructure, activeElements);

        __parseForDelete(object, newElements); // activeElements.forEach(function(activeItem){
        // 	newElements.forEach(function(newItem,newItemIndex){
        // 		if (activeItem != newItem && newItemIndex == newItemsCount) {
        // 			activeItem.delete;
        // 		}
        // 	});
        // });


        for (var i = activeElements.length - 1; i >= 0; i--) {
          activeElements[i].removeChildren;

          for (var q = newElements.length - 1; q >= 0; q--) {
            if (activeElements[i] == newElements[q]) break;

            if (q == 0) {
              activeElements[i].delete;
            }
          }
        }
      }

      this.activeStructure = object;

      __parse(object.element, object.subjects); // asdsd.structure({
      // 	element: nav,
      // 	children: [
      // 		page1,
      // 		{
      // 			element:page2,
      // 			children: [
      // 				navButton,
      // 				closeButton
      // 			]
      // 		}
      // 	]
      // });


      function __parseForDelete(object, array) {
        array.push(object.element);
        object.subjects.forEach(function (item, index) {
          if (item.subjects) {
            __parseForDelete(item, array);
          } else {
            array.push(item);
          }
        });
      }
    }
  }, {
    key: "route",
    value: function route(pages) {
      var _this8 = this;

      var href = location.pathname;

      for (var i = 0; i < pages.length; i++) {
        if (pages[i].link == href) {
          this.structure(pages[i].structure);
          pages[i].structure.element.draw;
          scrollTo(0, 0);
          break;
        } else if (i === pages.length - 1) {
          console.warn('Подходящая ссылка не найдена');
        }
      } // pages это массив из структур(объектов)


      addEventListener('click', function (event) {
        var el = event.target.tagName == 'A' && event.target || event.target.closest('a');

        if (el) {
          for (var i = 0; i < pages.length; i++) {
            var _href = el.getAttribute('href');

            if (pages[i].link == _href) {
              _this8.structure(pages[i].structure);

              pages[i].structure.element.draw;
              scrollTo(0, 0);
              event.preventDefault();
              history.pushState({
                href: _href
              }, '', _href);
              break;
            } else if (i === pages.length - 1) {
              console.warn('Подходящая ссылка не найдена');
            }
          }
        }
      });
      addEventListener('popstate', function (event) {
        var href = event.state && event.state.href || location.pathname;

        for (var i = 0; i < pages.length; i++) {
          if (pages[i].link == href) {
            _this8.structure(pages[i].structure);

            pages[i].structure.element.draw;
            scrollTo(0, 0);
            break;
          } else if (i === pages.length - 1) {
            console.warn('Подходящая ссылка не найдена');
          }
        }
      });
    }
  }, {
    key: "setPage",
    value: function setPage() {}
  }]);

  return Router;
}();

exports.Router = Router;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _drawModule = _interopRequireDefault(__webpack_require__(/*! draw-module */ "./node_modules/draw-module/index.js"));

var _transitionEnd = _interopRequireDefault(__webpack_require__(/*! ../../layout/js/transitionEnd */ "./src/layout/js/transitionEnd.js"));

var _scroll = _interopRequireDefault(__webpack_require__(/*! ../../layout/js/scroll */ "./src/layout/js/scroll.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var _default = function _default() {
  var _this3 = this;

  _classCallCheck(this, _default);

  this.container = document.querySelector('.container__map');
  if (!this.container) return;

  var _this = this;

  this.pageDraw = new _drawModule.default({
    position: 'beforeend .map__content',
    class: 'map__content-popup',
    content: function content(data) {
      var _data$name = data.name,
          name = _data$name === void 0 ? '' : _data$name,
          advantages = data.advantages;
      var li = '';
      advantages.forEach(function (item) {
        var Aname = item.Aname,
            Atext = item.Atext;
        li += "\n\t\t\t\t\t<div class=\"map__content-popupItem\">\n\t\t\t\t\t\t<div>".concat(Aname, "</div><a href=\"javascript:void(0);\">").concat(Atext, "</a>\n\t\t\t\t\t</div>");
      });
      return "\n          <div class=\"map__content-popupName\">".concat(name, "</div>\n          <div class=\"map__content-popupClose\"></div>\n          <div class=\"map__content-popupContent\">\n            ").concat(li, "\n          </div>\n\t\t\t\t");
    },
    show: function show() {
      this.block.querySelector('.map__content-popupClose').addEventListener('click', function (event) {
        _this.pageDraw.delete;

        if (_this.data) {
          _this.rightInfo.delete;
          _this.rightInfo.localData = _this.data.default;
          _this.rightInfo.draw;
        }
      });
      this.block.closest('.map__content').classList.add('w100');
      this.block.classList.add('map__content-popup--animated');
    },
    hide: function hide() {
      var _this2 = this;

      return new Promise(function (resolve, reject) {
        _this2.block.classList.remove('map__content-popup--animated');

        var a = new _transitionEnd.default({
          element: _this2.block,
          callback: function callback() {
            _this2.block.closest('.map__content').classList.remove('w100');

            resolve();
            a.end();
          }
        });
      });
    }
  });
  this.rightInfo = new _drawModule.default({
    position: 'afterbegin .map__content',
    class: 'map__description',
    content: function content(data) {
      var text = data.text;
      return "\n\t\t\t\t<div style=\"position:relative;margin-right:-35px;padding-right:35px;overflow:hidden;\">\n\t\t\t\t\t<div data-scroll style=\"max-height: 550px; overflow-y:auto;overflow-x:hidden;height: 550px;\">\n\t\t\t\t\t<p>".concat(text, "</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t");
    },
    callback: function callback() {
      new _scroll.default(this.block.querySelector('[data-scroll]'));
    }
  });
  var data = fetch('/api/dataForMap').then(function (data) {
    return data.json();
  }).then(function (data) {
    _this.data = data; // console.log(data);

    _this3.rightInfo.localData = data.default;
    _this3.rightInfo.draw;
    var dataCount = 0;

    _toConsumableArray(_this3.container.querySelectorAll('.okrug')).forEach(function (item) {
      item.addEventListener('click', function (event) {
        // console.log(item.id);
        var dataForOkrug = Object.assign({}, data.default, data[item.id]);
        _this3.pageDraw.localData = dataForOkrug;
        _this3.pageDraw.draw;
        _this3.rightInfo.delete;
        _this3.rightInfo.localData = dataForOkrug;
        _this3.rightInfo.draw;
      });
    });
  }).catch(function (e) {
    console.warn('Нет json данных для карты, скрипт не отрабатывает', e);
  });
};

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var googleMap = function googleMap() {
  _classCallCheck(this, googleMap);

  var contactsMap = document.querySelector('.js-googleMap');
  var markerIcon = contactsMap.dataset.mapMarker;
  var center = {
    lat: contactsMap.dataset.centerLat * 1,
    lng: contactsMap.dataset.centerLng * 1
  };
  var map = new google.maps.Map(contactsMap, {
    zoom: 17,
    center: center,
    scrollwheel: false,
    zoomControl: false,
    mapTypeControl: false,
    scaleControl: true,
    streetViewControl: false,
    rotateControl: false,
    fullscreenControl: false,
    styles: [{
      "featureType": "administrative",
      "elementType": "all",
      "stylers": [{
        "saturation": "-100"
      }]
    }, {
      "featureType": "administrative.province",
      "elementType": "all",
      "stylers": [{
        "visibility": "off"
      }]
    }, // {
    //     "featureType": "landscape",
    //     "elementType": "all",
    //     "stylers": [
    //         {
    //             "saturation": -100
    //         },
    //         {
    //             "lightness": 65
    //         },
    //         {
    //             "visibility": "on"
    //         }
    //     ]
    // },
    {
      "featureType": "landscape",
      "elementType": "labels",
      "stylers": [{
        "saturation": -100
      }, {
        "lightness": 65
      }, {
        "visibility": "on"
      }]
    }, {
      "featureType": "poi.sports_complex",
      "elementType": "all",
      "stylers": [{
        "visibility": "off"
      }]
    }, {
      "featureType": "poi.government",
      "elementType": "all",
      "stylers": [{
        "visibility": "off"
      }]
    }, {
      "featureType": "poi.school",
      "elementType": "all",
      "stylers": [{
        "visibility": "off"
      }]
    }, {
      "featureType": "poi.attraction",
      "elementType": "all",
      "stylers": [{
        "saturation": -100
      }, {
        "lightness": "50"
      }, {
        "visibility": "off"
      }]
    }, // {
    //     "featureType": "poi",
    //     "elementType": "all",
    //     "stylers": [
    //         {
    //             "saturation": -100
    //         },
    //         {
    //             "lightness": "50"
    //         },
    //         {
    //             "visibility": "off"
    //         }
    //     ]
    // },
    {
      "featureType": "road",
      "elementType": "all",
      "stylers": [{
        "saturation": "-100"
      }]
    }, {
      "featureType": "road.highway",
      "elementType": "all",
      "stylers": [{
        "visibility": "simplified"
      }]
    }, {
      "featureType": "road.arterial",
      "elementType": "all",
      "stylers": [{
        "lightness": "30"
      }]
    }, {
      "featureType": "road.local",
      "elementType": "all",
      "stylers": [{
        "lightness": "40"
      }]
    }, {
      "featureType": "transit",
      "elementType": "all",
      "stylers": [{
        "saturation": -100
      }, {
        "visibility": "simplified"
      }]
    }, {
      "featureType": "water",
      "elementType": "geometry",
      "stylers": [{
        "hue": "#ffff00"
      }, {
        "lightness": -25
      }, {
        "saturation": -97
      }]
    }, {
      "featureType": "water",
      "elementType": "labels",
      "stylers": [{
        "lightness": -25
      }, {
        "saturation": -100
      }]
    }]
  }); // маркер

  var marker = new google.maps.Marker({
    position: {
      lat: contactsMap.dataset.markerLat * 1,
      lng: contactsMap.dataset.markerLng * 1
    },
    icon: markerIcon,
    map: map
  }); // центрирование карты при ресайзе

  google.maps.event.addDomListener(window, 'resize', function () {
    var center = map.getCenter();
    google.maps.event.trigger(map, "resize");
    map.setCenter(center);
  });
};

exports.default = googleMap;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _masonryPkgd = _interopRequireDefault(__webpack_require__(/*! masonry-layout/dist/masonry.pkgd.js */ "./node_modules/masonry-layout/dist/masonry.pkgd.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var infoCard =
/*#__PURE__*/
function () {
  function infoCard() {
    var _this = this;

    _classCallCheck(this, infoCard);

    // if (document.documentElement.classList.contains('mobile')) {
    //   return true;
    // }
    var infoCardHTML = document.querySelectorAll('.infoCard')[0].outerHTML;
    infoCardHTML += infoCardHTML; // let infoCardHTML2 = document.querySelectorAll('.infoCard')[1].outerHTML;

    window.qwe = function () {
      document.querySelectorAll('.info__array')[0].insertAdjacentHTML('beforeend', infoCardHTML); // document.querySelectorAll('.info__array')[0].insertAdjacentHTML('beforeend',infoCardHTML2);

      return true;
    };

    _toConsumableArray(document.querySelectorAll('.info__array:not(.info__array--withoutMasonry)')).forEach(function (item) {
      var msnry = new _masonryPkgd.default(item, {
        // options
        // columnWidth: 25%,
        itemSelector: '.infoCard',
        percentPosition: true,
        transitionDuration: 0 // horizontalOrder: true

      });

      _this.observer(msnry, item);
    });
  }

  _createClass(infoCard, [{
    key: "observer",
    value: function observer(msnry, parentItem) {
      var mut = new MutationObserver(function (mutations) {
        mutations.forEach(function (mutation) {
          _toConsumableArray(mutation.addedNodes).forEach(function (item) {
            if (item.querySelectorAll('.infoCard').length) {
              _toConsumableArray(item.querySelectorAll('.infoCard')).forEach(function (item) {
                msnry.appended(item);
              });
            } else {
              if (item.classList.contains('infoCard')) {
                msnry.appended(item);
              }
            }
          });
        });
      });
      var config = {
        childList: true,
        subtree: true
      };
      mut.observe(parentItem, config);
    }
  }]);

  return infoCard;
}();

exports.default = infoCard;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var audioFile =
/*#__PURE__*/
function () {
  function audioFile(element) {
    var _this = this;

    _classCallCheck(this, audioFile);

    this.el = element;
    this.audioTrack = element.getElementsByTagName('audio');
    this.playButton = element.querySelector('.playControls__control');
    this.progressBar = element.querySelector('.timeline__progressBar');
    this.progressBarHandle = element.querySelector('.timeline__progressHandle');
    this.volumeButton = element.querySelector('.playControls__volume');
    this.volumeValue = this.audioTrack[0].volume;
    this.volumeButton.addEventListener('click', function (event) {
      return _this.muteTrigger();
    });
    this.timeDuration = element.querySelector('.playControls__duration');
    this.timePassed = element.querySelector('.playControls__timePassed');
    this.setStartTime();
    this.audioTrack[0].addEventListener('timeupdate', function (event) {
      return _this.timeUpdate();
    });
    this.audioTrack[0].addEventListener('ended', function (event) {
      return _this.endPlay();
    });
    this.audioTrack[0].addEventListener('loadedmetadata', function (event) {
      return _this.setDuration();
    });
    this.audioTrack[0].addEventListener('playing', function (event) {
      return _this.setDuration();
    });
    this.playButton.addEventListener('click', function (event) {
      return _this.playTrigger();
    });
  }

  _createClass(audioFile, [{
    key: "setStartTime",
    value: function setStartTime() {
      this.timePassed.innerHTML = '00:00';
    }
  }, {
    key: "getDuration",
    value: function getDuration() {
      var secs = this.audioTrack[0].duration;
      var sec_num = parseInt(secs, 10);
      var hours = Math.floor(sec_num / 3600) % 24;
      var minutes = Math.floor(sec_num / 60) % 60;
      var seconds = sec_num % 60;
      return [hours, minutes, seconds].map(function (v) {
        return v < 10 ? "0" + v : v;
      }).filter(function (v, i) {
        return v !== "00" || i > 0;
      }).join(":");
    }
  }, {
    key: "setDuration",
    value: function setDuration() {
      this.timeDuration.innerHTML = this.getDuration();
    }
  }, {
    key: "playTrigger",
    value: function playTrigger() {
      var _this2 = this;

      if (this.audioTrack[0].paused) {
        // Выключение всех играющих аудио
        _toConsumableArray(document.getElementsByTagName('audio')).forEach(function (item) {
          item.pause();
        });

        _toConsumableArray(document.querySelectorAll('.playControls__control')).forEach(function (item) {
          item.classList.remove('playControls__control--pause');
          item.classList.add('playControls__control--play');
        });

        this.audioTrack[0].play().then(function () {
          _this2.playButton.classList.remove('playControls__control--play');

          _this2.playButton.classList.add('playControls__control--pause');
        });
      } else {
        this.playButton.classList.remove('playControls__control--pause');
        this.playButton.classList.add('playControls__control--play');
        this.audioTrack[0].pause();
      }
    }
  }, {
    key: "endPlay",
    value: function endPlay() {
      this.playButton.classList.remove('playControls__control--pause');
      this.playButton.classList.add('playControls__control--play');
    }
  }, {
    key: "timeUpdate",
    value: function timeUpdate() {
      // Обновление времени
      var s = parseInt(this.audioTrack[0].currentTime % 60);
      var m = parseInt(this.audioTrack[0].currentTime / 60 % 60);
      s = s >= 10 ? s : "0" + s;
      m = m >= 10 ? m : "0" + m;
      this.timePassed.innerHTML = m + ':' + s; // обновление прогресс бара

      this.progressBarUpdate();
    }
  }, {
    key: "muteTrigger",
    value: function muteTrigger() {
      if (this.audioTrack[0].volume == 0) {
        this.volumeButton.classList.remove('playControls__volume--mute');
        this.audioTrack[0].volume = this.volumeValue;
      } else {
        this.volumeButton.classList.add('playControls__volume--mute');
        this.audioTrack[0].volume = 0;
      }
    }
  }, {
    key: "progressBarUpdate",
    value: function progressBarUpdate() {
      var progressInPercent = (this.audioTrack[0].currentTime / this.audioTrack[0].duration * 100).toFixed(2);
      this.progressBar.style.width = progressInPercent + "%";
      this.progressBarHandle.style.marginLeft = progressInPercent + "%";
    }
  }]);

  return audioFile;
}();

exports.default = audioFile;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.init = exports.default = void 0;

var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"));

var _inputText = __webpack_require__(/*! ../inputText/inputText.js */ "./src/components/inputText/inputText.js");

var _inputSelect = __webpack_require__(/*! ../inputSelect/inputSelect.js */ "./src/components/inputSelect/inputSelect.js");

var _textarea = __webpack_require__(/*! ../textarea/textarea.js */ "./src/components/textarea/textarea.js");

var _loadFileDrugNDrop = __webpack_require__(/*! ../loadFileDrugNDrop/loadFileDrugNDrop.js */ "./src/components/loadFileDrugNDrop/loadFileDrugNDrop.js");

var _validation2 = _interopRequireDefault(__webpack_require__(/*! ../../layout/js/validation.js */ "./src/layout/js/validation.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _next(value) { step("next", value); } function _throw(err) { step("throw", err); } _next(); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var Modal;

var Form =
/*#__PURE__*/
function () {
  function Form(el) {
    var _this = this;

    _classCallCheck(this, Form);

    this.form = el;
    this.agree = document.querySelector('#agree');
    (0, _inputText.init)(this.form);
    (0, _inputSelect.init)(this.form);
    (0, _textarea.init)(this.form);
    (0, _loadFileDrugNDrop.init)(this.form);
    this.initAgreeModal(); // this.validation = Validation(this.form);

    this.validation = (0, _validation2.default)(this.form);
    this.form.addEventListener('submit', function (event) {
      event.preventDefault();

      _this.submit();
    });
  }

  _createClass(Form, [{
    key: "initAgreeModal",
    value: function () {
      var _initAgreeModal = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee() {
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                if (Modal) {
                  _context.next = 5;
                  break;
                }

                _context.next = 3;
                return __webpack_require__.e(/*! import() */ 1).then(__webpack_require__.bind(null, /*! popup-window-module */ "./node_modules/popup-window-module/index.js"));

              case 3:
                Modal = _context.sent;
                Modal = Modal.default;

              case 5:
                this.agreeModal = new Modal({
                  element: this.agree,
                  hash: '#agree'
                });

              case 6:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      return function initAgreeModal() {
        return _initAgreeModal.apply(this, arguments);
      };
    }()
  }, {
    key: "submit",
    value: function submit() {
      var _validation = this.validation,
          name = _validation.name,
          company = _validation.company,
          phone = _validation.phone,
          mail = _validation.mail,
          message = _validation.message,
          agree = _validation.agree;

      if (this.form.querySelector('.js-name')) {
        if (!name.test()) {
          name.el.parentNode.classList.add('hasError');
        } else {
          name.el.parentNode.classList.remove('hasError');
        }
      }

      if (this.form.querySelector('.js-company')) {
        if (!company.test()) {
          company.el.parentNode.classList.add('hasError');
        } else {
          company.el.parentNode.classList.remove('hasError');
        }
      }

      if (this.form.querySelector('.js-phone')) {
        if (!phone.test()) {
          phone.el.parentNode.classList.add('hasError');
        } else {
          phone.el.parentNode.classList.remove('hasError');
        }
      }

      if (this.form.querySelector('.js-mail')) {
        if (!mail.test()) {
          mail.el.parentNode.classList.add('hasError');
        } else {
          mail.el.parentNode.classList.remove('hasError');
        }
      }

      if (this.form.querySelector('.js-message')) {
        if (!message.test()) {
          message.el.parentNode.classList.add('hasError');
        } else {
          message.el.parentNode.classList.remove('hasError');
        }
      }

      if (this.form.querySelector('.js-agree')) {
        if (!agree.test()) {
          agree.el.parentNode.classList.add('hasError');
        } else {
          agree.el.parentNode.classList.remove('hasError');
        }
      }

      var formLabels = _toConsumableArray(this.form.querySelectorAll('label'));

      var formCheckbox = this.form.querySelector('.form__agree');
      var formSubmit = 1; // console.log(formLabels);

      for (var i = 0; i < formLabels.length; i++) {
        if (formLabels[i].classList.contains('hasError')) {
          var formSubmit = 0;
          break;
        } else if (formCheckbox) {
          if (formCheckbox.classList.contains('hasError')) {
            var formSubmit = 0;
            break;
          }
        } else {
          var formSubmit = 1;
        }
      }

      var invalidFieldAll = _toConsumableArray(this.form.querySelectorAll('.hasError input'));

      invalidFieldAll[0].focus();

      if (formSubmit == 1) {
        var source = this.form.getAttribute('action');

        var inputs = _toConsumableArray(this.form.querySelectorAll('input:not([type="checkbox"])'));

        var textarea = this.form.querySelector('textarea');
        var select = this.form.querySelector('.inputSelect');
        var checkbox = this.form.querySelector('input[type="checkbox"]'); // отправка данных

        fetch(source, {
          method: 'POST',
          body: new FormData(this.form)
        }).then(function (res) {
          if (res.status != 200) {
            throw new Error('Ошибка');
          }

          new Noty.Info('Отправлено', 'Форма успешно отправлена!');
          return res;
        }).then(function (res) {
          res.json().then(console.log).catch(function (err) {
            console.warn(err);
          });
        }).catch(function (err) {
          new Noty.Error('Ошибка', 'Форму не удалось отправить');
        }); // очистка формы после отправки

        if (checkbox) {
          checkbox.checked = false;
        }

        inputs.forEach(function (item) {
          if (item.parentNode.classList.contains('js-phone')) {
            item.parentNode.classList.remove('--hasValue');
            phone.clear();
          }

          ;
          item.value = '';
          item.parentNode.classList.remove('--hasValue');
        });

        if (textarea) {
          textarea.value = '';
          textarea.parentNode.classList.remove('--hasValue');
        }

        if (select) {
          var el = select.querySelector('.inputSelect__input');
          el.setAttribute('data-value', '');
          el.innerHTML = '';
        }
      }
    }
  }]);

  return Form;
}();

exports.default = Form;

var init = function init() {
  [].forEach.call(document.querySelectorAll('form:not(.searchForm__form)'), function (item) {
    new Form(item);
  });
};

exports.init = init;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.init = exports.default = void 0;

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var InputText =
/*#__PURE__*/
function () {
  function InputText(placeholder) {
    var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
    var className = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';

    _classCallCheck(this, InputText);

    if (!placeholder) throw new Error('Не указан плейсхолдер у инпута');
    this.label = document.createElement('label');
    this.span = document.createElement('span');
    this.input = document.createElement('input');
    this.label.dataset.style = "inputText";
    this.span.innerText = placeholder;
    value && (this.input.value = value);
    this.label.appendChild(this.input);
    this.label.appendChild(this.span);
    this.label.className = className + 'inputText';
    this.span.className = 'inputText__placeholder';
    this.input.className = 'inputText__input';

    this.__listeners();

    return this.label;
  }

  _createClass(InputText, [{
    key: "__listeners",
    value: function __listeners() {
      var _this = this;

      this.checkPlaceholder();
      this.input.addEventListener('input', function (event) {
        _this.checkPlaceholder();
      });
      this.input.addEventListener('change', function (event) {
        _this.checkPlaceholder();
      });
    }
  }, {
    key: "checkPlaceholder",
    value: function checkPlaceholder() {
      if (this.hasValue()) this.label.classList.add('--hasValue');else this.label.classList.remove('--hasValue');
    }
  }, {
    key: "hasValue",
    value: function hasValue() {
      if (this.input.value || this.input.value === 0) return true;else return false;
    }
  }], [{
    key: "listeners",
    value: function listeners(label) {
      var _this2 = this;

      if (!label) throw new Error('В метод нужно передать элемент label[data-style="inputText"]');
      var input = label.querySelector('input');
      this.checkPlaceholder(label, input);
      input.addEventListener('input', function (event) {
        _this2.checkPlaceholder(label, input);
      });
      input.addEventListener('change', function (event) {
        _this2.checkPlaceholder(label, input);
      });
    }
  }, {
    key: "checkPlaceholder",
    value: function checkPlaceholder(label, input) {
      if (this.hasValue(input)) label.classList.add('--hasValue');else label.classList.remove('--hasValue');
    }
  }, {
    key: "hasValue",
    value: function hasValue(input) {
      if (input.value || input.value === 0) return true;else return false;
    }
  }]);

  return InputText;
}();

exports.default = InputText;

var init = function init(form) {
  // const input = new InputText('Для генерации');
  _toConsumableArray(form.querySelectorAll('[data-style="inputText"]')).forEach(function (item) {
    InputText.listeners(item);
  });
};

exports.init = init;
window.InputText = InputText;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.init = exports.default = void 0;

var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _next(value) { step("next", value); } function _throw(err) { step("throw", err); } _next(); }); }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var InputSelect =
/*#__PURE__*/
function () {
  function InputSelect(placeholder, value) {
    var _this = this;

    var className = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
    var options = arguments.length > 3 ? arguments[3] : undefined;

    _classCallCheck(this, InputSelect);

    if (!placeholder) throw new Error('Не указан плейсхолдер у инпута');

    if (placeholder instanceof Object) {
      // ЕСЛИ КАК ПАРАМЕТР ПЕРЕДАТЬ СГЕНЕРИНЫЙ ОБЪЕКТ, это просто повесит обработчики
      this.label = placeholder;
      this.input = this.label.querySelector('.inputSelect__input');
      this.inputHidden = this.label.querySelector('.inputSelect__input--hidden');
      this.span = this.label.querySelector('.inputSelect__placeholder');
      this.list = this.label.querySelector('.inputSelect__list');

      this.__listeners();

      return this.label;
    }

    this.label = document.createElement('div');
    this.label.className = 'inputSelect__input';
    this.label.dataset.style = "inputSelect";
    this.input = document.createElement('input');

    if (value) {
      this.input.innerText = value.name;
      this.input.dataset.value = value.value;
    }

    this.span = document.createElement('span');
    this.span.innerText = placeholder;
    this.label.appendChild(this.input);
    this.label.appendChild(this.span);

    if (options instanceof Array) {
      var list = document.createElement('div');
      this.list.className = 'inputSelect__list';
      options.forEach(function (item, index) {
        var option = document.createElement('div');
        option.className = 'inputSelect__option';
        option.dataset.value = item.value;
        option.innerText = item.name;

        _this.list.appendChild(option);
      });
      this.label.appendChild(this.list);
    }

    this.__listeners();

    return this.label;
  }

  _createClass(InputSelect, [{
    key: "__listeners",
    value: function __listeners() {
      var _this2 = this;

      this.checkPlaceholder();
      this.selectItemListener();
      this.label.addEventListener('click', function (event) {
        event.preventDefault();

        _this2.routeClick();
      });
      this.input.addEventListener('keydown', function (event) {
        event.preventDefault();

        _this2.openList();
      });
      this.input.addEventListener('change', function (event) {
        _this2.checkPlaceholder();
      });
    }
  }, {
    key: "routeClick",
    value: function routeClick() {
      if (this.list.classList.contains('--opened')) {
        this.closeList();
      } else {
        this.openList();
      }
    }
  }, {
    key: "openList",
    value: function () {
      var _openList = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee() {
        var listHeight;
        return _regenerator.default.wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                this.label.classList.add('--opened');
                this.list.classList.add('--opened');
                listHeight = this.list.offsetHeight + this.list.scrollHeight;
                this.list.style.transition = 'all .2s ease';
                _context.next = 6;
                return new Promise(function (res, rej) {
                  requestAnimationFrame(function () {
                    requestAnimationFrame(function () {
                      res();
                    });
                  });
                });

              case 6:
                this.list.style.height = listHeight + 'px';

              case 7:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      return function openList() {
        return _openList.apply(this, arguments);
      };
    }()
  }, {
    key: "closeList",
    value: function closeList() {
      this.list.style.height = 0;
      this.label.classList.remove('--opened');
      this.list.classList.remove('--opened'); // list.style.transition = 'all .2s ease';
    }
  }, {
    key: "selectItemListener",
    value: function selectItemListener() {
      var _this3 = this;

      this.list.addEventListener('click', function (event) {
        var option = event.target.closest('.inputSelect__option');
        if (!option) return;
        _this3.value = option;
      });
      addEventListener('click', function (event) {
        if (!_this3.label.contains(event.target)) {
          _this3.closeList();
        }
      });
    }
  }, {
    key: "checkPlaceholder",
    value: function checkPlaceholder() {
      if (this.hasValue()) this.label.classList.add('--hasValue');else this.label.classList.remove('--hasValue');
    }
  }, {
    key: "hasValue",
    value: function hasValue() {
      if (this.input.dataset.value || this.input.dataset.value === 0) return true;else return false;
    }
  }, {
    key: "value",
    get: function get() {
      return this.input.dataset.value;
    },
    set: function set(value) {
      if (value instanceof String) value = this.list.querySelector("data-value=\"".concat(value, "\""));

      if (value instanceof Object) {
        var elValue = value.dataset.value;
        this.input.dataset.value = elValue;
        this.inputHidden.value = elValue;
        this.input.innerText = value.innerText;
      } else {
        console.error("\u0417\u0430\u043F\u0438\u0441\u044C \u0432\u0430\u043B\u0443\u0435 \u0432 \u0438\u043D\u043F\u0443\u0442 \u043D\u0435 \u0434\u0430\u043B\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0430. \u041D\u0435\u0442 \u0442\u0430\u043A\u043E\u0439 \u043E\u043F\u0446\u0438\u0438", this.label);
      }

      this.input.dispatchEvent(new Event('change'));
    }
  }]);

  return InputSelect;
}();

exports.default = InputSelect;

var init = function init(form) {
  [].forEach.call(form.querySelectorAll('.inputSelect'), function (item) {
    new InputSelect(item);
  });
};

exports.init = init;
window.InputSelect = InputSelect;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.init = void 0;

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var Textarea =
/*#__PURE__*/
function () {
  function Textarea(placeholder, value) {
    var className = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';

    _classCallCheck(this, Textarea);

    if (!placeholder) throw new Error('Не указан плейсхолдер у инпута');

    if (placeholder instanceof Object) {
      // ЕСЛИ КАК ПАРАМЕТР ПЕРЕДАТЬ СГЕНЕРИНЫЙ ОБЪЕКТ, это просто повесит обработчики
      this.label = placeholder;
      this.input = this.label.querySelector('.textarea__input');
      this.span = this.label.querySelector('.textarea__placeholder');

      this.__listeners();

      return this.label;
    }

    this.label = document.createElement('label');
    this.label.className = 'textarea';
    this.label.dataset.style = "textarea";
    this.input = document.createElement('textarea');
    this.input.className = 'textarea__input';

    if (value) {
      this.input.innerText = value.name;
      this.input.dataset.value = value.value;
    }

    this.span = document.createElement('span');
    this.span.className = 'textarea__placeholder';
    this.span.innerText = placeholder;
    this.label.appendChild(this.input);
    this.label.appendChild(this.span);

    this.__listeners();

    return this.label;
  }

  _createClass(Textarea, [{
    key: "__listeners",
    value: function __listeners() {
      var _this = this;

      this.checkPlaceholder();
      this.input.addEventListener('keyup', function (event) {
        _this.checkPlaceholder();
      });
      this.input.addEventListener('change', function (event) {
        _this.checkPlaceholder();
      });
    }
  }, {
    key: "checkPlaceholder",
    value: function checkPlaceholder() {
      if (this.hasValue()) this.label.classList.add('--hasValue');else this.label.classList.remove('--hasValue');
    }
  }, {
    key: "hasValue",
    value: function hasValue() {
      if (this.input.value || this.input.value === 0) return true;else return false;
    }
  }]);

  return Textarea;
}();

var init = function init(form) {
  _toConsumableArray(form.querySelectorAll('.textarea')).forEach(function (item) {
    new Textarea(item);
  });
};

exports.init = init;
window.Textarea = Textarea;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.init = exports.default = void 0;

var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _next(value) { step("next", value); } function _throw(err) { step("throw", err); } _next(); }); }; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var LoadFileDrugNDrop =
/*#__PURE__*/
function () {
  function LoadFileDrugNDrop(item) {
    _classCallCheck(this, LoadFileDrugNDrop);

    this.label = item || document.querySelector('.loadFileDrugNDrop__label');
    this.input = this.label.querySelector('.loadFileDrugNDrop__input');
    if (!this.label) return;
    this.placeholder = this.label.querySelector('.loadFileDrugNDrop__placeholder');
    this.addDragListener();
    this.__filesInForm = 0;
    this.__placeholerInLabel = true;
  }

  _createClass(LoadFileDrugNDrop, [{
    key: "addDragListener",
    value: function addDragListener() {
      var _this = this;

      var form = this.label.closest('form');

      if (!form) {
        console.warn('Модуль загрузки файлов должен быть внутри формы');
      }

      form.classList.add('loadFileDrugNDrop__formStyle-transition');
      (form || window).addEventListener('dragover', function (event) {
        event.stopPropagation();
        event.preventDefault();
        console.log(event);

        _this.label.classList.add('--active');

        form.classList.add('loadFileDrugNDrop__formStyle');
      });
      (form || window).addEventListener('dragend', function (event) {
        event.stopPropagation();
        event.preventDefault();

        _this.label.classList.remove('--active');
      });
      (form || document).addEventListener('drop', function (event) {
        event.stopPropagation();
        event.preventDefault();

        _this.label.classList.remove('--active');

        form.classList.remove('loadFileDrugNDrop__formStyle');

        _toConsumableArray(event.dataTransfer.files).forEach(function (file, index) {
          setTimeout(function () {
            _this.sendToServerBuffer(file).catch(function (e) {
              console.error("\u041E\u0442\u043F\u0440\u0430\u0432\u043A\u0430 \u0444\u0430\u0439\u043B\u0430 ".concat(file.name, " \u043D\u0435 \u0443\u0434\u0430\u043B\u0430\u0441\u044C"));
            });
          }, 300 * index);
        });
      });
      this.input.addEventListener('change', function (event) {
        _toConsumableArray(_this.input.files).forEach(function (file, index) {
          setTimeout(function () {
            _this.sendToServerBuffer(file).catch(function (e) {
              console.error("\u041E\u0442\u043F\u0440\u0430\u0432\u043A\u0430 \u0444\u0430\u0439\u043B\u0430 ".concat(file.name, " \u043D\u0435 \u0443\u0434\u0430\u043B\u0430\u0441\u044C"));
            });
          }, 300 * index);
        });
      });
    }
  }, {
    key: "generateLine",
    value: function generateLine(fileName, xhr) {
      var fileBlock = document.createElement('div');
      fileBlock.classList.add('loadFileDrugNDrop__file');
      var fileContent = document.createElement('div');
      fileContent.classList.add('loadFileDrugNDrop__file-content');
      var fileRemove = document.createElement('div');
      fileRemove.classList.add('loadFileDrugNDrop__file-remove');
      var fileText = document.createElement('div');
      fileText.classList.add('loadFileDrugNDrop__file-text');
      var fileProgress = document.createElement('div');
      fileProgress.classList.add('loadFileDrugNDrop__file-progress');
      var fileTextProgress = document.createElement('div');
      fileTextProgress.classList.add('loadFileDrugNDrop__file-textProgress');
      fileText.innerText = fileName;
      fileContent.appendChild(fileText);
      fileContent.appendChild(fileTextProgress);
      fileContent.appendChild(fileRemove);
      fileContent.appendChild(fileProgress);
      fileBlock.appendChild(fileContent);
      fileBlock.style.height = '0';
      requestAnimationFrame(function () {
        requestAnimationFrame(function () {
          fileBlock.style.height = fileBlock.scrollHeight + 'px';
        });
      });
      this.label.insertAdjacentElement('beforebegin', fileBlock);
      fileRemove.addEventListener('click',
      /*#__PURE__*/
      function () {
        var _ref = _asyncToGenerator(
        /*#__PURE__*/
        _regenerator.default.mark(function _callee(event) {
          return _regenerator.default.wrap(function _callee$(_context) {
            while (1) {
              switch (_context.prev = _context.next) {
                case 0:
                  xhr.abort();
                  fileContent.style.transform = 'translateY(0%)';
                  fileBlock.style.height = fileBlock.offsetHeight + 'px';
                  _context.next = 5;
                  return new Promise(function (resolve, reject) {
                    requestAnimationFrame(function () {
                      requestAnimationFrame(function () {
                        resolve();
                      });
                    });
                  });

                case 5:
                  fileBlock.style.height = 0;
                  fileContent.style.transform = 'translateY(-10%)';
                  fileBlock.style.margin = '0px ' + getComputedStyle(fileBlock).marginLeft;
                  _context.next = 10;
                  return new Promise(function (resolve, reject) {
                    fileContent.addEventListener('transitionend', function (event) {
                      resolve();
                    });
                  });

                case 10:
                  fileBlock.remove();

                case 11:
                case "end":
                  return _context.stop();
              }
            }
          }, _callee, this);
        }));

        return function (_x) {
          return _ref.apply(this, arguments);
        };
      }());
      return {
        fileBlock: fileBlock,
        fileRemove: fileRemove,
        fileText: fileText,
        fileTextProgress: fileTextProgress,
        fileProgress: fileProgress,
        fileContent: fileContent
      };
    } // временное хранилище файлов перед отправкой формы

  }, {
    key: "sendToServerBuffer",
    value: function () {
      var _sendToServerBuffer = _asyncToGenerator(
      /*#__PURE__*/
      _regenerator.default.mark(function _callee2(file) {
        var xhr, _generateLine, fileBlock, fileRemove, fileText, fileContent, fileTextProgress, fileProgress, fd, convertDataSize, status;

        return _regenerator.default.wrap(function _callee2$(_context2) {
          while (1) {
            switch (_context2.prev = _context2.next) {
              case 0:
                convertDataSize = function _ref2(size) {
                  size /= 1024;
                  if (size < 1024) return size.toFixed(0) + ' кб';
                  size /= 1024;
                  if (size < 1024) return size.toFixed(2) + ' мб';
                  size /= 1024;
                  if (size < 1024) return size.toFixed(2) + ' гб';
                };

                xhr = new XMLHttpRequest();
                _generateLine = this.generateLine(file.name, xhr), fileBlock = _generateLine.fileBlock, fileRemove = _generateLine.fileRemove, fileText = _generateLine.fileText, fileContent = _generateLine.fileContent, fileTextProgress = _generateLine.fileTextProgress, fileProgress = _generateLine.fileProgress;
                xhr.open('POST', '/api/v1/postFile');
                fd = new FormData();
                fd.append('file', file);

                xhr.upload.onprogress = function (event) {
                  fileProgress.style.width = event.loaded / event.total * 100 + '%';
                  fileTextProgress.innerText = "(\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u043E ".concat(convertDataSize(event.loaded), " \u0438\u0437 ").concat(convertDataSize(event.total), ")");
                };

                xhr.send(fd);
                _context2.next = 10;
                return new Promise(function (resolve, reject) {
                  xhr.onload = function () {
                    resolve('load');
                    fileProgress.style.width = '100%';
                  };

                  xhr.onerror = function () {
                    reject("".concat(xhr.status, ", ").concat(xhr.statusText));
                    console.log("".concat(xhr.status, ", ").concat(xhr.statusText));
                  };

                  xhr.onabort = function () {
                    removeFile();
                    reject("abort");
                    console.log("abort");
                  };
                });

              case 10:
                status = _context2.sent;
                console.log(status);

              case 12:
              case "end":
                return _context2.stop();
            }
          }
        }, _callee2, this);
      }));

      return function sendToServerBuffer(_x2) {
        return _sendToServerBuffer.apply(this, arguments);
      };
    }()
  }]);

  return LoadFileDrugNDrop;
}();

exports.default = LoadFileDrugNDrop;

var init = function init(form) {
  _toConsumableArray(form.querySelectorAll('.loadFileDrugNDrop__label')).forEach(function (item) {
    new LoadFileDrugNDrop(item);
  });
};

exports.init = init;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = initFormValidateScripts;

var _mask = _interopRequireDefault(__webpack_require__(/*! ../../layout/js/mask */ "./src/layout/js/mask.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function initFormValidateScripts() {
  var form = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.querySelector('form');
  if (!form) return; // Mask берется из другого файла который подключается раньше

  var phoneEl = form.querySelector('.js-phone input');
  var phoneMask = new _mask.default(phoneEl);
  var phone = {
    el: phoneEl,
    test: function test() {
      return phoneMask.test();
    },
    focus: function focus() {
      this.el.focus();
    },
    clear: function clear() {
      phoneMask.clear();
    }
  };
  var mail = {
    el: form.querySelector('.js-mail input'),
    test: function test() {
      // проверка на наличие символа до собачки, собачку, текст между собачкой и точкой, точку и текст после точки
      var regexp = new RegExp('.@.+?\\.\\D{2}', 'gi');
      return regexp.test(this.el.value);
    },
    focus: function focus() {
      this.el.focus();
    }
  };
  var name = {
    el: form.querySelector('.js-name input'),
    test: function test() {
      return this.el.value.length > 1 ? 1 : 0;
    },
    focus: function focus() {
      this.el.focus();
    }
  };
  var company = {
    el: form.querySelector('.js-company input'),
    test: function test() {
      return this.el.value.length > 1 ? 1 : 0;
    },
    focus: function focus() {
      this.el.focus();
    }
  };
  var agree = {
    el: form.querySelector('.js-agree input[type="checkbox"]'),
    test: function test() {
      return this.el.checked;
    },
    focus: function focus() {
      this.el.focus();
    }
  };
  var message = {
    el: form.querySelector('.js-message textarea'),
    test: function test() {
      return this.el.value.length > 1 ? 1 : 0;
    },
    focus: function focus() {
      this.el.focus();
    }
  };

  if (form.querySelector('.js-from input')) {
    var from = {
      el: form.querySelector('.js-from input'),
      test: function test() {
        return this.el.value.length > 1 ? 1 : 0;
      },
      focus: function focus() {
        this.el.focus();
      }
    };
  }

  if (form.querySelector('.js-where input')) {
    var where = {
      el: form.querySelector('.js-where input'),
      test: function test() {
        return this.el.value.length > 1 ? 1 : 0;
      },
      focus: function focus() {
        this.el.focus();
      }
    };
  }

  if (form.querySelector('.js-weight input')) {
    var weight = {
      el: form.querySelector('.js-weight input'),
      test: function test() {
        return this.el.value.length >= 1 ? 1 : 0;
      },
      focus: function focus() {
        this.el.focus();
      }
    };
  }

  if (form.querySelector('.js-amount input')) {
    var amount = {
      el: form.querySelector('.js-amount input'),
      test: function test() {
        return this.el.value.length >= 1 ? 1 : 0;
      },
      focus: function focus() {
        this.el.focus();
      }
    };
  }

  if (form.querySelector('.js-correction input')) {
    var correction = {
      el: form.querySelector('.js-correction input'),
      test: function test() {
        return this.el.value.length > 1 ? 1 : 0;
      },
      focus: function focus() {
        this.el.focus();
      }
    };
  }

  return {
    phone: phone,
    company: company,
    mail: mail,
    name: name,
    agree: agree,
    message: message,
    from: from,
    where: where,
    weight: weight,
    amount: amount,
    correction: correction
  };
}

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var Mask =
/*#__PURE__*/
function () {
  function Mask(element) {
    var _this2 = this;

    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    _classCallCheck(this, Mask);

    if (!element) return;

    var _this = this;

    this.symbol = options.symbol || '_'; // Символ заменитель незаполненных ячеек

    this.mask = options.mask || '+7 (___) ___-__-__'; // Маска с учётом символа заменителя

    this.allowedChars = options.allowedChars || '[0-9]'; // Разрешённые символы (будут частью регекспа)

    this.empty = options.empty || 'false'; // Разрешить пустое поле

    this.legalLength = options.legalLength; // Допустимые длины заполнения

    this.element = element;
    element.value = this.value = this.mask;
    this.regex = "".concat(this.allowedChars, "|").concat(this.symbol);
    this.maskSymbols = this.mask.match(new RegExp(this.regex, 'gi'));
    this.allowedCharsLength = 0;
    this.maskSymbols.forEach(function (elem) {
      if (elem == _this2.symbol) _this2.allowedCharsLength++;
    });
    this.checkKeyCodeSupport();
    element.addEventListener('focus', function () {
      requestAnimationFrame(function () {
        requestAnimationFrame(function () {
          var indexedSymbol = _this.element.value.indexOf(_this.symbol);

          if (indexedSymbol != -1) _this.caretPosition = indexedSymbol;else _this.caretPosition = _this.element.value.length;

          _this.setCaretPosition(_this.element, _this.caretPosition, _this.caretPosition);
        });
      });
    });
    element.addEventListener('blur', function () {
      if (!_this.element.value) _this.element.value = _this.mask;
    });
    element.addEventListener('paste', function (e) {
      if (_this2.method == 'mask') _this2.pasteWithMask(e);
      if (_this2.method == 'simpleMask') _this2.pasteWithSimpleMask(e);
    });
    this.__bindedRoute = this.route.bind(this);
    element.addEventListener('load', this.__bindedRoute); // element.addEventListener('input', this.__bindedRoute);

    element.addEventListener('keydown', this.__bindedRoute);
  }

  _createClass(Mask, [{
    key: "route",
    value: function route(e) {
      if (e.keyCode === 0 || e.keyCode === 229) this.__simpleMask(e);else this.__mask(e);
    }
  }, {
    key: "__simpleMask",
    value: function __simpleMask(e) {
      var _this3 = this;

      var stack = new Promise(function (resolve, reject) {
        requestAnimationFrame(function () {
          requestAnimationFrame(function () {
            if (_this3.value && _this3.value.length >= _this3.element.value.length) {
              reject();
              _this3.value = _this3.element.value;
            }

            resolve(_this3.element.value);
          });
        });
      });
      stack.then(function (result) {
        var numbers = result.match(new RegExp(_this3.allowedChars, 'ig'));
        return numbers;
      }).then(function (result) {
        var maskArray = _this3.mask.split('');

        var maskArrayChars = _this3.mask.match(new RegExp(_this3.allowedChars, 'ig'));

        var count = 0;

        for (var i = 0; i < maskArray.length; i++) {
          if (maskArrayChars && maskArrayChars[count]) {
            if (result && maskArrayChars[count] == result[count]) {
              count++;
              continue;
            }
          }

          if (maskArray[i] == _this3.symbol && result && result[count]) {
            maskArray[i] = result[count];
            _this3.carerPosition = i + 1;
            count++;
          } else if (maskArray[i] == _this3.symbol && result && !result[count]) {
            maskArray = maskArray.slice(0, i);
            _this3.carerPosition = i + 1;
          }
        }

        return maskArray;
      }).then(function (result) {
        _this3.value = result.join('');
      }).then(function () {
        _this3.displayResult();
      }).catch(function (e) {});
    }
  }, {
    key: "__mask",
    value: function __mask(e) {
      if (e.key == "Meta" || e.keyIdentifier == "Meta" || e.keyCode == 91 || e.metaKey == true || e.ctrlKey == true) {} else {
        e.preventDefault();
      }

      var key = this.whatIsKey(e);
      var keys = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'Backspace', 'Delete'];
      !this.keysArray && (this.keysArray = []);

      if (keys.indexOf(key) === -1) {
        return;
      }

      if (key == 'Backspace' || key == 'Delete') {
        if (!this.keysArray.length) return;
        this.keysArray.pop();
      } else {
        var symbolsInMask = this.mask.match(new RegExp(this.symbol, 'ig'));
        if (symbolsInMask.length > this.keysArray.length) this.keysArray.push(key);else return;
      }

      if (this.keysArray.length == 0) {
        this.value = this.mask;
        this.carerPosition = this.mask.indexOf(this.symbol);
      } else {
        var maskArray = this.mask.split('');
        var count = 0;

        for (var i = 0; i < maskArray.length; i++) {
          if (maskArray[i] == this.symbol && this.keysArray[count]) {
            maskArray[i] = this.keysArray[count];
            this.carerPosition = i + 1;
            count++;
          }
        }

        this.value = maskArray.join('');
      }

      this.displayResult();
    }
  }, {
    key: "setCaretPosition",
    value: function setCaretPosition(ctrl, start, end) {
      // IE >= 9 and other browsers
      if (ctrl.setSelectionRange) {
        ctrl.focus();
        ctrl.setSelectionRange(start, end);
      } // IE < 9
      else if (ctrl.createTextRange) {
          var range = ctrl.createTextRange();
          range.collapse(true);
          range.moveEnd('character', end);
          range.moveStart('character', start);
          range.select();
        }
    }
  }, {
    key: "whatIsKey",
    value: function whatIsKey(e) {
      var key = null;

      if (e.key) {
        key = e.key;
      } else if (event.keyCode) {
        switch ('' + event.keyCode) {
          case '48':
            key = '0';
            break;

          case '49':
            key = '1';
            break;

          case '50':
            key = '2';
            break;

          case '51':
            key = '3';
            break;

          case '52':
            key = '4';
            break;

          case '53':
            key = '5';
            break;

          case '54':
            key = '6';
            break;

          case '55':
            key = '7';
            break;

          case '56':
            key = '8';
            break;

          case '57':
            key = '9';
            break;

          case '8':
            key = 'Backspace';
            break;

          case '46':
            key = 'Delete';
            break;
        }
      } else if (event.keyIdentifier) {
        switch ('' + event.keyIdentifier) {
          case 'U+0030':
            key = '0';
            break;

          case 'U+0031':
            key = '1';
            break;

          case 'U+0032':
            key = '2';
            break;

          case 'U+0033':
            key = '3';
            break;

          case 'U+0034':
            key = '4';
            break;

          case 'U+0035':
            key = '5';
            break;

          case 'U+0036':
            key = '6';
            break;

          case 'U+0037':
            key = '7';
            break;

          case 'U+0038':
            key = '8';
            break;

          case 'U+0039':
            key = '9';
            break;

          case 'U+0008':
            key = 'Backspace';
            break;
        }
      }

      return key;
    }
  }, {
    key: "pasteWithMask",
    value: function pasteWithMask(e) {
      var _this4 = this;

      var pasteData = e.clipboardData && e.clipboardData.getData('Text');
      Promise.resolve().then(function () {
        if (pasteData) {
          e.preventDefault();
          return pasteData.match(new RegExp(_this4.allowedChars, 'gi'));
        } else {
          return new Promise(function (resolve) {
            requestAnimationFrame(function () {
              requestAnimationFrame(function () {
                resolve(_this4.element.value.match(new RegExp(_this4.allowedChars, 'gi')));
              });
            });
          });
        }
      }).then(function (data) {
        if (!data) throw new Error('Пусто во вставке');

        if (data.length >= _this4.maskSymbols.length) {
          _this4.checkDoubleMaskSymbols(data);
        } else {
          for (var i = 0; i < data.length; i++) {
            if (_this4.keysArray.length < _this4.allowedCharsLength) _this4.keysArray.push(data[i]);
          }
        }
      }).then(function () {
        var maskArray = _this4.mask.split('');

        var count = 0;

        for (var i = 0; i < maskArray.length; i++) {
          if (maskArray[i] == _this4.symbol && _this4.keysArray[count]) {
            maskArray[i] = _this4.keysArray[count];
            _this4.carerPosition = i + 1;
            count++;
          }
        }

        _this4.value = maskArray.join('');

        _this4.displayResult();
      }).catch(function (e) {
        console.log('Пустота', e);
      });
    }
  }, {
    key: "pasteWithSimpleMask",
    value: function pasteWithSimpleMask() {
      this.__simpleMask();
    }
  }, {
    key: "displayResult",
    value: function displayResult() {
      var lengthAllowedChars = this.value && this.value.match(new RegExp(this.allowedChars, 'gi'));

      if (this.maskSymbols.length === lengthAllowedChars) {
        if (this.value != this.lastValue) {
          this.lastValue = this.value;
        }
      }

      this.element.value = this.value;
      this.setCaretPosition(this.element, this.carerPosition, this.carerPosition);
      this.element.dispatchEvent(new Event('input'));
    }
  }, {
    key: "checkKeyCodeSupport",
    value: function checkKeyCodeSupport() {
      var _this5 = this;

      this.method = 'mask';

      var checkKeyCode = function checkKeyCode(e) {
        if (_this5.allowedChars == '[0-9]' && e.keyCode !== 0 || e.keyCode !== 229) {
          _this5.method = 'mask';
        } else {
          _this5.method = 'simpleMask';
        }

        removeEventListener('keydown', checkKeyCode);
      };

      addEventListener('keydown', checkKeyCode);
    }
  }, {
    key: "checkDoubleMaskSymbols",
    value: function checkDoubleMaskSymbols(data) {
      this.keysArray = [];

      for (var i = 0; i < this.maskSymbols.length; i++) {
        if (data[i] != this.maskSymbols[i] && this.keysArray.length < this.allowedCharsLength) {
          this.keysArray.push(data[i]);
        }
      }

      for (; i < data.length; i++) {
        if (this.keysArray.length < this.allowedCharsLength) this.keysArray.push(data[i]);else break;
      }
    }
  }, {
    key: "test",
    value: function test() {
      var regexp = new RegExp(this.symbol);
      return !regexp.test(this.value);
    }
  }, {
    key: "clear",
    value: function clear() {
      this.keysArray = [];
      this.element.value = '';
    }
  }]);

  return Mask;
}();

exports.default = Mask;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

// import TransitionEnd from '../../../layout/js/transitionEnd';
var Tab =
/*#__PURE__*/
function () {
  function Tab(el) {
    _classCallCheck(this, Tab);

    this.tabLabelGroup = document.getElementsByClassName('tabs__labelGroup')[0];
    this.tabLabelItem = document.getElementsByClassName('tabs__label');
    this.labelCurrentIndicator = document.getElementsByClassName('tabs__labelCurrentLine')[0];
    this.tabContentGroup = document.getElementsByClassName('tabs__contentGroup')[0];
    this.tabContentItem = this.tabContentGroup.children;

    for (var i = 0; i < this.tabLabelItem.length; i++) {
      this.addListener(this.tabLabelItem[i]);
    }

    this.setCurrentTab(document.getElementsByClassName('tabs__label--current')[0]);
  }

  _createClass(Tab, [{
    key: "addListener",
    value: function addListener(element) {
      var _this = this;

      element.addEventListener('click', function (event) {
        _this.removeCurrentTab(_this.tabLabelItem);

        _this.setCurrentTab(event.target);
      });
    }
  }, {
    key: "removeCurrentTab",
    value: function removeCurrentTab(elements) {
      for (var i = 0; i < elements.length; i++) {
        elements[i].classList.remove("tabs__label--current");
        this.tabContentItem[i].classList.add('none');
      }
    }
  }, {
    key: "setCurrentTab",
    value: function setCurrentTab(element) {
      this.animationCurrentIndicator(element); // label

      element.classList.add("tabs__label--current"); // content

      var activeElement = element.getAttribute('data-id');

      for (var i = 0; i < this.tabContentItem.length; i++) {
        if (this.tabContentItem[i].getAttribute('data-id') == activeElement) {
          this.tabContentItem[i].style.display = 'block';
          var height = this.tabContentItem[i].children[0].offsetHeight; // console.log(height);

          this.tabContentGroup.style.height = height + 'px';
          this.tabContentItem[i].style.opacity = 1;
        } else {
          this.tabContentItem[i].style.opacity = 0;
          this.tabContentItem[i].style.display = 'none';
        }
      }
    }
  }, {
    key: "animationCurrentIndicator",
    value: function animationCurrentIndicator(element) {
      var _this2 = this;

      requestAnimationFrame(function () {
        requestAnimationFrame(function () {
          _this2.labelCurrentIndicator.style.left = element.offsetLeft + 'px';
          _this2.labelCurrentIndicator.style.width = element.offsetWidth + 'px';
        });
      });
    }
  }]);

  return Tab;
}();

exports.default = Tab;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.ClassName = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var ClassName = {
  OPENED: 'tabs__select--isOpened'
}; // import TransitionEnd from '../../../layout/js/transitionEnd';

exports.ClassName = ClassName;

var TabSelectMobile =
/*#__PURE__*/
function () {
  function TabSelectMobile(element) {
    _classCallCheck(this, TabSelectMobile);

    if (!element) {
      return;
    }

    this.element = element;
    this.tabLabelGroup = this.element.getElementsByClassName('tabs__labelGroup')[0];
    this.tabLabelItem = this.element.getElementsByClassName('tabs__label');
    this.labelCurrentIndicator = this.element.getElementsByClassName('tabs__labelCurrentLine')[0];
    this.tabContentGroup = this.element.getElementsByClassName('tabs__contentGroup')[0];
    this.tabContentItem = this.tabContentGroup.children;
    this.selectTrigger = this.element.querySelector('.tabs__select');
    this.selectPlaceholder = this.element.getElementsByClassName('tabs__selectPlaceholder')[0];
    this.selectDropdown = this.element.querySelector('.tabs__selectDropdown');
    this.selectDropdownWrap = this.element.querySelector('.tabs__dropdownInner');
    this.dropdownPaddingTop = 35;
    this.dropdownPaddingBottom = 20;
    this.isOpened = false;

    for (var i = 0; i < this.tabLabelItem.length; i++) {
      this.addListener(this.tabLabelItem[i]);
    }

    this.addListenerSelect(this.selectTrigger);
    this.setCurrentTab(document.getElementsByClassName('tabs__label--current')[0]);
  }

  _createClass(TabSelectMobile, [{
    key: "handleDocumentClick",
    value: function handleDocumentClick(_ref) {
      var target = _ref.target;

      if (!this.selectTrigger.contains(target)) {
        this.close();
      }
    }
  }, {
    key: "addListenerSelect",
    value: function addListenerSelect(element) {
      var _this = this;

      element.addEventListener('click', function (event) {
        _this.toggle();
      });
    }
  }, {
    key: "addListener",
    value: function addListener(element) {
      var _this2 = this;

      element.addEventListener('click', function (event) {
        _this2.removeCurrentTab(_this2.tabLabelItem);

        _this2.setCurrentTab(event.target);
      });
    }
  }, {
    key: "removeCurrentTab",
    value: function removeCurrentTab(elements) {
      for (var i = 0; i < elements.length; i++) {
        elements[i].classList.remove("tabs__label--current");
        this.tabContentItem[i].classList.add('none');
      }
    }
  }, {
    key: "toggle",
    value: function toggle() {
      if (this.isOpened) {
        this.close();
      } else {
        this.open();
      }
    }
  }, {
    key: "open",
    value: function open() {
      document.addEventListener('click', this.handleDocumentClick.bind(this));
      this.selectTrigger.classList.add(ClassName.OPENED);
      this.setPaddingOnDropdown();
      this.selectDropdown.style.height = this.getOpenHeight();
      this.isOpened = true;
    }
  }, {
    key: "close",
    value: function close() {
      document.removeEventListener('click', this.handleDocumentClick.bind(this));
      this.selectTrigger.classList.remove(ClassName.OPENED);
      this.removePaddingOnDropdown();
      this.selectDropdown.style.height = 0;
      this.isOpened = false;
    }
  }, {
    key: "getOpenHeight",
    value: function getOpenHeight() {
      return this.selectDropdownWrap.scrollHeight + this.dropdownPaddingTop + this.dropdownPaddingBottom;
    }
  }, {
    key: "setPaddingOnDropdown",
    value: function setPaddingOnDropdown() {
      this.selectDropdown.style.paddingTop = this.dropdownPaddingTop;
      this.selectDropdown.style.paddingBottom = this.dropdownPaddingBottom;
    }
  }, {
    key: "removePaddingOnDropdown",
    value: function removePaddingOnDropdown() {
      this.selectDropdown.style.paddingTop = '';
      this.selectDropdown.style.paddingBottom = '';
    }
  }, {
    key: "setCurrentTab",
    value: function setCurrentTab(element) {
      // this.animationCurrentIndicator(element);
      // label
      element.classList.add("tabs__label--current");
      this.selectPlaceholder.innerHTML = element.innerHTML; // content

      var activeElement = element.getAttribute('data-id');

      for (var i = 0; i < this.tabContentItem.length; i++) {
        if (this.tabContentItem[i].getAttribute('data-id') == activeElement) {
          this.tabContentItem[i].style.display = 'block';
          var height = this.tabContentItem[i].children[0].offsetHeight; // console.log(height);

          this.tabContentGroup.style.height = height + 'px';
          this.tabContentItem[i].style.opacity = 1;
        } else {
          this.tabContentItem[i].style.opacity = 0;
          this.tabContentItem[i].style.display = 'none';
        }
      }
    } // animationCurrentIndicator(element) {
    // 	requestAnimationFrame(() => {
    // 		requestAnimationFrame(() => {
    // 			this.labelCurrentIndicator.style.left = element.offsetLeft + 'px';
    // 			this.labelCurrentIndicator.style.width = element.offsetWidth + 'px';
    // 		});
    // 	});
    // }

  }]);

  return TabSelectMobile;
}();

exports.default = TabSelectMobile;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _animation = _interopRequireDefault(__webpack_require__(/*! ../../layout/js/animation */ "./src/layout/js/animation.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var contentHeader =
/*#__PURE__*/
function (_Animations) {
  _inherits(contentHeader, _Animations);

  function contentHeader(element) {
    var _this;

    _classCallCheck(this, contentHeader);

    _this = _possibleConstructorReturn(this, (contentHeader.__proto__ || Object.getPrototypeOf(contentHeader)).call(this));
    _this.el = element;
    _this.wrap = _this.el.querySelector('.contentHeader__wrap');
    _this.fullHeight = _this.wrap.offsetHeight;
    _this.container = _this.wrap.querySelector('.contentHeader__content');
    _this.paragrafCount = _this.container.querySelectorAll('.contentHeader__wrap p').length;
    _this.isMobile = document.documentElement.clientWidth <= 480;

    if (_this.fullHeight > 200 && _this.paragrafCount > (_this.isMobile ? 1 : 2)) {
      _this.beginHeight = 0;

      if (_this.isMobile) {
        _this.firstP = _this.container.querySelector('.contentHeader__wrap p:first-child');
      } else {
        _this.firstP = _this.container.querySelector('.contentHeader__wrap p:first-child');
        _this.secondP = _this.container.querySelector('.contentHeader__wrap p:first-child + p');
      }

      _this.separaterP = parseFloat(getComputedStyle(_this.firstP).getPropertyValue('margin-top'), 10);

      _this.setBeginHeight(_this.getBeginHeight());

      _this.buttonTextShow = 'Показать полностью';
      _this.buttonTextHide = 'Свернуть';
      _this.button = _this.addButton();

      _this.button.addEventListener('click', function (event) {
        return _this.triggerHeight();
      });
    }

    return _this;
  }

  _createClass(contentHeader, [{
    key: "getBeginHeight",
    value: function getBeginHeight() {
      if (this.isMobile) {
        this.beginHeight = this.firstP.offsetHeight + this.separaterP;
      } else {
        this.beginHeight = this.firstP.offsetHeight + this.secondP.offsetHeight + this.separaterP * 2;
      }

      return this.beginHeight;
    }
  }, {
    key: "setBeginHeight",
    value: function setBeginHeight(beginHeight) {
      this.wrap.style.height = this.fullHeight + 'px';
      this.heightAnimation(beginHeight);
    }
  }, {
    key: "heightAnimation",
    value: function heightAnimation(height) {
      var _this2 = this;

      var start = Date.now();
      var heightStart = parseFloat(this.wrap.style.height, 10);
      var heightEnd = height;
      var duration = Math.abs(heightStart - heightEnd) / 2000 * 1000;

      var animate = function animate() {
        var progress = _this2.__progress(start, duration);

        _this2.wrap.style.height = heightStart + (heightEnd - heightStart) * progress + 'px';

        if (progress === 1) {
          return;
        }

        requestAnimationFrame(animate);
      };

      requestAnimationFrame(animate);
    }
  }, {
    key: "getEndHeight",
    value: function getEndHeight() {
      this.fullHeight = this.container.offsetHeight + this.separaterP;
      return this.fullHeight;
    }
  }, {
    key: "openContainer",
    value: function openContainer() {
      this.heightAnimation(this.getEndHeight());
      this.el.classList.add('contentHeader--opened');
      this.button.innerHTML = this.buttonTextHide;
    }
  }, {
    key: "closeContainer",
    value: function closeContainer() {
      this.heightAnimation(this.getBeginHeight());
      this.el.classList.remove('contentHeader--opened');
      this.button.innerHTML = this.buttonTextShow;
    }
  }, {
    key: "addButton",
    value: function addButton() {
      var button = document.createElement("div");
      button.className = 'contentHeader__buttonMore';
      button.innerHTML = '<div>' + this.buttonTextShow + '</div>';
      this.el.appendChild(button);
      return button.getElementsByTagName('div')[0];
    }
  }, {
    key: "triggerHeight",
    value: function triggerHeight() {
      if (this.el.classList.contains('contentHeader--opened')) {
        this.closeContainer();
      } else {
        this.openContainer();
      }
    }
  }]);

  return contentHeader;
}(_animation.default);

exports.default = contentHeader;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _animation = _interopRequireDefault(__webpack_require__(/*! ../../layout/js/animation */ "./src/layout/js/animation.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var contentHeader =
/*#__PURE__*/
function (_Animations) {
  _inherits(contentHeader, _Animations);

  function contentHeader(element) {
    var _this;

    _classCallCheck(this, contentHeader);

    _this = _possibleConstructorReturn(this, (contentHeader.__proto__ || Object.getPrototypeOf(contentHeader)).call(this));
    _this.el = element;
    _this.scrollElement = _this.el.querySelector('.eventFilter__monthGroup');
    _this.leftButton = _this.el.querySelector('.eventFilter__arrowPrev');
    _this.rightButton = _this.el.querySelector('.eventFilter__arrowNext');

    _this.leftButton.addEventListener('click', function (event) {
      return _this.scrollToRight();
    });

    _this.rightButton.addEventListener('click', function (event) {
      return _this.scrollToLeft();
    });

    return _this;
  }

  _createClass(contentHeader, [{
    key: "scrollToLeft",
    value: function scrollToLeft() {
      this.scrollElement.classList.remove('scrollToLeft');
      this.scrollElement.classList.add('scrollToRight');
      this.rightButton.classList.add('eventFilter__arrow--inActive');
      this.leftButton.classList.remove('eventFilter__arrow--inActive'); // console.log('left');
    }
  }, {
    key: "scrollToRight",
    value: function scrollToRight() {
      this.scrollElement.classList.add('scrollToLeft');
      this.scrollElement.classList.remove('scrollToRight');
      this.rightButton.classList.remove('eventFilter__arrow--inActive');
      this.leftButton.classList.add('eventFilter__arrow--inActive'); // console.log('right');
    }
  }]);

  return contentHeader;
}(_animation.default);

exports.default = contentHeader;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _default =
/*#__PURE__*/
function () {
  function _default(videoContainer) {
    _classCallCheck(this, _default);

    this.videoContainer = videoContainer;
    this.video = this.videoContainer.querySelector('video');

    if (!this.video) {
      return;
    }

    this.btn = this.videoContainer.querySelector('.videoSource__playBtn');
    this.listener();
  }

  _createClass(_default, [{
    key: "listener",
    value: function listener() {
      var _this = this;

      this.btn.addEventListener('click', function () {
        return _this.play();
      });
    }
  }, {
    key: "play",
    value: function play() {
      this.video.play();
      this.btn.classList.add('videoSource__playBtn--hidden');
      this.video.classList.remove('controlsHidden');
      this.video.setAttribute('controls', 'controls');
    }
  }]);

  return _default;
}();

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _default =
/*#__PURE__*/
function () {
  function _default(timer) {
    _classCallCheck(this, _default);

    this.timer = timer;
    this.timeWrap = this.timer.querySelector('.time');
    this.timeArray = this.timeWrap.innerText.split(':');
    this.hours = +this.timeArray[0];
    this.min = +this.timeArray[1];
    this.sec = +this.timeArray[2];
    this.time = this.hours * 3600 + this.min * 60 + this.sec;
    this.displayTime();
  }

  _createClass(_default, [{
    key: "displayTime",
    value: function displayTime() {
      setInterval(this.changeTime.bind(this), 1000);
    }
  }, {
    key: "changeTime",
    value: function changeTime() {
      if (this.time <= 0) {
        return;
      }

      this.time -= 1;
      var formatedHours = this.getFormatedPart(this.getHours());
      var formatedMin = this.getFormatedPart(this.getMin());
      var formatedSec = this.getFormatedPart(this.getSec());
      var formatedTime = "".concat(formatedHours, ":").concat(formatedMin, ":").concat(formatedSec);
      this.timeWrap.innerText = formatedTime;
    }
  }, {
    key: "getFormatedPart",
    value: function getFormatedPart(part) {
      return part > 9 ? "".concat(part) : "0".concat(part);
    }
  }, {
    key: "getHours",
    value: function getHours() {
      return Math.floor(this.time / 3600);
    }
  }, {
    key: "getMin",
    value: function getMin() {
      return Math.floor(this.time / 60) - this.getHours() * 60;
    }
  }, {
    key: "getSec",
    value: function getSec() {
      return this.time - this.getHours() * 3600 - this.getMin() * 60;
    }
  }]);

  return _default;
}();

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _default =
/*#__PURE__*/
function () {
  function _default(jumper) {
    _classCallCheck(this, _default);

    this.jumper = jumper;
    this.siteHeader = document.querySelector('.container__siteHeader--fixed');
    this.siteHeaderHeight = this.siteHeader.offsetHeight;
    this.itemNameToJump = this.jumper.getAttribute('href');
    this.itemToJump = document.querySelector(this.itemNameToJump);
    this.listener();
  }

  _createClass(_default, [{
    key: "listener",
    value: function listener() {
      var _this = this;

      this.jumper.addEventListener('click', function (event) {
        event.preventDefault();

        _this.jump();
      });
    }
  }, {
    key: "jump",
    value: function jump() {
      var speed = 0.5;
      var offsetY = window.pageYOffset;
      var itemOffsetY = this.itemToJump.getBoundingClientRect().top - this.siteHeaderHeight;
      var stopItemName = this.itemNameToJump;
      var start = null;

      var animation = function animation(time) {
        if (start === null) start = time;
        var progress = time - start;
        var stopPosition;

        if (itemOffsetY < 0) {
          stopPosition = Math.max(offsetY - progress / speed, offsetY + itemOffsetY);
        } else {
          stopPosition = Math.min(offsetY + progress / speed, offsetY + itemOffsetY);
        }

        window.scrollTo(0, stopPosition);

        if (stopPosition != offsetY + itemOffsetY) {
          requestAnimationFrame(animation);
        }
      };

      requestAnimationFrame(animation);
    }
  }]);

  return _default;
}();

exports.default = _default;

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _default =
/*#__PURE__*/
function () {
  function _default(comment) {
    _classCallCheck(this, _default);

    this.comment = comment;
    this.replyBtn = this.comment.querySelector('.js-replyBtn');
    this.replyFormWrap = this.comment.querySelector('.js-replyFormWrap');
    this.hideForm();
    this.listener();
  }

  _createClass(_default, [{
    key: "listener",
    value: function listener() {
      var _this = this;

      this.replyBtn.addEventListener('click', function (event) {
        _this.toggleForm();
      });
    }
  }, {
    key: "toggleForm",
    value: function toggleForm() {
      this.isHide ? this.showForm() : this.hideForm();
    }
  }, {
    key: "showForm",
    value: function showForm() {
      this.replyFormWrap.style.height = this.replyFormWrap.scrollHeight;
      this.isHide = false;
    }
  }, {
    key: "hideForm",
    value: function hideForm() {
      this.replyFormWrap.style.height = 0;
      this.isHide = true;
    }
  }]);

  return _default;
}();

exports.default = _default;
/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9uZXdzSXRlbS9qcy9waG90by5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbGF5b3V0L2pzL2RldmVsb3BtZW50TW9kZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbGF5b3V0L2pzL3Njcm9sbFRvVG9wLmpzIiwid2VicGFjazovLy8uL3NyYy9sYXlvdXQvanMvbm90eS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcGFnZXMvY29udGVudC9jb250ZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9wYWdlcy9jb250ZW50L2NvbnRlbnQuY3NzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL3NlbGVjdERhdGVSYW5nZS9zZWxlY3REYXRlUmFuZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvc2VsZWN0RGF0ZVJhbmdlL1NlbGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9zZWxlY3REYXRlUmFuZ2UvZGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9oZWFkZXIvaGVhZGVyLmpzIiwid2VicGFjazovLy8uL3NyYy9sYXlvdXQvanMvYmFja2dyb3VuZC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbGF5b3V0L2pzL3RyYW5zaXRpb25FbmQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaGVhZGVyL2pzL2ZpeEhlYWQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaGVhZGVyL2pzL21lbnVUcmlnZ2VyLmpzIiwid2VicGFjazovLy8uL3NyYy9sYXlvdXQvanMvc2Nyb2xsLmpzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hlYWRlci9qcy9zZWFyY2hUcmlnZ2VyLmpzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hlYWRlck1vYmlsZS9oZWFkZXJNb2JpbGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaGVhZGVyQmxvZy9oZWFkZXJCbG9nLmpzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2hlYWRlckJsb2cvanMvc3Vic2NyaWJlVHJpZ2dlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9oZWFkZXJCbG9nL2pzL2hlYWRlckJsb2dCdXJnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvdGFnc0ZpbHRlci90YWdzRmlsdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wb3B1cC13aW5kb3ctbW9kdWxlL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2p1c3RpZmllZEdhbGxlcnkvanMvcGhvdG8uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2VzL3RpdGxlL2pzL2JhbGwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xheW91dC9qcy9jbGljay5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbGF5b3V0L2pzL2N1c3RvbUxpc3RlbmVyLmpzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL25ld3NJdGVtL2pzL3ZpZGVvLmpzIiwid2VicGFjazovLy8uL3NyYy9sYXlvdXQvanMvc2VydmljZVdvcmtlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9uZXdzSXRlbS9qcy9QREZWaWV3ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2p1c3RpZmllZEdhbGxlcnkvZGlzdC9qcy9qcXVlcnkuanVzdGlmaWVkR2FsbGVyeS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9qdXN0aWZpZWRHYWxsZXJ5L2p1c3RpZmllZEdhbGxlcnkuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvbmV3c0l0ZW0vbmV3c0l0ZW0uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvc2xpZGVyL3NsaWRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9jYXJkUHJvZmlsZS9jYXJkUHJvZmlsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXdlc29tcGxldGUvYXdlc29tcGxldGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL3NlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9uZXdzRmlsdGVyL25ld3NGaWx0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvc3dpdGNoU2VsZWN0L3N3aXRjaFNlbGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZHJhdy1tb2R1bGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvbWFwL21hcC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9nb29nbGVNYXAvZ29vZ2xlTWFwLmpzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2luZm9DYXJkL2luZm9DYXJkLmpzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2F1ZGlvRmlsZS9hdWRpb0ZpbGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvZm9ybS9mb3JtLmpzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2lucHV0VGV4dC9pbnB1dFRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaW5wdXRTZWxlY3QvaW5wdXRTZWxlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvdGV4dGFyZWEvdGV4dGFyZWEuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvbG9hZEZpbGVEcnVnTkRyb3AvbG9hZEZpbGVEcnVnTkRyb3AuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xheW91dC9qcy92YWxpZGF0aW9uLmpzIiwid2VicGFjazovLy8uL3NyYy9sYXlvdXQvanMvbWFzay5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy90YWJzL3RhYnMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvdGFic1NlbGVjdE1vYmlsZS90YWJzU2VsZWN0TW9iaWxlLmpzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2NvbnRlbnRIZWFkZXIvY29udGVudEhlYWRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9ldmVudEZpbHRlci9ldmVudEZpbHRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy92aWRlb0Jsb2NrL3ZpZGVvQmxvY2suanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvdmlkZW9QbHVnL3ZpZGVvUGx1Zy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9qdW1wZXIvanVtcGVyLmpzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2NvbW1lbnQvY29tbWVudC5qcyJdLCJuYW1lcyI6WyJjYXJkIiwidGFyZ2V0IiwibG9naWMiLCJNb2RhbEVsIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiaWQiLCJpbm5lckhUTUwiLCJjb250ZW50IiwicXVlcnlTZWxlY3RvciIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImVsIiwiY2xvc2VzdCIsImdlbmVyYXRlTW9kYWxIVE1MIiwiZmV0Y2giLCJnZXRBdHRyaWJ1dGUiLCJkYXRhIiwianNvbiIsIm1hcCIsIml0ZW0iLCJpbWFnZSIsInRodW1iIiwiam9pbiIsIm5vcm1hbCIsInRpdGxlIiwiYWxidW0iLCJkZXNjcmlwdGlvbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJkZXN0cm95IiwiZ2FsbGVyeVRvcCIsIlN3aXBlciIsInNwYWNlQmV0d2VlbiIsImNlbnRlcmVkU2xpZGVzIiwic2xpZGVzUGVyVmlldyIsInRvdWNoUmF0aW8iLCJzbGlkZVRvQ2xpY2tlZFNsaWRlIiwiZ2FsbGVyeVRodW1icyIsIm5hdmlnYXRpb24iLCJuZXh0RWwiLCJwcmV2RWwiLCJwYWdpbmF0aW9uIiwiY29udHJvbGxlciIsImNvbnRyb2wiLCJyZW1vdmUiLCJEZXZlbG9wbWVudE1vZGUiLCJvcHRpb25zIiwibW9iaWxlV29yZHMiLCJ0YWJsZXRXb3JkcyIsImRlc2t0b3BXb3JkcyIsImNsZWFyV29yZHMiLCJzaG93U3RhdHVzV29yZHMiLCJ0b1BhZ2VzV29yZHMiLCJrZXlzIiwiYXJyYXlLZXl3b3JkcyIsImNvbmNhdCIsImtleSIsImV2ZW50Iiwia2V5Q29kZSIsImxhbmd0aCIsInNoaWZ0IiwicHVzaCIsInRvTG93ZXJDYXNlIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwid29yZCIsImkiLCJsZW5ndGgiLCJpbmRleE9mIiwia2V5TG9naWMiLCJ0aW1lb3V0IiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsImlzTW9iaWxlIiwiaXNUYWJsZXQiLCJpc0Rlc2t0b3AiLCJzaG93U3RhdHVzIiwiaW5jbHVkZXMiLCJjbGVhciIsIndpbmRvdyIsImxvY2F0aW9uIiwiaHJlZiIsIm1vYmlsZSIsInRhYmxldCIsImRlc2t0b3AiLCJ0ZXN0IiwiY29va2llIiwic3R5bGUiLCJwb3NpdGlvbiIsInRvcCIsInJpZ2h0IiwicGFkZGluZyIsImJvcmRlclJhZGl1cyIsImJhY2tncm91bmQiLCJ6SW5kZXgiLCJzdGF0dXMiLCJ0ZXh0IiwiaW5uZXJUZXh0IiwiU2Nyb2xsVG9Ub3AiLCJzY3JvbGwiLCJzdGFydCIsIkRhdGUiLCJub3ciLCJwYWdlWU9mZnNldCIsImR1cmF0aW9uIiwiYmxvY2tTY3JvbGwiLCJwcmV2ZW50RGVmYXVsdCIsImFuaW1hdGUiLCJwcm9ncmVzcyIsIl9fcHJvZ3Jlc3MiLCJzY3JvbGxUbyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJBbmltYXRpb24iLCJzdHlsZXMiLCJub3R5SWQiLCJsYXN0TXNnIiwiTVNHX0lOVEVSVkFMIiwidGltZVRvQ2xvc2UiLCJOb3R5IiwiYXJndW1lbnRzIiwiT2JqZWN0IiwiY3JlYXRlQ29udGFpbmVyIiwidGltZSIsImRpZmYiLCJjcmVhdGVNZXNzYWdlIiwiaGVhZCIsIm1lc0NvbnRhaW4iLCJjcmVhdGVFbCIsIm1lcyIsImNsYXNzIiwiY2xvc2UiLCJjbGFzc0xpc3QiLCJhZGQiLCJjb250YWluZXIiLCJjbG9zZU1lc3NhZ2UiLCJiaW5kIiwid2lkdGgiLCJvZmZzZXRXaWR0aCIsImhlaWdodCIsIm9mZnNldEhlaWdodCIsInRhZyIsImdldEVsZW1lbnRCeUlkIiwidWwiLCJpbnNlcnRCZWZvcmUiLCJmaXJzdENoaWxkIiwiYXJnIiwidmFsIiwiVW5yb2xsIiwiZWxlbSIsImJ0biIsImRhdGFDb250YWluZXIiLCJoYW5kbGVCdG5DbGljayIsImlzT3BlbmVkIiwic2Nyb2xsSGVpZ2h0IiwiaW5pdFVucm9sbCIsIkFycmF5IiwiZnJvbSIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIiwiU2VsZWN0RGF0ZVJhbmdlIiwiZWxlbWVudCIsInN0YXJ0U2VsZWN0IiwiU2VsZWN0IiwiZW5kU2VsZWN0IiwiaW5zZXJ0SW50byIsImZpZWxkIiwidGV4dENvbnRlbnQiLCJzZWxlY3RFbCIsImN1cnJlbnRFbCIsInBhcmVudEVsZW1lbnQiLCJ0b2dnbGVCdG4iLCJkcm9wZG93biIsInRpdGxlRWxlbSIsInllYXJzQ29udGFpbmVyIiwibW9udGhzQ29udGFpbmVyIiwic2VsZWN0ZWREYXRlIiwibW9udGgiLCJ5ZWFyIiwiYWRkRXZlbnRMaXN0ZW5lcnMiLCJ0b2dnbGUiLCJzZWxlY3RZZWFyIiwic2VsZWN0TW9udGgiLCJzZXRZZWFyIiwiTnVtYmVyIiwibG9ja05vblB1cmNoYXNlZE1vbnRoIiwidW5sb2NrQWxsTW9udGgiLCJjb250YWlucyIsInNldE1vbnRoIiwib3BlbiIsImNsaWNrT25XaW5kb3dIYW5kbGVyIiwiY3JuTW9udGhOdW1iZXIiLCJtb250aExpc3QiLCJtb250aEVsIiwibW9udGhOYW1lIiwibW9udGhOdW1iZXIiLCJsb2NrZWRNb250aEVsbXMiLCJjdXJyZW50RGF0ZSIsImN1cnJlbnRZZWFyIiwiZ2V0RnVsbFllYXIiLCJjdXJyZW50TW9udGgiLCJnZXRNb250aCIsIm1vbnRocyIsImdldEN1cnJlbnRZZWFyIiwiZ2V0Q3VycmVudE1vbnRoTnVtYmVyIiwiZ2V0TW9udGhOdW1iZXIiLCJCRyIsIk1lbnUiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiRml4SGVhZCIsIk1lbnVUcmlnZ2VyIiwidGhlbiIsIm1vZHVsZSIsIlNlYXJjaFRyaWdnZXIiLCJkZWZhdWx0IiwiU2Nyb2xsIiwic2Nyb2xsU3R5bGUiLCJoZWFkZXIiLCJoZWFkZXJDb250YWluZXIiLCJwYXJlbnROb2RlIiwiYmciLCJuYXYiLCJsaW5rcyIsIm1lbnUiLCJCYWNrZ3JvdW5kIiwiaGVhZGVyTG9naWMiLCJjYWxsIiwiaGVhZEJsb2NrTmFtZSIsImRhdGFzZXQiLCJhY3RpdmUiLCJmYWRlT3V0Iiwic2hvd0FjdGl2ZUJsb2NrIiwib3BlbmVkSGVhZGVyIiwiaGlkZSIsImZhZGVJbiIsImRlbGF5Iiwic2hvdyIsImhpZGVIZWFkTWVudSIsIkFuaW1hdGlvbnMiLCJiZ0VsZW1lbnQiLCJwYXJlbnRzIiwicGFyYW1ldGVyIiwidHJhbnNpdGlvbmVuZENhbGxiYWNrIiwiaW5pdCIsInBhcnNlSW50IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsInRyYW5zaXRpb25FbmQiLCJUcmFuc2l0aW9uRW5kIiwiY2FsbGJhY2siLCJfX2FuaW1hdGlvbkNvdW50IiwiX19zaG93aW5nIiwiYW5pbWF0aW9uTnVtYmVyIiwibWVudUhlaWdodCIsInZhbHVlIiwiX19oaWRpbmciLCJfX3Nob3dlZCIsImVuZCIsInBhcmVudCIsIkxpc3RlbmVyIiwicGFuZWxzIiwiaGVhZGVySGVpZ2h0IiwicGFnZU5hdiIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImJvdHRvbSIsIl9fZml4ZWQiLCJmaXgiLCJ1bkZpeCIsImhlbHBlckRpdiIsInBhcmVudERpdiIsInJlbW92ZUNoaWxkIiwidHJpZ2dlciIsImNsb3NlQnRuIiwiY291bnQiLCJfX3Njcm9sbFdpZHRoIiwiaW5uZXJXaWR0aCIsImNoZWNrZWQiLCJkb2N1bWVudEVsZW1lbnQiLCJtYXJnaW5SaWdodCIsInBhZGRpbmdSaWdodCIsInZpc2liaWxpdHkiLCJjbGljayIsIlNjcm9sbGJhciIsIl9fZWwiLCJvdmVyZmxvdyIsImdlbmVyYXRlQmFyIiwiYmFyU3R5bGVzIiwibGlzdGVuZXIiLCJnZW5lcmF0ZUNvbnRhaW5lciIsInNjcm9sbENvbnRhaW5lciIsInNjcm9sbFBhbmVsIiwiYXBwZW5kIiwiY1N0eSIsInBTdHkiLCJzZXRTY3JvbGwiLCJzY3JvbGxUb3AiLCJpbnB1dCIsImhlYWRlckJsb2NrSWNvbiIsIl9fbGlzdGVuZXJzIiwic3RvcFByb3BhZ2F0aW9uIiwiY2hpbGRMaXN0V3JhcCIsImNoaWxkTGlzdCIsImNoaWxkSGVpZ2h0IiwiSGVhZGVyQmxvZyIsImxvZ28iLCJoaWRkZW5FbCIsImNsb3NlSWNvbk1vYmlsZSIsImxpc3RlbmVycyIsIlN1YnNjcmliZVRyaWdnZXIiLCJjbG9zZUJ1dHRvbiIsInNjcm9sbFdpZHRoIiwic2hvd1N1YnNjcmliZSIsImNsb3NlU3Vic2NyaWJlIiwiY2xvc2VLZXlzIiwiYnVyZGVyQkciLCJzaG93QnVyZ2VyIiwiY2xvc2VCdXJnZXIiLCJUYWdzRmlsdGVyIiwidGFnc0NvbnRhaW5lciIsInRhZ3MiLCJ0YWdIZWlnaHQiLCJ0YWdNYXJnaW4iLCJtYXJnaW5Cb3R0b20iLCJ0YWdNYXJnaW5OdW1iZXIiLCJyZXBsYWNlIiwiaGVpZ2h0SW5kaWNhdG9yIiwidGFnc0NvbnRhaW5lckhlaWdodCIsInJvd0hlaWdodCIsIm1heEhlaWdodCIsImJ1dHRvbiIsImJ1dHRvblRyaWdnZXIiLCJzZXRCbG9jayIsInRhZ0FjdGl2ZSIsImJ1dHRvbkFjdGl2ZSIsImluaXRpYWxTbGlkZSIsInNsaWRlIiwiY29uc29sZSIsImxvZyIsIkJhbGwiLCJfX2JhbGxzIiwiYSIsImluaXRCYWxsIiwic2Nyb2xsVG9Ub3AiLCJOYW1lIiwiY2xpY2tCYWxsIiwiZm4iLCJ3aW5kb3dXaWR0aCIsImNsaWVudFdpZHRoIiwic2Nyb2xsQmFyIiwicmVzaXplTGlzdGVuZXIiLCJDdXN0b21MaXN0ZW5lciIsIngiLCJ5IiwiZGlzcGxheSIsImxlZnQiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJvcGVuQ29udGFpbmVyIiwidmlkZW9TZXR0aW5ncyIsImNsaWVudEhlaWdodCIsIlNpemUiLCJNYXRoIiwic3FydCIsInByb2dyZXNzU2l6ZSIsImNsb3NlQ2xpY2tMaXN0ZW5lciIsIkNsaWNrIiwiY2xvc2VDb250YWluZXIiLCJuZXdTY3JvbGwiLCJ2aWRlbyIsInBhdXNlIiwidmlkZW9MaXN0ZW5lcnMiLCJpZnJhbWUiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJzdG9wQnV0dG9uIiwicGxheSIsInRvZ2dsZVBsYXkiLCJ2aWRlb1NldFByb2dyZXNzIiwiZSIsIndoaWNoIiwiY2xpY2tQcm9ncmVzcyIsImN1cnJlbnRUaW1lIiwibXV0ZSIsIm11dGVkIiwiY2F0Y2giLCJhY3R1YWxQcm9ncmVzcyIsImFjdHVhbFRpbWUiLCJhY3R1YWxUaW1lX21pbnV0ZXMiLCJhY3R1YWxUaW1lX3NlY29uZHMiLCJmdWxsVGltZSIsImZ1bGxUaW1lX21pbnV0ZXMiLCJmdWxsVGltZV9zZWNvbmRzIiwiZnVsbE1pbiIsImZ1bGxTZWMiLCJhY3R1YWxNaW4iLCJhY3R1YWxTZWMiLCJ0cmFuc2l0aW9uIiwiYmFsbCIsInRlbXBsYXRlTnVtYmVyIiwiVmlkZW8iLCJjbGlja0V2ZW50IiwiYnV0dG9ucyIsInRlbXBsYXRlU3RyaW5nIiwidmlkZW9TdHJpbmciLCJkaXYiLCJ0ZW1wbGF0ZSIsImZpcnN0RWxlbWVudENoaWxkIiwiZm5PcGVuIiwic3RyaW5nIiwib24iLCJuYXZpZ2F0b3IiLCJ1bnJlZ1dvcmtlcnMiLCJyZWdzIiwic2VydmljZVdvcmtlciIsImdldFJlZ2lzdHJhdGlvbnMiLCJhcnIiLCJyZWciLCJ1bnJlZ2lzdGVyIiwicmVnaXN0ZXIiLCJyZWFkeSIsImVyciIsImRlbCIsIk1vZGFsIiwiYWZ0ZXJDbG9zZSIsImZsc2NyIiwib3JpZ2luYWxUZXh0IiwibWF4V2lkdGgiLCIkIiwicmVxdWlyZSIsImp1c3RpZmllZEdhbGxlcnkiLCJsYXN0Um93IiwibWFyZ2lucyIsImVscyIsIk5ld3NJdGVtIiwidmlkZW9PcGVuQmFsbCIsImFjdGlvbiIsInBob3RvIiwicGRmdmlld2VyIiwiUGhvdG9zQ2Fyb3VzZWwiLCJQREZWaWV3ZXIiLCJzbGlkZXJzIiwiU2xpZGVyIiwiaW50ZXJsZWF2ZU9mZnNldCIsInNsaWRlciIsImxvb3AiLCJzcGVlZCIsImF1dG9wbGF5IiwicGFyYWxsYXgiLCJncmFiQ3Vyc29yIiwid2F0Y2hTbGlkZXNQcm9ncmVzcyIsInR5cGUiLCJjbGlja2FibGUiLCJTbGlkZXJzIiwic2xpZGVyT2JqZWN0Iiwid2FybiIsIkNhcmRQcm9maWxlIiwic3RhdGUiLCJhY3RpdmVDbGFzcyIsImVsZW1lbnRzIiwicnVuIiwiYXdlc29tZXBsZXRlIiwiQXdlc29tcGxldGUiLCJhdXRvY29tcGxldGUiLCJ0ZXJtIiwiYXhpb3MiLCJnZXQiLCJwYXJhbXMiLCJsaXN0IiwidGltZXJJZCIsIkZpbHRlcnMiLCJwYW5lbCIsImNvbnRlbnRCbG9jayIsImxhYmVscyIsImlucHV0cyIsImNsaWNrTG9naWMiLCJmaWx0ZXJMb2dpYyIsInByZXZGaWx0ZXIiLCJpbmRleCIsIkV2ZW50IiwiRmlsdGVyRWxlbWVudHMiLCJmaWx0ZXJUeXBlIiwiZmlsdGVyRGlzcGxheSIsIk5ld3NGaWx0ZXJTZWxlY3QiLCJzZWxlY3RlZEl0ZW0iLCJTZWxlY3RvciIsIlNFTEVDVEVEX0lURU0iLCJDbGFzc05hbWUiLCJ0cmlnZ2VyQ29udGVudEVsIiwiU3dpdGNoU2VsZWN0IiwiaW5pdE5ld3NGaWx0ZXJTZWxlY3QiLCJJVEVNIiwiSVRFTVNfV1JBUCIsIkRST1BET1dOIiwiVFJJR0dFUiIsIlRSSUdHRVJfQ09OVEVOVCIsIk9QRU5FRCIsIml0ZW1zIiwiaXRlbXNXcmFwIiwiZHJvcGRvd25QYWRkaW5nVG9wIiwiZHJvcGRvd25QYWRkaW5nQm90dG9tIiwiaXNNdWx0aXNlbGVjdCIsIm11bHRpc2VsZWN0Iiwic2VsZWN0TWV0aG9kIiwic2VsZWN0ZWRWYWx1ZXMiLCJTZXQiLCJzZWxlY3RlZFZhbHVlIiwic2V0RGVmYXVsdFNlbGVjdGVkSXRlbSIsInByZXZTZWxlY3RlZEl0ZW0iLCJoYXMiLCJkZWxldGUiLCJzaXplIiwiaGFuZGxlRG9jdW1lbnRDbGljayIsInNldFBhZGRpbmdPbkRyb3Bkb3duIiwiZ2V0T3BlbkhlaWdodCIsInJlbW92ZVNjcm9sbCIsInJlbW92ZVBhZGRpbmdPbkRyb3Bkb3duIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iLCJoYW5kbGUiLCJvdmVyZmxvd1kiLCJpbmRleFZhbHVlIiwiZGVmYXVsdFNlbGVjdGVkSXRlbUVsIiwic2VsZWN0SXRlbSIsIlBhZ2VEcmF3IiwicmFuZG9tIiwiX19kYXRhIiwiY2FjaGUiLCJsb2NhbERhdGEiLCJfX2VsZW1lbnQiLCJfX2NsYXNzTmFtZSIsIl9faW5kaWNhdGlvbiIsImluZGljYXRpb24iLCJfX2NvbnQiLCJfX2NhbGxiYWNrIiwiX19wcmVyZW5kZXIiLCJfX2RyYXdlZCIsImJsb2NrIiwiY2hpbGRyZW5BcnJheSIsIl9fY2hhbmdlZENhY2hlIiwiY2hpbGRyZW5IaWRlTW9kdWxlcyIsIm9iamVjdCIsImNoaWxkIiwiZGV2ZWxvcG1lbnQiLCJfX2RyYXdTdGFydCIsIkVycm9yIiwiRnVuY3Rpb24iLCJfX2RyYXdGb3JGdW5jdGlvbiIsIl9fZHJhd0ZvclN0cmluZyIsImVycm9yIiwidXJsIiwiY2FjaGVDb250cm9sIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZXN1bHQiLCJpbnNlcnRDb250IiwicmVqZWN0IiwiYXJyYXkiLCJwbGFjZSIsImZhdGhlciIsInNlYXJjaEVsZW1lbnQiLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLCJkcmF3ZWQiLCJwcmVsb2FkIiwibG9hZGluZyIsImxvYWREYXRhIiwicmVxdWVzdCIsInhociIsIlhNTEh0dHBSZXF1ZXN0IiwibWV0aG9kIiwicHJvbWlzZSIsIm9ubG9hZCIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0Iiwic2V0UmVxdWVzdEhlYWRlciIsInNlbmQiLCJjb2RlIiwiaXNDaGlsZHJlbiIsIl9fcG9zIiwic3BsaXQiLCJjaGFuZ2VkQ2hpbGRyZW5zIiwiZHJhdyIsIl9fZHJhd0xvZ2ljIiwiY2hpbGRyZW4iLCJhbGwiLCJzdGFjayIsIl9fbG9jYWxEYXRhIiwiUm91dGVyIiwic3RydWN0dXJlIiwicm91dGUiLCJfX3BhcnNlIiwicmVtb3ZlQ2hpbGRyZW4iLCJzdWJqZWN0cyIsImFjdGl2ZVN0cnVjdHVyZSIsImFjdGl2ZUVsZW1lbnRzIiwibmV3RWxlbWVudHMiLCJfX3BhcnNlRm9yRGVsZXRlIiwicSIsInBhZ2VzIiwicGF0aG5hbWUiLCJsaW5rIiwidGFnTmFtZSIsImhpc3RvcnkiLCJwdXNoU3RhdGUiLCJfdGhpcyIsInBhZ2VEcmF3IiwibmFtZSIsImFkdmFudGFnZXMiLCJsaSIsIkFuYW1lIiwiQXRleHQiLCJyaWdodEluZm8iLCJkYXRhQ291bnQiLCJkYXRhRm9yT2tydWciLCJhc3NpZ24iLCJnb29nbGVNYXAiLCJjb250YWN0c01hcCIsIm1hcmtlckljb24iLCJtYXBNYXJrZXIiLCJjZW50ZXIiLCJsYXQiLCJjZW50ZXJMYXQiLCJsbmciLCJjZW50ZXJMbmciLCJnb29nbGUiLCJtYXBzIiwiTWFwIiwiem9vbSIsInNjcm9sbHdoZWVsIiwiem9vbUNvbnRyb2wiLCJtYXBUeXBlQ29udHJvbCIsInNjYWxlQ29udHJvbCIsInN0cmVldFZpZXdDb250cm9sIiwicm90YXRlQ29udHJvbCIsImZ1bGxzY3JlZW5Db250cm9sIiwibWFya2VyIiwiTWFya2VyIiwibWFya2VyTGF0IiwibWFya2VyTG5nIiwiaWNvbiIsImFkZERvbUxpc3RlbmVyIiwiZ2V0Q2VudGVyIiwic2V0Q2VudGVyIiwiaW5mb0NhcmQiLCJpbmZvQ2FyZEhUTUwiLCJvdXRlckhUTUwiLCJxd2UiLCJpbnNlcnRBZGphY2VudEhUTUwiLCJtc25yeSIsIk1hc29ucnkiLCJpdGVtU2VsZWN0b3IiLCJwZXJjZW50UG9zaXRpb24iLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJvYnNlcnZlciIsInBhcmVudEl0ZW0iLCJtdXQiLCJNdXRhdGlvbk9ic2VydmVyIiwibXV0YXRpb25zIiwibXV0YXRpb24iLCJhZGRlZE5vZGVzIiwiYXBwZW5kZWQiLCJjb25maWciLCJzdWJ0cmVlIiwib2JzZXJ2ZSIsImF1ZGlvRmlsZSIsImF1ZGlvVHJhY2siLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInBsYXlCdXR0b24iLCJwcm9ncmVzc0JhciIsInByb2dyZXNzQmFySGFuZGxlIiwidm9sdW1lQnV0dG9uIiwidm9sdW1lVmFsdWUiLCJ2b2x1bWUiLCJtdXRlVHJpZ2dlciIsInRpbWVEdXJhdGlvbiIsInRpbWVQYXNzZWQiLCJzZXRTdGFydFRpbWUiLCJ0aW1lVXBkYXRlIiwiZW5kUGxheSIsInNldER1cmF0aW9uIiwicGxheVRyaWdnZXIiLCJzZWNzIiwic2VjX251bSIsImhvdXJzIiwiZmxvb3IiLCJtaW51dGVzIiwic2Vjb25kcyIsInYiLCJmaWx0ZXIiLCJnZXREdXJhdGlvbiIsInBhdXNlZCIsInMiLCJtIiwicHJvZ3Jlc3NCYXJVcGRhdGUiLCJwcm9ncmVzc0luUGVyY2VudCIsInRvRml4ZWQiLCJtYXJnaW5MZWZ0IiwiRm9ybSIsImZvcm0iLCJhZ3JlZSIsImluaXRBZ3JlZU1vZGFsIiwidmFsaWRhdGlvbiIsInN1Ym1pdCIsImFncmVlTW9kYWwiLCJoYXNoIiwiY29tcGFueSIsInBob25lIiwibWFpbCIsIm1lc3NhZ2UiLCJmb3JtTGFiZWxzIiwiZm9ybUNoZWNrYm94IiwiZm9ybVN1Ym1pdCIsImludmFsaWRGaWVsZEFsbCIsImZvY3VzIiwic291cmNlIiwidGV4dGFyZWEiLCJzZWxlY3QiLCJjaGVja2JveCIsIkZvcm1EYXRhIiwicmVzIiwiSW5mbyIsInNldEF0dHJpYnV0ZSIsIklucHV0VGV4dCIsInBsYWNlaG9sZGVyIiwibGFiZWwiLCJzcGFuIiwiY2hlY2tQbGFjZWhvbGRlciIsImhhc1ZhbHVlIiwiSW5wdXRTZWxlY3QiLCJpbnB1dEhpZGRlbiIsIm9wdGlvbiIsInNlbGVjdEl0ZW1MaXN0ZW5lciIsInJvdXRlQ2xpY2siLCJvcGVuTGlzdCIsImNsb3NlTGlzdCIsImxpc3RIZWlnaHQiLCJyZWoiLCJlbFZhbHVlIiwiVGV4dGFyZWEiLCJMb2FkRmlsZURydWdORHJvcCIsImFkZERyYWdMaXN0ZW5lciIsIl9fZmlsZXNJbkZvcm0iLCJfX3BsYWNlaG9sZXJJbkxhYmVsIiwiZGF0YVRyYW5zZmVyIiwiZmlsZXMiLCJmaWxlIiwic2VuZFRvU2VydmVyQnVmZmVyIiwiZmlsZU5hbWUiLCJmaWxlQmxvY2siLCJmaWxlQ29udGVudCIsImZpbGVSZW1vdmUiLCJmaWxlVGV4dCIsImZpbGVQcm9ncmVzcyIsImZpbGVUZXh0UHJvZ3Jlc3MiLCJhYm9ydCIsInRyYW5zZm9ybSIsIm1hcmdpbiIsImNvbnZlcnREYXRhU2l6ZSIsImdlbmVyYXRlTGluZSIsImZkIiwidXBsb2FkIiwib25wcm9ncmVzcyIsImxvYWRlZCIsInRvdGFsIiwib25hYm9ydCIsInJlbW92ZUZpbGUiLCJpbml0Rm9ybVZhbGlkYXRlU2NyaXB0cyIsInBob25lRWwiLCJwaG9uZU1hc2siLCJNYXNrIiwicmVnZXhwIiwiUmVnRXhwIiwid2hlcmUiLCJ3ZWlnaHQiLCJhbW91bnQiLCJjb3JyZWN0aW9uIiwic3ltYm9sIiwibWFzayIsImFsbG93ZWRDaGFycyIsImVtcHR5IiwibGVnYWxMZW5ndGgiLCJyZWdleCIsIm1hc2tTeW1ib2xzIiwibWF0Y2giLCJhbGxvd2VkQ2hhcnNMZW5ndGgiLCJjaGVja0tleUNvZGVTdXBwb3J0IiwiaW5kZXhlZFN5bWJvbCIsImNhcmV0UG9zaXRpb24iLCJzZXRDYXJldFBvc2l0aW9uIiwicGFzdGVXaXRoTWFzayIsInBhc3RlV2l0aFNpbXBsZU1hc2siLCJfX2JpbmRlZFJvdXRlIiwiX19zaW1wbGVNYXNrIiwiX19tYXNrIiwibnVtYmVycyIsIm1hc2tBcnJheSIsIm1hc2tBcnJheUNoYXJzIiwiY2FyZXJQb3NpdGlvbiIsInNsaWNlIiwiZGlzcGxheVJlc3VsdCIsImtleUlkZW50aWZpZXIiLCJtZXRhS2V5IiwiY3RybEtleSIsIndoYXRJc0tleSIsImtleXNBcnJheSIsInBvcCIsInN5bWJvbHNJbk1hc2siLCJjdHJsIiwic2V0U2VsZWN0aW9uUmFuZ2UiLCJjcmVhdGVUZXh0UmFuZ2UiLCJyYW5nZSIsImNvbGxhcHNlIiwibW92ZUVuZCIsIm1vdmVTdGFydCIsInBhc3RlRGF0YSIsImNsaXBib2FyZERhdGEiLCJnZXREYXRhIiwiY2hlY2tEb3VibGVNYXNrU3ltYm9scyIsImxlbmd0aEFsbG93ZWRDaGFycyIsImxhc3RWYWx1ZSIsImNoZWNrS2V5Q29kZSIsIlRhYiIsInRhYkxhYmVsR3JvdXAiLCJ0YWJMYWJlbEl0ZW0iLCJsYWJlbEN1cnJlbnRJbmRpY2F0b3IiLCJ0YWJDb250ZW50R3JvdXAiLCJ0YWJDb250ZW50SXRlbSIsImFkZExpc3RlbmVyIiwic2V0Q3VycmVudFRhYiIsInJlbW92ZUN1cnJlbnRUYWIiLCJhbmltYXRpb25DdXJyZW50SW5kaWNhdG9yIiwiYWN0aXZlRWxlbWVudCIsIm9wYWNpdHkiLCJvZmZzZXRMZWZ0IiwiVGFiU2VsZWN0TW9iaWxlIiwic2VsZWN0VHJpZ2dlciIsInNlbGVjdFBsYWNlaG9sZGVyIiwic2VsZWN0RHJvcGRvd24iLCJzZWxlY3REcm9wZG93bldyYXAiLCJhZGRMaXN0ZW5lclNlbGVjdCIsImNvbnRlbnRIZWFkZXIiLCJ3cmFwIiwiZnVsbEhlaWdodCIsInBhcmFncmFmQ291bnQiLCJiZWdpbkhlaWdodCIsImZpcnN0UCIsInNlY29uZFAiLCJzZXBhcmF0ZXJQIiwicGFyc2VGbG9hdCIsImdldFByb3BlcnR5VmFsdWUiLCJzZXRCZWdpbkhlaWdodCIsImdldEJlZ2luSGVpZ2h0IiwiYnV0dG9uVGV4dFNob3ciLCJidXR0b25UZXh0SGlkZSIsImFkZEJ1dHRvbiIsInRyaWdnZXJIZWlnaHQiLCJoZWlnaHRBbmltYXRpb24iLCJoZWlnaHRTdGFydCIsImhlaWdodEVuZCIsImFicyIsImdldEVuZEhlaWdodCIsInNjcm9sbEVsZW1lbnQiLCJsZWZ0QnV0dG9uIiwicmlnaHRCdXR0b24iLCJzY3JvbGxUb1JpZ2h0Iiwic2Nyb2xsVG9MZWZ0IiwidmlkZW9Db250YWluZXIiLCJ0aW1lciIsInRpbWVXcmFwIiwidGltZUFycmF5IiwibWluIiwic2VjIiwiZGlzcGxheVRpbWUiLCJzZXRJbnRlcnZhbCIsImNoYW5nZVRpbWUiLCJmb3JtYXRlZEhvdXJzIiwiZ2V0Rm9ybWF0ZWRQYXJ0IiwiZ2V0SG91cnMiLCJmb3JtYXRlZE1pbiIsImdldE1pbiIsImZvcm1hdGVkU2VjIiwiZ2V0U2VjIiwiZm9ybWF0ZWRUaW1lIiwicGFydCIsImp1bXBlciIsInNpdGVIZWFkZXIiLCJzaXRlSGVhZGVySGVpZ2h0IiwiaXRlbU5hbWVUb0p1bXAiLCJpdGVtVG9KdW1wIiwianVtcCIsIm9mZnNldFkiLCJpdGVtT2Zmc2V0WSIsInN0b3BJdGVtTmFtZSIsImFuaW1hdGlvbiIsInN0b3BQb3NpdGlvbiIsIm1heCIsImNvbW1lbnQiLCJyZXBseUJ0biIsInJlcGx5Rm9ybVdyYXAiLCJoaWRlRm9ybSIsInRvZ2dsZUZvcm0iLCJpc0hpZGUiLCJzaG93Rm9ybSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQUlDLG9CQUFZQSxJQUFaLEVBQWtCQyxNQUFsQixFQUEwQjtBQUFBOztBQUV6QixTQUFLQyxLQUFMLENBQVdGLElBQVgsRUFBaUJDLE1BQWpCO0FBQ0E7Ozs7d0NBRW1CO0FBQ25CLFVBQUlFLFVBQVVDLFNBQVNDLGFBQVQsQ0FB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDLFdBQVc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQ0FBb0MsY0FBYztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLGtCQUFrQjtBQUNuRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLGVBQWUsY0FBYztBQUM3QjtBQ3R0QkE7QUFBQTtBQUFhOztBQUVFOztBQUVmOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLGFBQWE7QUFDYixXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcscUJBQXFCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEtBQUssZ0JBQWdCO0FBQ3JCLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwREFBMEQ7QUFDMUQsT0FBTzs7QUFFUDtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0Qyx5QkFBeUI7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLFNBQVM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGVBQWU7QUFDMUI7QUFDQTtBQUNBLFdBQVc7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Q0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpREFBaUQ7QUFDakQsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBLGdCQUFnQixtQkFBbUI7QUFDbkM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLGdCQUFnQixzQkFBc0I7QUFDdEMsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzQkFBc0I7QUFDckM7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FB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cGVyL2Rpc3QvanMvc3dpcGVyLmpzJztcbmltcG9ydCBNb2RhbCBmcm9tICdwb3B1cC13aW5kb3ctbW9kdWxlJztcblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyB7XG5cdGNvbnN0cnVjdG9yKGNhcmQsIHRhcmdldCkge1xuXG5cdFx0dGhpcy5sb2dpYyhjYXJkLCB0YXJnZXQpO1xuXHR9XG5cblx0Z2VuZXJhdGVNb2RhbEhUTUwoKSB7XG5cdFx0bGV0IE1vZGFsRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRNb2RhbEVsLmNsYXNzTmFtZSA9ICdmb3JQaG90byc7XG5cdFx0TW9kYWxFbC5pZCA9ICdmb3JQaG90byc7XG5cdFx0TW9kYWxFbC5pbm5lckhUTUwgPSBgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwiZm9yUGhvdG9fX2NvbnRlbnRcIj5cblxuXHRcdFx0PC9kaXY+XG5cdFx0YDtcblx0XHR0aGlzLmNvbnRlbnQgPSBNb2RhbEVsLnF1ZXJ5U2VsZWN0b3IoJy5mb3JQaG90b19fY29udGVudCcpO1xuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoTW9kYWxFbCk7XG5cblx0XHRyZXR1cm4gTW9kYWxFbDtcblx0fVxuXG5cdGFzeW5jIGxvZ2ljKGNhcmQsIHRhcmdldCkge1xuXG5cdFx0bGV0IGVsID0gdGFyZ2V0LmNsb3Nlc3QoJy5uZXdzQ2FyZF9faW1hZ2UnKSB8fCB0YXJnZXQuY2xvc2VzdCgnLm5ld3NDYXJkX19oZWFkJyk7XG5cblx0XHRpZiAoICFlbCApIHJldHVybjtcblxuXHRcdHRoaXMuZWwgPSB0aGlzLmdlbmVyYXRlTW9kYWxIVE1MKCk7XG5cblx0XHRsZXQgZGF0YSA9IGF3YWl0IGZldGNoKGVsLmdldEF0dHJpYnV0ZSgnaHJlZicpKTtcblxuXHRcdGRhdGEgPSBhd2FpdCBkYXRhLmpzb24oKTtcblxuXHRcdHRoaXMuZWwuaW5uZXJIVE1MID0gYFxuXHRcdDxkaXYgY2xhc3M9XCJzd2lwZXItY29udGFpbmVyIGdhbGxlcnktdG9wXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwic3dpcGVyLXdyYXBwZXJcIj5cblx0XHRcdFx0JHtkYXRhLm1hcCggaXRlbSA9PiBgXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic3dpcGVyLXNsaWRlXCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JQaG90b19fc2xpZGVcIj5cblx0XHRcdFx0XHRcdFx0XHQ8aW1nIHNyYz1cIiR7aXRlbS5pbWFnZS50aHVtYn1cIiBhbHQ9XCLQktC10YDRgtC40LrQsNC70YzQvdC+0LUg0L/QvtGA0YLQvNC+0L3QtVwiIC8+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRgICkuam9pbignJyl9XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0XHQ8ZGl2IGNsYXNzPVwic3dpcGVyLWNvbnRhaW5lciBnYWxsZXJ5LWJvdHRvbVwiPlxuXHRcdFx0PGRpdiBjbGFzcz1cImZvclBob3RvX19jbG9zZVwiPjwvZGl2PlxuXHRcdFx0PGRpdiBjbGFzcz1cInN3aXBlci13cmFwcGVyXCI+XG5cdFx0XHRcdCR7ZGF0YS5tYXAoIGl0ZW0gPT4gYFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInN3aXBlci1zbGlkZVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9yUGhvdG9fX3NsaWRlXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGltZyBzcmM9XCIke2l0ZW0uaW1hZ2Uubm9ybWFsfVwiIGFsdD1cItCS0LXRgNGC0LjQutCw0LvRjNC90L7QtSDQv9C+0YDRgtC80L7QvdC1XCIgLz5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9yUGhvdG9fX2NvbnRlbnRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzZWN0aW9uTmFtZVwiPiR7aXRlbS50aXRsZX08L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJcIj4ke2l0ZW0uYWxidW19PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiXCI+JHtpdGVtLmRlc2NyaXB0aW9ufTwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdGAgKS5qb2luKCcnKX1cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PlxuXHRcdGA7XG5cblx0XHR0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5mb3JQaG90b19fY2xvc2UnKS5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBldmVudCA9PiB7XG5cdFx0XHR0aGlzLmRlc3Ryb3koKTtcblx0XHR9KTs7XG5cblx0XHR2YXIgZ2FsbGVyeVRvcCA9IG5ldyBTd2lwZXIoJy5nYWxsZXJ5LXRvcCcsIHtcblx0XHRcdHNwYWNlQmV0d2VlbjogMTAsXG5cdFx0XHRjZW50ZXJlZFNsaWRlczogdHJ1ZSxcblx0XHRcdHNsaWRlc1BlclZpZXc6ICdhdXRvJyxcblx0XHRcdHRvdWNoUmF0aW86IC4yLFxuXHRcdFx0c2xpZGVUb0NsaWNrZWRTbGlkZTogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdHZhciBnYWxsZXJ5VGh1bWJzID0gbmV3IFN3aXBlcignLmdhbGxlcnktYm90dG9tJywge1xuXHRcdFx0c3BhY2VCZXR3ZWVuOiAxMCxcblx0XHRcdG5hdmlnYXRpb246IHtcblx0XHRcdFx0bmV4dEVsOiAnLnN3aXBlci1idXR0b24tbmV4dCcsXG5cdFx0XHRcdHByZXZFbDogJy5zd2lwZXItYnV0dG9uLXByZXYnLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luYXRpb246IHtcblx0XHRcdFx0ZWw6ICcuc3dpcGVyLXBhZ2luYXRpb24nXG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRnYWxsZXJ5VG9wLmNvbnRyb2xsZXIuY29udHJvbCA9IGdhbGxlcnlUaHVtYnM7XG5cdFx0Z2FsbGVyeVRodW1icy5jb250cm9sbGVyLmNvbnRyb2wgPSBnYWxsZXJ5VG9wO1xuXHR9XG5cblx0ZGVzdHJveSgpIHtcblx0XHR0aGlzLmVsLnJlbW92ZSgpO1xuXG5cdFx0dGhpcy5lbCA9IG51bGw7XG5cdH1cbn1cblxuXG4vLyB7XG4vLyBcdHRpdGxlOiAn0J3QsNC30LLQsNC90LjQtScsXG4vLyBcdGRlc2NyaXB0aW9uOiAn0J7Qv9C40YHQsNC90LjQtScsXG4vLyBcdGFsYnVtOiAn0J3QsNC30LLQsNC90LjQtSDQsNC70YzQsdC+0LzQsCcsXG4vLyBcdGltYWdlOiB7XG4vLyBcdFx0d2lkdGg6ICc0MDAwJyxcbi8vIFx0XHRoZWlnaHQ6ICczMDAwJyxcbi8vIFx0XHR0aHVtYjogJy9hZGZhZmEuanBnJyxcbi8vIFx0XHRub3JtYWw6ICcvemRmYWdhZycsXG4vLyBcdFx0b3JpZ2luYWw6ICcvZmRmYWRmYScsXG4vLyBcdFx0ZXh0ZW5zaW9uOiAnanBnJyxcbi8vIFx0XHRvcmlnaW5hbE5hbWU6ICfQnNC+0LbQvdC+INC10YnRkSDQv9C10YDQtdC00LDRgtGMINC+0YDQuNCz0LjQvdCw0LvRjNC90L7QtSDQvdCw0LfQstCw0L3QuNC1INGE0LDQudC70LAsINC90LXQt9C90LDRjiDQt9Cw0YfQtdC8J1xuLy8gXHR9XG4vLyB9XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBEZXZlbG9wbWVudE1vZGUge1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0dGhpcy5tb2JpbGVXb3JkcyA9IFsn0LzQvtCx0LjQu9CwJywn0YLQtdC70LXRhNC+0L0nLCfQuNGE0L7QvScsJ9C80LjQvdC4Jywn0LzQvtCx0LjQu9GM0L3QuNC6Jywn0LzQvtCx0LjQu9C60LAnLCfRiNC30YDRidGC0YMnLCfRjNGJ0LjRiNC00YMnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3ZqLGJrZicsJ250a3RhanknLCdiYWp5JywndmJ5YicsJ3ZqLGJrbXlicicsJ3ZqLGJrcmYnLCdpcGhvbmUnLCdtb2JpbGUnXTtcblx0XHR0aGlzLnRhYmxldFdvcmRzID0gWyfRgtCw0LHQu9C10YInLCfQv9C70LDQvdGI0LXRgicsJ9GB0YDQtdC00L3Rj9C6Jywn0LzQtdC00LjRg9C8Jywn0LDQudC/0LDQtCcsJ9C/0LvQsNC90YjQtdGC0LrQsCcsJ9GI0LfRhNCyJywn0LXRhNC40LTRg9C1Jyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCduZixrdG4nLCdna2Z5aXRuJywnY2h0bHl6cicsJ3Z0bGJldicsJ2ZxZ2ZsJywnZ2tmeWl0bnJmJywnaXBhZCcsJ3RhYmxldCddO1xuXHRcdHRoaXMuZGVza3RvcFdvcmRzID0gIFsn0Y/RidC40LonLCfQs9GA0L7QsScsJ9C60YPQsScsJ9C80YPRgdC+0YDQvdC+0LUg0LLQtdC00YDQvicsJ9C60L7QvNC/Jywn0LrQvtC80L/RjNGO0YLQtdGAJywnZGVza3RvcCcsJ2NsZWFyJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3pvYnInLCd1aGosJywncmUsJywndmVjamh5anQgZHRsaGonLCdyanZnJywncmp2Z20ubnRoJywn0LLRg9GL0LvQtdGJ0LcnLCfRgdC00YPRhNC6J107XG5cdFx0dGhpcy5jbGVhcldvcmRzID0gWyfRgdCx0YDQvtGBJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnYyxoamMnXVxuXHRcdHRoaXMuc2hvd1N0YXR1c1dvcmRzID0gWyfQs9C00LUg0Y8nLCfRgdGC0LDRgtGD0YEnLCfRg9GB0YLRgNC+0LnRgdGC0LInLCfRh9GC0L4g0YnQsNGBJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQndWx0IHonLCdjbmZuZWMnLCdlY25oanFjbmQnLCd4bmogb2ZjJ107XG5cblx0XHR0aGlzLnRvUGFnZXNXb3JkcyA9IFsn0YHRgtGA0LDQvdC40YbRiycsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdjbmhmeWJ3cyddO1xuXG5cdFx0bGV0IGtleXMgPSBbXTtcblx0XHRjb25zdCBhcnJheUtleXdvcmRzID0gW10uY29uY2F0KHRoaXMubW9iaWxlV29yZHMsIHRoaXMudGFibGV0V29yZHMsIHRoaXMuZGVza3RvcFdvcmRzLCB0aGlzLnNob3dTdGF0dXNXb3JkcywgdGhpcy50b1BhZ2VzV29yZHMsIHRoaXMuY2xlYXJXb3Jkcyk7XG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2tleXVwJywgZXZlbnQgPT4ge1xuXHRcdFx0Y29uc3Qge2tleSwga2V5Q29kZX0gPSBldmVudDtcblx0XHRcdGlmIChrZXlzLmxhbmd0aCA+IDIwKSB7XG5cdFx0XHRcdGtleXMuc2hpZnQoKTtcblx0XHRcdH1cblx0XHRcdGlmICgga2V5ICkge1xuXHRcdFx0XHRrZXlzLnB1c2goIGtleS50b0xvd2VyQ2FzZSgpIClcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGtleXMucHVzaCggU3RyaW5nLmZyb21DaGFyQ29kZSgga2V5Q29kZSApLnRvTG93ZXJDYXNlKCkgKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IHdvcmQgPSBrZXlzLmpvaW4oJycpO1xuXHRcdFx0bGV0IGkgPSAwO1xuXHRcdFx0Zm9yICg7IGkgPCBhcnJheUtleXdvcmRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmICh3b3JkLmluZGV4T2YoYXJyYXlLZXl3b3Jkc1tpXS50b0xvd2VyQ2FzZSgpICkgKyAxICE9PSAwKSB7XG5cdFx0XHRcdFx0a2V5cyA9IFtdO1xuXHRcdFx0XHRcdHRoaXMua2V5TG9naWMoYXJyYXlLZXl3b3Jkc1tpXSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMudGltZW91dCAmJiBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcblx0XHRcdHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoKCk9Pntcblx0XHRcdFx0a2V5cyA9IFtdO1xuXHRcdFx0fSwgMTAwMDApXG5cblx0XHR9KTtcblx0fVxuXG5cdGtleUxvZ2ljKGtleSkge1xuXG5cdFx0bGV0IGlzTW9iaWxlO1xuXHRcdGxldCBpc1RhYmxldDtcblx0XHRsZXQgaXNEZXNrdG9wO1xuXHRcdGxldCBzaG93U3RhdHVzO1xuXHRcdGxldCB0b1BhZ2VzV29yZHM7XG5cblx0XHRpZiAodGhpcy5tb2JpbGVXb3Jkcy5pbmNsdWRlcyhrZXkpKSB7XG5cdFx0XHRpc01vYmlsZSA9IHRydWU7XG5cdFx0fSBlbHNlIGlmICh0aGlzLnRhYmxldFdvcmRzLmluY2x1ZGVzKGtleSkpIHtcblx0XHRcdGlzVGFibGV0ID0gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuZGVza3RvcFdvcmRzLmluY2x1ZGVzKGtleSkpIHtcblx0XHRcdGlzRGVza3RvcCA9IHRydWU7XG5cdFx0fSBlbHNlIGlmICh0aGlzLnNob3dTdGF0dXNXb3Jkcy5pbmNsdWRlcyhrZXkpKSB7XG5cdFx0XHRzaG93U3RhdHVzID0gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKHRoaXMudG9QYWdlc1dvcmRzLmluY2x1ZGVzKGtleSkpIHtcblx0XHRcdHRvUGFnZXNXb3JkcyA9IHRydWU7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmNsZWFyV29yZHMuaW5jbHVkZXMoa2V5KSkge1xuXHRcdFx0dGhpcy5jbGVhcigpXG5cdFx0XHR3aW5kb3cubG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcblx0XHR9XG5cblxuXHRcdHN3aXRjaCAodHJ1ZSkge1xuXHRcdFx0Y2FzZSBpc01vYmlsZTpcblx0XHRcdFx0dGhpcy5tb2JpbGUoKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgaXNUYWJsZXQ6XG5cdFx0XHRcdHRoaXMudGFibGV0KCk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGlzRGVza3RvcDpcblx0XHRcdFx0dGhpcy5kZXNrdG9wKCk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIHNob3dTdGF0dXM6XG5cdFx0XHRcdHRoaXMuc2hvd1N0YXR1cygpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSB0b1BhZ2VzV29yZHM6XG5cdFx0XHRcdGxvY2F0aW9uLmhyZWYgPSAnL3BhZ2VzJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0bW9iaWxlKCkge1xuXHRcdGlmICgvbW9iaWxlPXRydWUvLnRlc3QoZG9jdW1lbnQuY29va2llKSkgcmV0dXJuO1xuXHRcdHRoaXMuY2xlYXIoKTtcblx0XHRkb2N1bWVudC5jb29raWUgPSAnbW9iaWxlPXRydWUnO1xuXHRcdHdpbmRvdy5sb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuXHR9XG5cdHRhYmxldCgpIHtcblx0XHRpZiAoL3RhYmxldD10cnVlLy50ZXN0KGRvY3VtZW50LmNvb2tpZSkpIHJldHVybjtcblx0XHR0aGlzLmNsZWFyKCk7XG5cdFx0ZG9jdW1lbnQuY29va2llID0gJ3RhYmxldD10cnVlJztcblx0XHR3aW5kb3cubG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcblx0fVxuXHRkZXNrdG9wKCkge1xuXHRcdGlmICgvZGVza3RvcD10cnVlLy50ZXN0KGRvY3VtZW50LmNvb2tpZSkpIHJldHVybjtcblx0XHR0aGlzLmNsZWFyKCk7XG5cdFx0ZG9jdW1lbnQuY29va2llID0gJ2Rlc2t0b3A9dHJ1ZSc7XG5cdFx0d2luZG93LmxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG5cdH1cblxuXHRjbGVhcigpe1xuXHRcdGRvY3VtZW50LmNvb2tpZSA9ICdtb2JpbGU9ZmFsc2UnO1xuXHRcdGRvY3VtZW50LmNvb2tpZSA9ICd0YWJsZXQ9ZmFsc2UnO1xuXHRcdGRvY3VtZW50LmNvb2tpZSA9ICdkZXNrdG9wPWZhbHNlJztcblx0fVxuXG5cdHNob3dTdGF0dXMoKXtcblx0XHRjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG5cdFx0ZWwuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuXHRcdGVsLnN0eWxlLnRvcCA9IDE1O1xuXHRcdGVsLnN0eWxlLnJpZ2h0ID0gMTU7XG5cdFx0ZWwuc3R5bGUucGFkZGluZyA9ICcxMHB4IDIwcHgnO1xuXHRcdGVsLnN0eWxlLmJvcmRlclJhZGl1cyA9ICczcHgnO1xuXHRcdGVsLnN0eWxlLmJhY2tncm91bmQgPSAncmdiYSgwLDAsMCwuMSknO1xuXHRcdGVsLnN0eWxlLnpJbmRleCA9IDk5OTk5OTk7XG5cdFx0bGV0IHN0YXR1cztcblx0XHRsZXQgdGV4dDtcblxuXHRcdGlmICggL21vYmlsZT10cnVlLy50ZXN0KGRvY3VtZW50LmNvb2tpZSkgKSB7XG5cdFx0XHRzdGF0dXMgPSAnbW9iaWxlJztcblx0XHRcdHRleHQgPSAn0JzQvtCx0LjQu9GM0L3QvtC1INGD0YHRgtGA0L7QudGB0YLQstC+Jztcblx0XHR9IGVsc2UgaWYgKCAvdGFibGV0PXRydWUvLnRlc3QoZG9jdW1lbnQuY29va2llKSApIHtcblx0XHRcdHN0YXR1cyA9ICd0YWJsZXQnO1xuXHRcdFx0dGV4dCA9ICfQn9C70LDQvdGI0LXRgic7XG5cdFx0fSBlbHNlIGlmICgvZGVza3RvcD10cnVlLy50ZXN0KGRvY3VtZW50LmNvb2tpZSkgKXtcblx0XHRcdHN0YXR1cyA9ICdkZXNrdG9wJztcblx0XHRcdHRleHQgPSAn0J3QsNGB0YLQvtC70YzQvdGL0Lkg0LrQvtC80L/RjNGO0YLQtdGAJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3RhdHVzID0gJ2F1dG8nO1xuXHRcdFx0dGV4dCA9ICfQkNCy0YLQvtC80LDRgtC40YfQtdGB0LrQuCDQvtC/0YDQtdC00LXQu9GP0LXRgtGB0Y8nO1xuXHRcdH1cblxuXHRcdGVsLmlubmVyVGV4dCA9IHRleHQ7XG5cblx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsKTtcblxuXHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0ZWwucmVtb3ZlKClcblx0XHR9LCA1MDAwKTtcblx0fVxufVxuIiwiaW1wb3J0IEFuaW1hdGlvbiBmcm9tICcuL2FuaW1hdGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjcm9sbFRvVG9wIGV4dGVuZHMgQW5pbWF0aW9uIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0XHRhZGRFdmVudExpc3RlbmVyKCAnc2Nyb2xsVG9Ub3AnLCBldmVudCA9PiB7XG5cdFx0XHR0aGlzLnNjcm9sbCgpO1xuXHRcdH0pO1xuXHR9XG5cblx0c2Nyb2xsKCl7XG5cblx0XHRjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG5cdFx0Y29uc3Qgc2Nyb2xsID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuXHRcdGNvbnN0IGR1cmF0aW9uID0gc2Nyb2xsLzIwMDAgKiAxMDAwO1xuXG5cdFx0Y29uc3QgYmxvY2tTY3JvbGwgPSBldmVudCA9PiB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH07XG5cdFx0YWRkRXZlbnRMaXN0ZW5lciggJ21vdXNld2hlZWwnLCBibG9ja1Njcm9sbCk7XG5cblx0XHRjb25zdCBhbmltYXRlID0gKCkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvZ3Jlc3MgPSB0aGlzLl9fcHJvZ3Jlc3Moc3RhcnQsIGR1cmF0aW9uKTtcblxuXHRcdFx0d2luZG93LnNjcm9sbFRvKDAsIHNjcm9sbCAqICgxIC0gcHJvZ3Jlc3MpKTtcblxuXHRcdFx0aWYgKHByb2dyZXNzID09PSAxKSB7XG5cdFx0XHRcdHJlbW92ZUV2ZW50TGlzdGVuZXIoICdtb3VzZXdoZWVsJywgYmxvY2tTY3JvbGwpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XG5cdFx0fVxuXG5cdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuXHR9XG59XG4iLCJjb25zdCBzdHlsZXMgPSBgXG5cbi5ub3R5IHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOjA7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiA1dmg7XG4gIHJpZ2h0OiAyMHB4O1xuICB3aWR0aDogMjB2dztcbiAgbWluLXdpZHRoOiAxODBweDtcbiAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTtcbiAgei1pbmRleDogOTk5OTk7XG59XG4ubm90eV9fY29udGFpbmVyLW1lcyB7XG4gIHBhZGRpbmc6IDVweCAwO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCUpO1xuICB0cmFuc2l0aW9uOiAuNXMgZWFzZTtcbn1cbi5ub3R5X19jb250YWluZXItbWVzLmNsb3Npbmcge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTQwJSk7XG59XG4ubm90eV9fbWVzIHtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBib3gtc2hhZG93OiAwIDVweCAxNHB4IC00cHggcmdiYSgwLCAwLCAwLCAuMiksIDAgNXB4IDI1cHggMCByZ2JhKDAsIDAsIDAsIC4xKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgZm9udC1zaXplOiAuODc1ZW07XG4gIHBhZGRpbmc6IDdweCAwO1xufVxuLm5vdHlfX21lcy5ub3R5LS1lcnJvciB7XG4gIGJhY2tncm91bmQ6ICNmNzJlMmU7XG4gIGNvbG9yOiAjZmZmO1xufVxuLm5vdHlfX21lcy5ub3R5LS1pbmZvIHtcbiAgYmFja2dyb3VuZDogIzAwOWNmZjtcbiAgY29sb3I6ICNmZmY7XG59XG4ubm90eV9fbWVzLm5vdHktLXdhcm4ge1xuICBiYWNrZ3JvdW5kOiAjZmZhZTAwO1xuICBjb2xvcjogIzAwMDtcbn1cbi5ub3R5X19tZXMgPiAqOm5vdCgubm90eV9fY2xvc2UpIHtcbiAgcGFkZGluZzogMnB4IDE1cHg7XG4gIG1hcmdpbi10b3A6IDJweDtcbiAgbGluZS1oZWlnaHQ6IDEuMzVlbTtcbn1cbi5ub3R5X19tZXMgPiAqOm50aC1jaGlsZCgyKSB7XG4gIHBhZGRpbmctdG9wOiA3cHg7XG59XG4ubm90eV9fbWVzID4gKjpsYXN0LWNoaWxkIHtcbiAgcGFkZGluZy1ib3R0b206IDdweDtcbn1cblxuLm5vdHlfX21lcyBoNCB7XG4gIGZvbnQtc2l6ZTogMS4xMjVlbTtcbiAgbGluZS1oZWlnaHQ6IDFlbTtcbiAgbWFyZ2luOiAwcHggMCAwcHg7XG59XG4ubm90eV9fdGV4dCB7XG4gIGZvbnQtc2l6ZTogLjg3NWVtO1xufVxuLm5vdHlfX2Nsb3NlIHtcbiAgZmxvYXQ6IHJpZ2h0O1xuICB3aWR0aDogMzJweDtcbiAgaGVpZ2h0OiAzMnB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi5ub3R5X19jbG9zZTpiZWZvcmUsXG4ubm90eV9fY2xvc2U6YWZ0ZXIge1xuICBjb250ZW50OiAnJztcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMTZweDtcbiAgaGVpZ2h0OiAycHg7XG4gIGJhY2tncm91bmQ6IGN1cnJlbnRDb2xvcjtcbiAgbGVmdDogMDtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgYm90dG9tOiAwO1xuICBtYXJnaW46IGF1dG87XG4gIHRyYW5zaXRpb246IC4xM3MgZWFzZTtcbn1cbi5ub3R5X19jbG9zZTpiZWZvcmUge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XG59XG4ubm90eV9fY2xvc2U6YWZ0ZXIge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO1xufVxuLm5vdHlfX2Nsb3NlOmhvdmVyOmJlZm9yZSxcbi5ub3R5X19jbG9zZTpob3ZlcjphZnRlcntcbiAgdHJhbnNmb3JtOiByb3RhdGUoMCk7XG59YFxuXG5jb25zdCBub3R5SWQgPSAnUXNkYURSVydcbmxldCBsYXN0TXNnID0gMDtcbmNvbnN0IE1TR19JTlRFUlZBTCA9IDIwMFxubGV0IHRpbWVUb0Nsb3NlID0gNTAwMFxuXG5jbGFzcyBOb3R5IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0gaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIHRoaXMub3B0aW9ucyA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcHRpb25zID0ge31cbiAgICB9XG4gICAgdGhpcy5jcmVhdGVDb250YWluZXIoKVxuXG4gICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpXG4gICAgaWYgKGxhc3RNc2cgJiYgdGltZSAtIGxhc3RNc2cgPCBNU0dfSU5URVJWQUwpIHtcbiAgICAgIGxldCBkaWZmID0gTVNHX0lOVEVSVkFMIC0gKHRpbWUgLSBsYXN0TXNnKVxuXG4gICAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3JlYXRlTWVzc2FnZSguLi5hcmd1bWVudHMpXG4gICAgICB9LCBkaWZmKTtcblxuICAgICAgaWYgKHRpbWUgLSBsYXN0TXNnIDwgMCkge1xuICAgICAgICBsYXN0TXNnICs9IE1TR19JTlRFUlZBTFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGFzdE1zZyArPSBkaWZmXG4gICAgICB9XG4gICAgfSBlbHNle1xuICAgICAgbGFzdE1zZyA9IHRpbWVcbiAgICAgIHRoaXMuY3JlYXRlTWVzc2FnZSguLi5hcmd1bWVudHMpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIEVycm9yKCkge1xuICAgIGlmIChhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLmNsYXNzID0gKGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0uY2xhc3MgfHwgJycpICsgJyBub3R5LS1lcnJvcidcblxuICAgICAgcmV0dXJuIG5ldyBOb3R5KC4uLmFyZ3VtZW50cylcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIGNsYXNzOiAnbm90eS0tZXJyb3InXG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IE5vdHkoLi4uYXJndW1lbnRzLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuICBzdGF0aWMgSW5mbygpIHtcbiAgICBpZiAoYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXS5jbGFzcyA9IChhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLmNsYXNzIHx8ICcnKSArICcgbm90eS0tZXJyb3InXG5cbiAgICAgIHJldHVybiBuZXcgTm90eSguLi5hcmd1bWVudHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBjbGFzczogJ25vdHktLWluZm8nXG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IE5vdHkoLi4uYXJndW1lbnRzLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuICBzdGF0aWMgV2FybigpIHtcbiAgICBpZiAoYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXS5jbGFzcyA9IChhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLmNsYXNzIHx8ICcnKSArICcgbm90eS0tZXJyb3InXG5cbiAgICAgIHJldHVybiBuZXcgTm90eSguLi5hcmd1bWVudHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBjbGFzczogJ25vdHktLXdhcm4nXG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IE5vdHkoLi4uYXJndW1lbnRzLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuICBzdGF0aWMgU3R5bGVzKGFyZykge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKVxuICAgIGVsLmlubmVyVGV4dCA9IGFyZ1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKS5hcHBlbmRDaGlsZChlbClcbiAgfVxuICBzdGF0aWMgVGltZVRvQ2xvc2UodmFsKSB7XG4gICAgdGltZVRvQ2xvc2UgPSB2YWxcbiAgfVxuICBjcmVhdGVNZXNzYWdlKGhlYWQsIHRleHQpIHtcbiAgICBpZiAodGV4dCBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgIHRleHQgPSBudWxsXG4gICAgbGV0IG1lc0NvbnRhaW4gPSB0aGlzLmNyZWF0ZUVsKCcnLCdsaScpXG4gICAgbWVzQ29udGFpbi5jbGFzc05hbWUgPSAnbm90eV9fY29udGFpbmVyLW1lcydcbiAgICBsZXQgbWVzID0gdGhpcy5jcmVhdGVFbCgnJylcbiAgICBtZXMuY2xhc3NOYW1lID0gJ25vdHlfX21lcyAnICsgKHRoaXMub3B0aW9ucy5jbGFzcyB8fCAnJylcbiAgICBjb25zdCBjbG9zZSA9IHRoaXMuY3JlYXRlRWwoJycpXG4gICAgY2xvc2UuY2xhc3NOYW1lID0gJ25vdHlfX2Nsb3NlJ1xuICAgIG1lcy5hcHBlbmRDaGlsZChjbG9zZSlcbiAgICBtZXMuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVFbChoZWFkLCAnaDQnKSlcbiAgICBpZiAodGV4dClcbiAgICAgIG1lcy5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUVsKHRleHQpKVxuICAgIG1lc0NvbnRhaW4uYXBwZW5kQ2hpbGQobWVzKVxuICAgIG1lc0NvbnRhaW4uY2xhc3NMaXN0LmFkZCgnY2xvc2luZycpXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQobWVzQ29udGFpbilcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57XG4gICAgICAgICAgbWVzQ29udGFpbi5jbGFzc0xpc3QucmVtb3ZlKCdjbG9zaW5nJylcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICBjbG9zZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTWVzc2FnZS5iaW5kKHRoaXMpKVxuXG4gICAgZnVuY3Rpb24gY2xvc2VNZXNzYWdlKCl7XG4gICAgICBjbG9zZS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTWVzc2FnZSlcblxuICAgICAgbWVzQ29udGFpbi5jbGFzc0xpc3QuYWRkKCdjbG9zaW5nJylcbiAgICAgIG1lc0NvbnRhaW4uc3R5bGUud2lkdGggPSBtZXNDb250YWluLm9mZnNldFdpZHRoICsgJ3B4J1xuICAgICAgbWVzQ29udGFpbi5zdHlsZS5oZWlnaHQgPSBtZXNDb250YWluLm9mZnNldEhlaWdodCArICdweCdcblxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e1xuICAgICAgICAgIG1lc0NvbnRhaW4uc3R5bGUuaGVpZ2h0ID0gMFxuICAgICAgICAgIG1lc0NvbnRhaW4uc3R5bGUucGFkZGluZyA9IDBcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIHNldFRpbWVvdXQoKCk9PntcbiAgICAgICAgbWVzQ29udGFpbi5yZW1vdmUoKVxuICAgICAgfSwxMDAwKVxuICAgIH1cblxuICAgIHNldFRpbWVvdXQoY2xvc2VNZXNzYWdlLmJpbmQodGhpcyksIHRoaXMub3B0aW9ucy50aW1lVG9DbG9zZSB8fCB0aW1lVG9DbG9zZSlcbiAgfVxuXG4gIGNyZWF0ZUVsKHRleHQsIHRhZyA9ICdkaXYnKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZylcbiAgICBlbC5pbm5lckhUTUwgPSB0ZXh0XG4gICAgcmV0dXJuIGVsO1xuICB9XG4gIGNyZWF0ZUNvbnRhaW5lcigpe1xuICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobm90eUlkKVxuICAgIGlmICh0aGlzLmNvbnRhaW5lcikgcmV0dXJuXG4gICAgY29uc3QgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpXG4gICAgdGhpcy5jb250YWluZXIgPSB1bFxuICAgIHVsLmNsYXNzTmFtZSA9ICdub3R5J1xuICAgIHVsLmlkID0gbm90eUlkXG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKVxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKS5pbnNlcnRCZWZvcmUodGhpcy5jcmVhdGVFbChzdHlsZXMgKyB0aGlzLm9wdGlvbnMuc3R5bGVzLCdzdHlsZScpLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZClcbiAgfVxufVxuXG53aW5kb3cuTm90eSA9IE5vdHlcbiIsImltcG9ydCAnLi9jb250ZW50LmNzcyc7XHJcblxyXG5jbGFzcyBVbnJvbGwge1xyXG4gIGNvbnN0cnVjdG9yKGVsZW0pIHtcclxuICAgIHRoaXMuZWxlbSA9IGVsZW07XHJcbiAgICB0aGlzLmJ0biA9IHRoaXMuZWxlbS5xdWVyeVNlbGVjdG9yKCcudW5yb2xsX19saW5rJyk7XHJcbiAgICB0aGlzLmRhdGFDb250YWluZXIgPSB0aGlzLmVsZW0ucXVlcnlTZWxlY3RvcignLnVucm9sbF9fZGF0YScpO1xyXG4gICAgdGhpcy5kYXRhQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IDA7XHJcblxyXG4gICAgdGhpcy5idG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUJ0bkNsaWNrLmJpbmQodGhpcykpO1xyXG4gICAgdGhpcy5pc09wZW5lZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQnRuQ2xpY2soZXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBpZiAodGhpcy5pc09wZW5lZCkge1xyXG4gICAgICB0aGlzLmRhdGFDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gMDtcclxuICAgICAgdGhpcy5pc09wZW5lZCA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kYXRhQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IHRoaXMuZGF0YUNvbnRhaW5lci5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgIHRoaXMuaXNPcGVuZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGluaXRVbnJvbGwgPSAoKSA9PiB7XHJcbiAgQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudW5yb2xsJykpLmZvckVhY2goKGVsZW0pID0+IHtcclxuICAgIG5ldyBVbnJvbGwoZWxlbSk7XHJcbiAgfSk7XHJcbn1cclxuIiwiLy8gcmVtb3ZlZCBieSBleHRyYWN0LXRleHQtd2VicGFjay1wbHVnaW4iLCJpbXBvcnQgU2VsZWN0IGZyb20gJy4vU2VsZWN0JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVjdERhdGVSYW5nZSB7XHJcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xyXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcclxuICAgIHRoaXMuc3RhcnRTZWxlY3QgPSBuZXcgU2VsZWN0KHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc2VsZWN0RGF0ZVJhbmdlX19zdGFydCcpKTtcclxuICAgIHRoaXMuZW5kU2VsZWN0ID0gbmV3IFNlbGVjdCh0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNlbGVjdERhdGVSYW5nZV9fZW5kJykpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQge1xyXG4gIGdldEN1cnJlbnRZZWFyLFxyXG4gIGdldEN1cnJlbnRNb250aE51bWJlcixcclxuICBnZXRNb250aE51bWJlclxyXG59IGZyb20gJy4vZGF0ZSc7XHJcblxyXG5jb25zdCBpbnNlcnRJbnRvID0gKGZpZWxkLCBjb250ZW50KSA9PiB7XHJcbiAgZmllbGQudGV4dENvbnRlbnQgPSBjb250ZW50XHJcbn07XHJcblxyXG5jb25zdCBzZWxlY3RFbCA9IChlbCkgPT4ge1xyXG4gIGNvbnN0IGN1cnJlbnRFbCA9IGVsLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignLmFjdGl2ZScpXHJcbiAgICB8fCB7IGNsYXNzTGlzdDogeyByZW1vdmUoKSB7IHJldHVybjsgfSB9IH07XHJcblxyXG4gIGN1cnJlbnRFbC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcclxuICBlbC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVjdCB7XHJcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xyXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcclxuICAgIHRoaXMudG9nZ2xlQnRuID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWxlY3REYXRlUmFuZ2VfX2l0ZW1Ub2dnbGVCdG4nKTtcclxuICAgIHRoaXMuZHJvcGRvd24gPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNlbGVjdERhdGVSYW5nZV9faXRlbVBhbmVsV3JhcCcpO1xyXG5cclxuICAgIHRoaXMudGl0bGVFbGVtID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWxlY3REYXRlUmFuZ2VfX2l0ZW1UaXRsZScpO1xyXG4gICAgdGhpcy55ZWFyc0NvbnRhaW5lciA9IHRoaXMuZHJvcGRvd24ucXVlcnlTZWxlY3RvcignLnNlbGVjdERhdGVSYW5nZV9feWVhcnMnKTtcclxuICAgIHRoaXMubW9udGhzQ29udGFpbmVyID0gdGhpcy5kcm9wZG93bi5xdWVyeVNlbGVjdG9yKCcuc2VsZWN0RGF0ZVJhbmdlX19tb250aHMnKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHsgbW9udGg6ICcnLCB5ZWFyOiAnJyB9O1xyXG4gICAgdGhpcy5pc09wZW5lZCA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcclxuICB9XHJcblxyXG4gIGFkZEV2ZW50TGlzdGVuZXJzKCkge1xyXG4gICAgdGhpcy50b2dnbGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IHRoaXMudG9nZ2xlKCkgfSk7XHJcbiAgICB0aGlzLnllYXJzQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKHsgdGFyZ2V0IH0pID0+IHtcclxuICAgICAgY29uc3QgZWwgPSB0YXJnZXQuY2xvc2VzdCgnLnNlbGVjdERhdGVSYW5nZV9feWVhcnMgLmVsJyk7XHJcbiAgICAgIGlmICghZWwpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZWxlY3RZZWFyKGVsKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5tb250aHNDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoeyB0YXJnZXQgfSkgPT4ge1xyXG4gICAgICBjb25zdCBlbCA9IHRhcmdldC5jbG9zZXN0KCcuc2VsZWN0RGF0ZVJhbmdlX19tb250aHMgLmVsJyk7XHJcbiAgICAgIGlmICghZWwpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZWxlY3RNb250aChlbCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldE1vbnRoKG1vbnRoKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZS5tb250aCA9IG1vbnRoO1xyXG4gIH1cclxuXHJcbiAgc2V0WWVhcih5ZWFyKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZS55ZWFyID0geWVhcjtcclxuICB9XHJcblxyXG4gIHNlbGVjdFllYXIoZWwpIHtcclxuICAgIC8vIHdvcmsgd2l0aCBkYXRhXHJcbiAgICBjb25zdCB5ZWFyID0gZWwudGV4dENvbnRlbnQ7XHJcbiAgICB0aGlzLnNldFllYXIoeWVhcik7XHJcblxyXG4gICAgLy8gd29yayB3aXRoIERPTVxyXG4gICAgaWYgKE51bWJlcih5ZWFyKSA9PT0gZ2V0Q3VycmVudFllYXIoKSkge1xyXG4gICAgICB0aGlzLmxvY2tOb25QdXJjaGFzZWRNb250aCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51bmxvY2tBbGxNb250aCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdEVsKGVsKTtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZERhdGUubW9udGgpIHtcclxuICAgICAgY29uc3QgeyBtb250aCwgeWVhciB9ID0gdGhpcy5zZWxlY3RlZERhdGU7XHJcbiAgICAgIGluc2VydEludG8odGhpcy50aXRsZUVsZW0sIGAke21vbnRofSAke3llYXJ9YCk7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlbGVjdE1vbnRoKGVsKSB7XHJcbiAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdsb2NrZWQnKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd29yayB3aXRoIGRhdGFcclxuICAgIGNvbnN0IG1vbnRoID0gZWwudGV4dENvbnRlbnQ7XHJcbiAgICB0aGlzLnNldE1vbnRoKG1vbnRoKTtcclxuXHJcbiAgICAvLyB3b3JrIHdpdGggRE9NXHJcbiAgICBzZWxlY3RFbChlbCk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlLnllYXIpIHtcclxuICAgICAgY29uc3QgeyBtb250aCwgeWVhciB9ID0gdGhpcy5zZWxlY3RlZERhdGU7XHJcbiAgICAgIGluc2VydEludG8odGhpcy50aXRsZUVsZW0sIGAke21vbnRofSAke3llYXJ9YCk7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsaWNrT25XaW5kb3dIYW5kbGVyKHsgdGFyZ2V0IH0pIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNPcGVuZWQpIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpIHtcclxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuY2xpY2tPbldpbmRvd0hhbmRsZXIpO1xyXG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2lzT3BlbmVkJyk7XHJcbiAgICB0aGlzLmRyb3Bkb3duLnN0eWxlLmhlaWdodCA9IDA7XHJcbiAgICB0aGlzLmRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ3Zpc3VhbGx5aGlkZGVuJyk7XHJcbiAgICB0aGlzLmlzT3BlbmVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvcGVuKCkge1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja09uV2luZG93SGFuZGxlci5iaW5kKHRoaXMpKTtcclxuICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdpc09wZW5lZCcpO1xyXG4gICAgdGhpcy5kcm9wZG93bi5jbGFzc0xpc3QucmVtb3ZlKCd2aXN1YWxseWhpZGRlbicpO1xyXG4gICAgdGhpcy5kcm9wZG93bi5zdHlsZS5oZWlnaHQgPSB0aGlzLmRyb3Bkb3duLnNjcm9sbEhlaWdodDtcclxuICAgIHRoaXMuaXNPcGVuZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgbG9ja05vblB1cmNoYXNlZE1vbnRoKCkge1xyXG4gICAgY29uc3QgY3JuTW9udGhOdW1iZXIgPSBnZXRDdXJyZW50TW9udGhOdW1iZXIoKTtcclxuICAgIGNvbnN0IG1vbnRoTGlzdCA9IHRoaXMubW9udGhzQ29udGFpbmVyXHJcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCcuZWwnKTtcclxuXHJcbiAgICBBcnJheVxyXG4gICAgICAuZnJvbShtb250aExpc3QpXHJcbiAgICAgIC5mb3JFYWNoKChtb250aEVsKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbW9udGhOYW1lID0gbW9udGhFbC50ZXh0Q29udGVudC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IG1vbnRoTnVtYmVyID0gZ2V0TW9udGhOdW1iZXIobW9udGhOYW1lKTtcclxuXHJcbiAgICAgICAgaWYgKG1vbnRoTnVtYmVyID4gY3JuTW9udGhOdW1iZXIpIHtcclxuICAgICAgICAgIG1vbnRoRWwuY2xhc3NMaXN0LmFkZCgnbG9ja2VkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHVubG9ja0FsbE1vbnRoKCkge1xyXG4gICAgY29uc3QgbG9ja2VkTW9udGhFbG1zID0gdGhpcy5tb250aHNDb250YWluZXJcclxuICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJy5lbC5sb2NrZWQnKTtcclxuXHJcbiAgICBpZiAoIWxvY2tlZE1vbnRoRWxtcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIEFycmF5XHJcbiAgICAgIC5mcm9tKGxvY2tlZE1vbnRoRWxtcylcclxuICAgICAgLmZvckVhY2goKG1vbnRoRWwpID0+IHtcclxuICAgICAgICBtb250aEVsLmNsYXNzTGlzdC5yZW1vdmUoJ2xvY2tlZCcpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbn0iLCJjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XHJcbmNvbnN0IGN1cnJlbnRZZWFyID0gY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKTtcclxuY29uc3QgY3VycmVudE1vbnRoID0gY3VycmVudERhdGUuZ2V0TW9udGgoKTtcclxuXHJcbmNvbnN0IG1vbnRocyA9IFtcclxuICAn0Y/QvdCy0LDRgNGMJyxcclxuICAn0YTQtdCy0YDQsNC70YwnLFxyXG4gICfQvNCw0YDRgicsXHJcbiAgJ9Cw0L/RgNC10LvRjCcsXHJcbiAgJ9C80LDQuScsXHJcbiAgJ9C40Y7QvdGMJyxcclxuICAn0LjRjtC70YwnLFxyXG4gICfQsNCy0LPRg9GB0YInLFxyXG4gICfRgdC10L3RgtGP0LHRgNGMJyxcclxuICAn0L7QutGC0Y/QsdGA0YwnLFxyXG4gICfQvdC+0Y/QsdGA0YwnLFxyXG4gICfQtNC10LrQsNCx0YDRjCdcclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRDdXJyZW50WWVhciAgPSAoKSA9PiBjdXJyZW50WWVhcjtcclxuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRNb250aE51bWJlciA9ICgpID0+IGN1cnJlbnRNb250aDtcclxuZXhwb3J0IGNvbnN0IGdldE1vbnRoTnVtYmVyICA9IG1vbnRoTmFtZSA9PiBtb250aHMuaW5kZXhPZihtb250aE5hbWUpO1xyXG4iLCJpbXBvcnQgQmFja2dyb3VuZCBmcm9tICcuLi8uLi9sYXlvdXQvanMvYmFja2dyb3VuZCc7XG5pbXBvcnQgQW5pbWF0aW9ucyBmcm9tICcuLi8uLi9sYXlvdXQvanMvYW5pbWF0aW9uJztcbmltcG9ydCBGaXhIZWFkIGZyb20gJy4vanMvZml4SGVhZCc7XG5pbXBvcnQgTWVudVRyaWdnZXIgZnJvbSAnLi9qcy9tZW51VHJpZ2dlcic7XG5pbXBvcnQgU2Nyb2xsIGZyb20gJy4uLy4uL2xheW91dC9qcy9zY3JvbGwnO1xuXG5sZXQgQkc7XG5sZXQgTWVudTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBBbmltYXRpb25zIHtcblx0Y29uc3RydWN0b3IoKXtcblx0XHRzdXBlcigpO1xuXHRcdGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2l0ZUhlYWRlcicpWzBdKSByZXR1cm47XG5cblx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdG5ldyBGaXhIZWFkKCk7XG5cdFx0XHRuZXcgTWVudVRyaWdnZXIoKTtcblxuXHRcdFx0aWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gnKSkge1xuXHRcdFx0XHRpbXBvcnQoJy4vanMvc2VhcmNoVHJpZ2dlci5qcycpXG5cdFx0XHRcdCAgICAudGhlbiggKG1vZHVsZSk9PiB7XG5cdFx0XHRcdCAgICAgIGNvbnN0IFNlYXJjaFRyaWdnZXIgPSBtb2R1bGUuZGVmYXVsdDtcblx0XHRcdFx0ICAgICAgbmV3IFNlYXJjaFRyaWdnZXIoKTtcblx0XHRcdFx0ICAgIH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRuZXcgU2Nyb2xsKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ25hdmlnYXRpb25Hcm91cCcpWzBdLHtcblx0XHRcdFx0c2Nyb2xsU3R5bGU6e1xuXHRcdFx0XHRcdCd3aWR0aCc6ICczcHgnLFxuXHRcdFx0XHRcdCdiYWNrZ3JvdW5kJzogJ3JnYmEoMjU1LDI1NSwyNTUsMC43KScsXG5cdFx0XHRcdFx0J2JvcmRlclJhZGl1cyc6ICczcHgnXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0fSwgNDApO1xuXHRcdHRoaXMuaGVhZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc2l0ZUhlYWRlcicpWzBdO1xuXHRcdHRoaXMuaGVhZGVyQ29udGFpbmVyID0gdGhpcy5oZWFkZXIucGFyZW50Tm9kZTtcblx0XHR0aGlzLmJnID0gdGhpcy5oZWFkZXJDb250YWluZXIucXVlcnlTZWxlY3RvcignLnNpdGVIZWFkZXJfX2JnJyk7XG5cdFx0dGhpcy5uYXYgPSB0aGlzLmhlYWRlci5xdWVyeVNlbGVjdG9yKCcuc2l0ZUhlYWRlcl9fbmF2Jyk7XG5cdFx0dGhpcy5saW5rcyA9IHRoaXMubmF2LnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKTtcblx0XHR0aGlzLm1lbnUgPSB0aGlzLmhlYWRlckNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuc2l0ZU5hdl9fbWVudScpO1xuXG5cdFx0QkcgPSBuZXcgQmFja2dyb3VuZCh0aGlzLmJnLFt0aGlzLmhlYWRlckNvbnRhaW5lciwuLi50aGlzLm1lbnUucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbWVudS1ibG9jay1uYW1lXScpXSwgJ2hlaWdodCcpO1xuXG5cdFx0dGhpcy5oZWFkZXJMb2dpYygpO1xuXHR9XG5cblxuXHRoZWFkZXJMb2dpYygpIHtcblx0XHRbXS5mb3JFYWNoLmNhbGwodGhpcy5saW5rcywoaXRlbSk9Pntcblx0XHRcdGxldCBoZWFkQmxvY2tOYW1lID0gaXRlbS5kYXRhc2V0LmhlYWRCbG9ja05hbWU7XG5cdFx0XHRsZXQgZWwgPSB0aGlzLm1lbnUucXVlcnlTZWxlY3RvcihgW2RhdGEtbWVudS1ibG9jay1uYW1lPVwiJHtoZWFkQmxvY2tOYW1lfVwiXWApO1xuXG5cdFx0XHRpdGVtLmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZWVudGVyJywgZXZlbnQgPT4ge1xuXHRcdFx0XHRbXS5mb3JFYWNoLmNhbGwodGhpcy5saW5rcywoaXRlbSk9Pntcblx0XHRcdFx0XHRpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJy0tYWN0aXZlJyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpdGVtLmNsYXNzTGlzdC5hZGQoJy0tYWN0aXZlJyk7XG5cblx0XHRcdFx0dmFyIGFjdGl2ZSA9IHRoaXMubWVudS5xdWVyeVNlbGVjdG9yKGAuZmFkZUluW2RhdGEtbWVudS1ibG9jay1uYW1lXWApO1xuXHRcdFx0XHRpZiAoYWN0aXZlID09IGVsKSByZXR1cm47XG5cdFx0XHRcdGlmIChhY3RpdmUpXG5cdFx0XHRcdFx0dGhpcy5mYWRlT3V0KGFjdGl2ZSx7XG5cdFx0XHRcdFx0XHRkdXJhdGlvbjogMTUwXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQudGhlbigoKT0+e1xuXHRcdFx0XHRcdFx0c2hvd0FjdGl2ZUJsb2NrLmNhbGwodGhpcyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHNob3dBY3RpdmVCbG9jay5jYWxsKHRoaXMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMub3BlbmVkSGVhZGVyID0gdHJ1ZTtcblx0XHRcdH0pO1xuXG5cdFx0XHRmdW5jdGlvbiBzaG93QWN0aXZlQmxvY2soKSB7XG5cdFx0XHRcdGlmICghZWwpe1xuXHRcdFx0XHRcdEJHLmhpZGUoKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5mYWRlSW4oZWwse1xuXHRcdFx0XHRcdGRlbGF5OjMwMCxcblx0XHRcdFx0XHRkdXJhdGlvbjoxNTBcblx0XHRcdFx0fSk7XG5cdFx0XHRcdEJHLnNob3coKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGZ1bmN0aW9uIGhpZGVIZWFkTWVudSgpe1xuXHRcdFx0aWYgKCF0aGlzLm9wZW5lZEhlYWRlcikgcmV0dXJuO1xuXHRcdFx0bGV0IGVsID0gdGhpcy5tZW51LnF1ZXJ5U2VsZWN0b3IoYC5mYWRlSW5bZGF0YS1tZW51LWJsb2NrLW5hbWVdYCk7XG5cblx0XHRcdFtdLmZvckVhY2guY2FsbCh0aGlzLmxpbmtzLChpdGVtKT0+e1xuXHRcdFx0XHRpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJy0tYWN0aXZlJyk7XG5cdFx0XHR9KTtcblxuXHRcdFx0QkcuaGlkZSgpO1xuXHRcdFx0dGhpcy5mYWRlT3V0KGVsLHtcblx0XHRcdFx0ZHVyYXRpb246MTUwXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0dGhpcy5oZWFkZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lciggJ21vdXNlbGVhdmUnLCBldmVudCA9PiB7XG5cdFx0XHRoaWRlSGVhZE1lbnUuY2FsbCh0aGlzKTtcblx0XHR9KTtcblxuXHRcdGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NpdGVIZWFkZXJfX3JpZ2h0QmFyJylbMF0uYWRkRXZlbnRMaXN0ZW5lciggJ21vdXNlZW50ZXInLCBldmVudCA9PiB7XG5cdFx0XHRoaWRlSGVhZE1lbnUuY2FsbCh0aGlzKTtcblx0XHR9KTtcblxuXHRcdGFkZEV2ZW50TGlzdGVuZXIoICdzY3JvbGwnLCBldmVudCA9PiB7XG5cdFx0XHRoaWRlSGVhZE1lbnUuY2FsbCh0aGlzKTtcblx0XHR9KTtcblx0fVxufVxuIiwiaW1wb3J0IFRyYW5zaXRpb25FbmQgZnJvbSAnLi90cmFuc2l0aW9uRW5kJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuXHQvLyDQv9C10YDQtdC00LDQtdGC0YHRjyDRjdC70LXQvNC10L3RgiDQutC+0YLQvtGA0YvQuSDQv9C+0LrQsNC30YvQstCw0LXRgtGB0Y8v0YHQutGA0YvQstCw0LXRgtGB0Y8g0Lgg0Y3Qu9C10LzQtdC90YLRiywg0LrQvtGC0L7RgNGL0LUg0L3QsNC00L4g0LfQsNC60YDRi9GC0Ywg0L/QsNGA0LDQvNC10YLRgNC+0LwgXCLQstGL0YHQvtGC0LBcIlxuXHRjb25zdHJ1Y3RvcihiZ0VsZW1lbnQsIHBhcmVudHMsIHBhcmFtZXRlciwgdHJhbnNpdGlvbmVuZENhbGxiYWNrKSB7XG5cdFx0dGhpcy5lbCA9IGJnRWxlbWVudDtcblx0XHR0aGlzLnBhcmVudHMgPSBwYXJlbnRzIHx8IHRoaXMuZWw7XG5cdFx0dGhpcy5wYXJhbWV0ZXIgPSBwYXJhbWV0ZXI7XG5cdFx0dGhpc1t0aGlzLnBhcmFtZXRlcl0gPSB7XG5cdFx0XHRpbml0OiBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHRoaXMuZWwpW3RoaXMucGFyYW1ldGVyXSlcblx0XHR9XG5cdFx0aWYgKHRyYW5zaXRpb25lbmRDYWxsYmFjaylcblx0XHRcdHRoaXMudHJhbnNpdGlvbkVuZCA9IG5ldyBUcmFuc2l0aW9uRW5kKHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy5lbCxcblx0XHRcdFx0Y2FsbGJhY2s6IHRyYW5zaXRpb25lbmRDYWxsYmFja1xuXHRcdFx0fSlcblxuXHRcdHRoaXMuX19hbmltYXRpb25Db3VudCA9IDA7XG5cdH1cblxuXHRzaG93KCl7XG5cblx0XHR0aGlzLl9fc2hvd2luZyA9IHRydWU7XG5cblx0XHR0aGlzW3RoaXMucGFyYW1ldGVyXS5zdGFydCA9IHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUodGhpcy5lbClbdGhpcy5wYXJhbWV0ZXJdKSB8fCAwO1xuXHRcdHRoaXMuZWwuc3R5bGVbdGhpcy5wYXJhbWV0ZXJdID0gdGhpc1t0aGlzLnBhcmFtZXRlcl0uc3RhcnQgKyAncHgnO1xuXG5cdFx0bGV0IGFuaW1hdGlvbk51bWJlciA9IHRoaXMuX19hbmltYXRpb25Db3VudCsrO1xuXHRcdHRoaXMuZWwuc3R5bGVbJ3RyYW5zaXRpb24nXSA9ICdoZWlnaHQgLjNzIGVhc2UnO1xuXG5cdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCAoKSA9PiB7XG5cdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICgpID0+IHtcblx0XHRcdFx0bGV0IG1lbnVIZWlnaHQgPSAwO1xuXG5cdFx0XHRcdGlmICh0aGlzLnBhcmVudHMgaW5zdGFuY2VvZiBBcnJheSlcblx0XHRcdFx0XHRpZiAoIHRoaXMucGFyZW50cy5sZW5ndGggPT0gMSkge1xuXHRcdFx0XHRcdFx0bWVudUhlaWdodCA9IHBhcnNlSW50KCBnZXRDb21wdXRlZFN0eWxlKHRoaXMucGFyZW50c1swXSlbdGhpcy5wYXJhbWV0ZXJdKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhpcy5wYXJlbnRzLmZvckVhY2goIGl0ZW0gPT4ge1xuXHRcdFx0XHRcdFx0XHRsZXQgdmFsdWUgPSBwYXJzZUludCggZ2V0Q29tcHV0ZWRTdHlsZShpdGVtKVt0aGlzLnBhcmFtZXRlcl0gKVxuXG5cdFx0XHRcdFx0XHRcdGlmICh2YWx1ZSAhPT0gdmFsdWUpIHJldHVybjtcblx0XHRcdFx0XHRcdFx0bWVudUhlaWdodCArPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0bWVudUhlaWdodCA9IHBhcnNlSW50KCBnZXRDb21wdXRlZFN0eWxlKHRoaXMucGFyZW50cylbdGhpcy5wYXJhbWV0ZXJdKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuZWwuc3R5bGVbdGhpcy5wYXJhbWV0ZXJdID0gbWVudUhlaWdodCArICdweCc7XG5cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cdGhpZGUoKXtcblx0XHR0aGlzLl9faGlkaW5nID0gdHJ1ZTtcblxuXHRcdHRoaXMuZWwuc3R5bGVbJ3RyYW5zaXRpb24nXSA9ICdoZWlnaHQgLjNzIGVhc2UgLjJzJztcblxuXHRcdGlmICghdGhpcy5fX3Nob3dpbmcgJiYgIXRoaXMuX19zaG93ZWQpIHJldHVybjtcblx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICgpID0+IHtcblx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSggKCkgPT4ge1xuXG5cdFx0XHRcdHRoaXMuZWwuc3R5bGVbdGhpcy5wYXJhbWV0ZXJdID0gJzBweCc7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXHRyZW1vdmVDYWxsYmFjaygpe1xuXHRcdHRoaXMudHJhbnNpdGlvbkVuZCAmJiB0aGlzLnRyYW5zaXRpb25FbmQuZW5kKCk7XG5cdH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyYW5zaXRpb25FbmQge1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0dGhpcy5lbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50IHx8IHdpbmRvdztcblx0XHR0aGlzLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjay5iaW5kKHRoaXMpO1xuXHRcdHRoaXMucGFyZW50ID0gb3B0aW9ucy5wYXJlbnQgfHwgbnVsbDtcblxuXHRcdHRoaXMuTGlzdGVuZXIoKTtcblx0fVxuXG5cdExpc3RlbmVyKCkge1xuXHRcdHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJyx0aGlzLmNhbGxiYWNrKTtcblx0fVxuXG5cdGVuZCgpIHtcblx0XHR0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsdGhpcy5jYWxsYmFjayk7XG5cdH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHR0aGlzLmhlYWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NvbnRhaW5lcl9fc2l0ZUhlYWRlcicpWzBdO1xuXHRcdHRoaXMucGFuZWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhbmVscycpO1xuXHRcdGNvbnN0IGhlYWRlckhlaWdodCA9IHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUodGhpcy5oZWFkZXIpLmhlaWdodCk7XG5cdFx0Y29uc3QgcGFnZU5hdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoWycucGFnZU5hdicsJy5zaXRlVGl0bGUnXSlbMF07XG5cdFx0aWYoIXBhZ2VOYXYgfHwgIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaXRlVGl0bGUnKSlcblx0XHRcdHJldHVybjtcblxuXHRcdGxldCB7IGJvdHRvbSB9ID0gcGFnZU5hdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRib3R0b20gKz0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuXHRcdGFkZEV2ZW50TGlzdGVuZXIoICdzY3JvbGwnLCBldmVudCA9PiB7XG5cdFx0XHRjb25zdCBzY3JvbGwgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cdFx0XHRpZiAoc2Nyb2xsID4gYm90dG9tKSB7XG5cdFx0XHRcdGlmICghdGhpcy5fX2ZpeGVkKVxuXHRcdFx0XHRcdHRoaXMuZml4KCk7XG5cdFx0XHR9IGVsc2UgaWYgKHNjcm9sbCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMudW5GaXgoKTtcblx0XHRcdH1cblx0XHRcdGlmIChzY3JvbGwgPiBib3R0b20vNCoyKSB7XG5cdFx0XHRcdHRoaXMuc2hvdygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCF0aGlzLl9fZml4ZWQpIHtcblx0XHRcdFx0XHR0aGlzLmhpZGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Zml4KCkge1xuXHRcdHRoaXMuX19maXhlZCA9IHRydWU7XG5cdFx0dGhpcy5oZWFkZXIuY2xhc3NMaXN0LmFkZCgnY29udGFpbmVyX19zaXRlSGVhZGVyLS1maXhlZCcpO1xuXG5cdFx0dmFyIGhlbHBlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0aGVscGVyRGl2LnN0eWxlLmhlaWdodCA9IHRoaXMuaGVhZGVyLm9mZnNldEhlaWdodCArIFwicHhcIjtcblx0XHRoZWxwZXJEaXYuY2xhc3NMaXN0LmFkZCgnaGVscGVyRGl2Jyk7XG5cdFx0dmFyIHBhcmVudERpdiA9IHRoaXMuaGVhZGVyLnBhcmVudE5vZGU7XG5cdFx0cGFyZW50RGl2Lmluc2VydEJlZm9yZShoZWxwZXJEaXYsIHBhcmVudERpdi5maXJzdENoaWxkKTtcblxuXHRcdHRoaXMuc2hvdygpO1xuXHR9XG5cblx0dW5GaXgoKSB7XG5cdFx0dGhpcy5fX2ZpeGVkID0gZmFsc2U7XG5cdFx0dGhpcy5oZWFkZXIuY2xhc3NMaXN0LnJlbW92ZSgnY29udGFpbmVyX19zaXRlSGVhZGVyLS1maXhlZCcpO1xuXG5cdFx0dmFyIGhlbHBlckRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hlbHBlckRpdicpWzBdO1xuXHRcdGhlbHBlckRpdiAmJiBoZWxwZXJEaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChoZWxwZXJEaXYpO1xuXG5cdFx0dGhpcy5oaWRlKCk7XG5cdH1cblxuXHRzaG93KCkge1xuXHRcdHRoaXMuaGVhZGVyLmNsYXNzTGlzdC5hZGQoJ2NvbnRhaW5lcl9fc2l0ZUhlYWRlci1hbmltYXRpb25Ub1RvcCcpO1xuXHR9XG5cblx0aGlkZSgpIHtcblx0XHR0aGlzLmhlYWRlci5jbGFzc0xpc3QucmVtb3ZlKCdjb250YWluZXJfX3NpdGVIZWFkZXItYW5pbWF0aW9uVG9Ub3AnKTtcblx0fVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLnRyaWdnZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVudS10cmlnZ2VyJyk7XG5cdFx0dGhpcy5oZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29udGFpbmVyX19zaXRlSGVhZGVyJyk7XG5cdFx0dGhpcy5tZW51ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNpdGVOYXZfX21lbnVMYXJnZScpO1xuXHRcdHRoaXMuY2xvc2VCdG4gPSB0aGlzLm1lbnUucXVlcnlTZWxlY3RvcignLnNpdGVOYXZfX21lbnVMYXJnZS1jbG9zZScpO1xuXG5cblx0XHRsZXQgY291bnQgPSAwO1xuXG5cdFx0dGhpcy5fX3Njcm9sbFdpZHRoID0gd2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoO1xuXG5cdFx0dGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ZW50ID0+IHtcblxuXHRcdFx0aWYgKHRoaXMudHJpZ2dlci5jaGVja2VkKSB7XG5cdFx0XHRcdGlmICghZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbW9iaWxlJykpIHtcblx0XHRcdFx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLm1hcmdpblJpZ2h0ID0gdGhpcy5fX3Njcm9sbFdpZHRoICsgJ3B4Jztcblx0XHRcdFx0XHR0aGlzLmhlYWRlci5zdHlsZS5wYWRkaW5nUmlnaHQgPSB0aGlzLl9fc2Nyb2xsV2lkdGggKyAncHgnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgncmVtb3ZlLXNjcm9sbCcpO1xuXG5cdFx0XHRcdGlmIChjb3VudCsrID09IDApIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdHRoaXMubWVudS5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuXHRcdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSggKCk9Pntcblx0XHRcdFx0XHRcdHRoaXMub3BlbigpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICghZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbW9iaWxlJykpIHtcblx0XHRcdFx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLm1hcmdpblJpZ2h0ID0gJyc7XG5cdFx0XHRcdFx0dGhpcy5oZWFkZXIuc3R5bGUucGFkZGluZ1JpZ2h0ID0gJyc7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdyZW1vdmUtc2Nyb2xsJyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR0aGlzLmNsb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuXHRcdFx0dGhpcy5vcGVuKCkgfHwgdGhpcy5jbG9zZSgpO1xuXHRcdH0pO1xuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXZlbnQgPT4ge1xuXHRcdFx0aWYgKGV2ZW50LmtleT09J0VzY2FwZSd8fGV2ZW50LmtleT09J0VzYyd8fGV2ZW50LmtleUNvZGU9PTI3KSB7XG5cdFx0XHRcdHRoaXMuY2xvc2UoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubmF2aWdhdGlvbkdyb3VwJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7XG5cdFx0XHRpZiAoZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJ2EnKSkge1xuXHRcdFx0XHR0aGlzLmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRvcGVuKCl7XG5cdFx0aWYgKHRoaXMudHJpZ2dlci5jaGVja2VkKSByZXR1cm47XG5cblx0XHR0aGlzLnRyaWdnZXIuY2xpY2soKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGNsb3NlKCl7XG5cdFx0aWYgKCF0aGlzLnRyaWdnZXIuY2hlY2tlZCkgcmV0dXJuO1xuXG5cdFx0dGhpcy50cmlnZ2VyLmNsaWNrKCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjcm9sbGJhciB7XG5cdGNvbnN0cnVjdG9yKGVsZW1lbnQsb3B0aW9ucyA9IHt9KXtcblx0XHR0aGlzLl9fZWwgPSBlbGVtZW50O1xuXHRcdHRoaXMuX19lbC5zdHlsZS5tYXJnaW5SaWdodCA9ICctODVweCc7XG5cdFx0dGhpcy5fX2VsLnN0eWxlLnBhZGRpbmdSaWdodCA9ICc3MHB4Jztcblx0XHR0aGlzLl9fZWwucGFyZW50Tm9kZS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuXG5cdFx0dGhpcy5zY3JvbGxTdHlsZSA9IG9wdGlvbnMuc2Nyb2xsU3R5bGU7XG5cblx0XHR0aGlzLnNjcm9sbEhlaWdodCA9IHRoaXMuX19lbC5zY3JvbGxIZWlnaHQ7XG5cdFx0dGhpcy5oZWlnaHQgPSB0aGlzLl9fZWwub2Zmc2V0SGVpZ2h0O1xuXHRcdHRoaXMuZ2VuZXJhdGVCYXIoKTtcblx0XHR0aGlzLmJhclN0eWxlcygpO1xuXHRcdHRoaXMubGlzdGVuZXIoKTtcblx0XHR0aGlzLmdlbmVyYXRlQ29udGFpbmVyKCk7XG5cdH1cblxuXHRnZW5lcmF0ZUJhcigpe1xuXHRcdHRoaXMuc2Nyb2xsQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0dGhpcy5zY3JvbGxQYW5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdHRoaXMuc2Nyb2xsQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc2Nyb2xsUGFuZWwpO1xuXG5cdFx0dGhpcy5fX2VsLnBhcmVudE5vZGUuYXBwZW5kKHRoaXMuc2Nyb2xsQ29udGFpbmVyKTtcblx0fVxuXG5cdGdlbmVyYXRlQ29udGFpbmVyKCl7XG5cblx0XHQvLyBjb25zb2xlLmxvZyh0aGlzLl9fZWwuY2hpbGROb2Rlcyk7XG5cdH1cblxuXHRiYXJTdHlsZXMoKXtcblx0XHRsZXQgY1N0eSA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLnN0eWxlO1xuXHRcdGxldCBwU3R5ID0gdGhpcy5zY3JvbGxQYW5lbC5zdHlsZTtcblxuXHRcdGNTdHkucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHRcdGNTdHkucmlnaHQgPSAwO1xuXHRcdGNTdHkudG9wID0gMDtcblx0XHRjU3R5LndpZHRoID0gJzEwcHgnO1xuXHRcdGNTdHkuaGVpZ2h0ID0gJzEwMCUnO1xuXHRcdGNTdHkuYmFja2dyb3VuZCA9ICcnO1xuXG5cdFx0cFN0eS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0aWYgKCF0aGlzLnNjcm9sbFN0eWxlKXtcblx0XHRcdHBTdHkud2lkdGggPSAnNXB4Jztcblx0XHRcdHBTdHkucmlnaHQgPSAxO1xuXHRcdFx0cFN0eS5iYWNrZ3JvdW5kID0gJ2xpbmVhci1ncmFkaWVudCgxODBkZWcsIzgzZWI2NywjMGNhNDgwKSc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAodmFyIHBhcmFtZXRlciBpbiB0aGlzLnNjcm9sbFN0eWxlKSB7XG5cdFx0XHRcdHBTdHlbcGFyYW1ldGVyXSA9IHRoaXMuc2Nyb2xsU3R5bGVbcGFyYW1ldGVyXTtcblx0XHRcdH1cblx0XHR9XG5cblxuXHRcdHRoaXMuc2V0U2Nyb2xsKClcblxuXHR9XG5cblx0bGlzdGVuZXIoKXtcblx0XHR0aGlzLl9fZWwuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywoKT0+e1xuXHRcdFx0dGhpcy5zZXRTY3JvbGwoKTtcblx0XHR9KTtcblxuXHRcdHRoaXMuX19lbC5hZGRFdmVudExpc3RlbmVyKCAnc2V0U2Nyb2xsT25NYXAnLCBldmVudCA9PiB7XG5cdFx0XHR0aGlzLnNldFNjcm9sbCgpO1xuXHRcdH0pO1xuXG5cdFx0YWRkRXZlbnRMaXN0ZW5lciggJ3Jlc2l6ZScsIGV2ZW50ID0+IHtcblx0XHRcdHRoaXMuc2V0U2Nyb2xsKCk7XG5cdFx0fSk7XG5cblx0fVxuXG5cdHNldFNjcm9sbCgpe1xuXG5cdFx0dGhpcy5zY3JvbGxIZWlnaHQgPSB0aGlzLl9fZWwuc2Nyb2xsSGVpZ2h0O1xuXHRcdHRoaXMuaGVpZ2h0ID0gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9fZWwpLmhlaWdodCk7XG5cdFx0bGV0IGhlaWdodCA9IHRoaXMuaGVpZ2h0L3RoaXMuc2Nyb2xsSGVpZ2h0ICogMTAwO1xuXHRcdGxldCB0b3AgPSB0aGlzLl9fZWwuc2Nyb2xsVG9wL3RoaXMuc2Nyb2xsSGVpZ2h0ICogMTAwO1xuXHRcdGlmIChoZWlnaHQgPT0gMTAwICkgaGVpZ2h0ID0gMDtcblx0XHR0aGlzLnNjcm9sbFBhbmVsLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICclJztcblxuXHRcdHRoaXMuc2Nyb2xsUGFuZWwuc3R5bGUudG9wID0gdG9wICsgJyUnO1xuXG5cdH1cblxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLnRyaWdnZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VhcmNoLXRyaWdnZXInKTtcblx0XHR0aGlzLmhlYWRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb250YWluZXJfX3NpdGVIZWFkZXInKTtcblx0XHR0aGlzLmNsb3NlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlYXJjaEZvcm1fX2Nsb3NlJyk7XG5cdFx0dGhpcy5iZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2hGb3JtX19iZycpO1xuXHRcdHRoaXMuaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoRm9ybV9fZm9ybSBpbnB1dCcpO1xuXHRcdHRoaXMuX19zY3JvbGxXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aDtcblxuXHRcdGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyQmxvZ19faWNvbi0tc2VhcmNoJykpIHtcbiAgICAgIHRoaXMuaGVhZGVyQmxvY2tJY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhlYWRlckJsb2dfX2ljb24tLXNlYXJjaCcpO1xuICAgIH1cblxuXHRcdHRoaXMudHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBldmVudCA9PiB7XG5cdFx0XHRpZiAodGhpcy50cmlnZ2VyLmNoZWNrZWQpIHtcblx0XHRcdFx0ZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW5SaWdodCA9IHRoaXMuX19zY3JvbGxXaWR0aCArICdweCc7XG5cdFx0XHRcdGlmICh0aGlzLmhlYWRlci5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbnRhaW5lcl9fc2l0ZUhlYWRlci0tZml4ZWQnKSkge1xuXHRcdFx0XHRcdHRoaXMuaGVhZGVyLnN0eWxlLnBhZGRpbmdSaWdodCA9IHRoaXMuX19zY3JvbGxXaWR0aCArICdweCc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkZXJCbG9nX19pY29uLS1zZWFyY2gnKSkge1xuXHRcdFx0XHRcdHRoaXMuaGVhZGVyQmxvY2tJY29uLmNsYXNzTGlzdC5hZGQoJy0tb3BlbmVkJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdyZW1vdmUtc2Nyb2xsJyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLm1hcmdpblJpZ2h0ID0gJyc7XG5cdFx0XHRcdGlmICh0aGlzLmhlYWRlci5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbnRhaW5lcl9fc2l0ZUhlYWRlci0tZml4ZWQnKSkge1xuXHRcdFx0XHRcdHRoaXMuaGVhZGVyLnN0eWxlLnBhZGRpbmdSaWdodCA9ICcnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyQmxvZ19faWNvbi0tc2VhcmNoJykpIHtcblx0XHRcdFx0XHR0aGlzLmhlYWRlckJsb2NrSWNvbi5jbGFzc0xpc3QucmVtb3ZlKCctLW9wZW5lZCcpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgncmVtb3ZlLXNjcm9sbCcpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHRoaXMuY2xvc2UuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7XG5cdFx0XHR0aGlzLnRyaWdnZXIuY2xpY2soKTtcblx0XHRcdHRoaXMuaW5wdXQudmFsdWUgPSAnJztcblx0XHR9KTtcblx0XHR0aGlzLmJnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuXHRcdFx0dGhpcy50cmlnZ2VyLmNsaWNrKCk7XG5cdFx0XHR0aGlzLmlucHV0LnZhbHVlID0gJyc7XG5cdFx0fSk7XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBldmVudCA9PiB7XG5cdFx0XHRpZiAoZXZlbnQua2V5PT0nRXNjYXBlJ3x8ZXZlbnQua2V5PT0nRXNjJ3x8ZXZlbnQua2V5Q29kZT09MjcpIHtcblx0XHRcdFx0aWYgKHRoaXMudHJpZ2dlci5jaGVja2VkKSB7XG5cdFx0XHRcdFx0Ly8gdGhpcy50cmlnZ2VyLmNoZWNrZWQgPSBmYWxzZTtcblx0XHRcdFx0XHQvLyB0aGlzLnRyaWdnZXIuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScpKTtcblx0XHRcdFx0XHR0aGlzLnRyaWdnZXIuY2xpY2soKTtcblx0XHRcdFx0XHR0aGlzLmlucHV0LnZhbHVlID0gJyc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuIiwiaW1wb3J0IEJhY2tncm91bmQgZnJvbSAnLi4vLi4vbGF5b3V0L2pzL2JhY2tncm91bmQnO1xuaW1wb3J0IEFuaW1hdGlvbnMgZnJvbSAnLi4vLi4vbGF5b3V0L2pzL2FuaW1hdGlvbic7XG4vLyBpbXBvcnQgRml4SGVhZCBmcm9tICcuLi9oZWFkZXIvanMvZml4SGVhZCc7XG5pbXBvcnQgTWVudVRyaWdnZXIgZnJvbSAnLi4vaGVhZGVyL2pzL21lbnVUcmlnZ2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBBbmltYXRpb25zIHtcblx0Y29uc3RydWN0b3IoKXtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMubWVudSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4tLWhhc0NoaWxkcmVuJyk7XG5cblx0XHR0aGlzLl9fbGlzdGVuZXJzKCk7XG5cblx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdC8vIG5ldyBGaXhIZWFkKCk7XG5cdFx0XHRuZXcgTWVudVRyaWdnZXIoKTtcblxuXHRcdFx0Ly8gaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gnKSkge1xuXHRcdFx0Ly8gXHRpbXBvcnQoJy4uL2hlYWRlci9qcy9zZWFyY2hUcmlnZ2VyLmpzJylcblx0XHRcdC8vICAgICAudGhlbiggKG1vZHVsZSk9PiB7XG5cdFx0XHQvLyAgICAgICBjb25zdCBTZWFyY2hUcmlnZ2VyID0gbW9kdWxlLmRlZmF1bHQ7XG5cdFx0XHQvLyAgICAgICBuZXcgU2VhcmNoVHJpZ2dlcigpO1xuXHRcdFx0Ly8gICAgIH0pO1xuXHRcdFx0Ly8gfVxuXG5cdFx0fSwgNDApO1xuXHR9XG5cdF9fbGlzdGVuZXJzICgpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWVudS5sZW5ndGg7IGkrKykge1xuXHRcdFx0dGhpcy5tZW51W2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRsZXQgY2hpbGRMaXN0V3JhcCA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCdsaScpLnF1ZXJ5U2VsZWN0b3IoJy5jaGlsZE5hdicpO1xuXHRcdFx0XHRsZXQgY2hpbGRMaXN0ID0gY2hpbGRMaXN0V3JhcC5xdWVyeVNlbGVjdG9yKCd1bCcpO1xuXG5cdFx0XHRcdGxldCBjaGlsZEhlaWdodCA9IHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoY2hpbGRMaXN0KS5oZWlnaHQpO1xuXG5cdFx0XHRcdGlmIChldmVudC50YXJnZXQuY2xvc2VzdCgnbGknKS5jbGFzc0xpc3QuY29udGFpbnMoJy0tb3BlbicpKSB7XG5cdFx0XHRcdFx0Y2hpbGRMaXN0V3JhcC5zdHlsZS5oZWlnaHQgPSAwO1xuXHRcdFx0XHRcdGV2ZW50LnRhcmdldC5jbG9zZXN0KCdsaScpLmNsYXNzTGlzdC5yZW1vdmUoJy0tb3BlbicpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNoaWxkTGlzdFdyYXAuc3R5bGUuaGVpZ2h0ID0gY2hpbGRIZWlnaHQgKyAncHgnO1xuXHRcdFx0XHRcdGV2ZW50LnRhcmdldC5jbG9zZXN0KCdsaScpLmNsYXNzTGlzdC5hZGQoJy0tb3BlbicpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCBGaXhIZWFkIGZyb20gJy4uL2hlYWRlci9qcy9maXhIZWFkJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGVhZGVyQmxvZyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhlYWRlckJsb2cnKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtaGVhZGVyQmxvZy1sb2dvJyk7XG4gICAgdGhpcy5sb2dvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWhlYWRlckJsb2ctbG9nb0ltZycpO1xuICAgIHRoaXMuaGlkZGVuRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtaGVhZGVyQmxvZy1ob3ZlcicpO1xuICAgIHRoaXMuY2xvc2VJY29uTW9iaWxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1vYmlsZSAuanMtaGVhZGVyQmxvZ19fbG9nb0hvdmVyQ2xvc2UnKTtcblxuICAgIHRoaXMubGlzdGVuZXJzKCk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdG5ldyBGaXhIZWFkKCk7XG5cblx0XHRcdGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoJykpIHtcblx0XHRcdFx0aW1wb3J0KCcuLi9oZWFkZXIvanMvc2VhcmNoVHJpZ2dlci5qcycpXG5cdFx0XHRcdCAgICAudGhlbiggKG1vZHVsZSk9PiB7XG5cdFx0XHRcdCAgICAgIGNvbnN0IFNlYXJjaFRyaWdnZXIgPSBtb2R1bGUuZGVmYXVsdDtcblx0XHRcdFx0ICAgICAgbmV3IFNlYXJjaFRyaWdnZXIoKTtcblx0XHRcdFx0ICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN1YnNjcmliZScpKSB7XG5cdFx0XHRcdGltcG9ydCgnLi9qcy9zdWJzY3JpYmVUcmlnZ2VyLmpzJylcblx0XHRcdFx0ICAgIC50aGVuKCAobW9kdWxlKT0+IHtcblx0XHRcdFx0ICAgICAgY29uc3QgU3Vic2NyaWJlVHJpZ2dlciA9IG1vZHVsZS5kZWZhdWx0O1xuXHRcdFx0XHQgICAgICBuZXcgU3Vic2NyaWJlVHJpZ2dlcigpO1xuXHRcdFx0XHQgICAgfSk7XG5cdFx0XHR9XG5cdFx0fSwgNDApO1xuICB9XG5cbiAgbGlzdGVuZXJzKCkge1xuICAgIHRoaXMubG9nby5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBldmVudCA9PiB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCctLWFjdGl2ZScpO1xuICAgICAgdGhpcy5oaWRkZW5FbC5jbGFzc0xpc3QuYWRkKCctLWFjdGl2ZScpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIGV2ZW50ID0+IHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJy0tYWN0aXZlJyk7XG4gICAgICB0aGlzLmhpZGRlbkVsLmNsYXNzTGlzdC5yZW1vdmUoJy0tYWN0aXZlJyk7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuY2xvc2VJY29uTW9iaWxlKSB7XG4gICAgICB0aGlzLmNsb3NlSWNvbk1vYmlsZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnLS1hY3RpdmUnKTtcbiAgICAgICAgdGhpcy5oaWRkZW5FbC5jbGFzc0xpc3QucmVtb3ZlKCctLWFjdGl2ZScpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGVhZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRhaW5lcl9fc2l0ZUhlYWRlcicpXG4gICAgdGhpcy50cmlnZ2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1YnNjcmliZS10cmlnZ2VyJylcbiAgICB0aGlzLmNsb3NlQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN1YnNjcmliZV9fZm9ybUNsb3NlJylcbiAgICB0aGlzLmJnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN1YnNjcmliZV9fYmcnKVxuICAgIHRoaXMuaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc3Vic2NyaWJlX19mb3JtIGlucHV0W3R5cGU9XCJ0ZXh0XCJdJylcbiAgICB0aGlzLnNjcm9sbFdpZHRoID0gd2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoICAgIFxuXG4gICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkZXJCbG9nX19pY29uLS1zdWJzY3JpYmUnKSkge1xuICAgICAgdGhpcy5oZWFkZXJCbG9ja0ljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyQmxvZ19faWNvbi0tc3Vic2NyaWJlJylcbiAgICB9XG5cbiAgICB0aGlzLmxpc3RlbmVycygpXG4gIH1cblxuICBsaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ZW50ID0+IHtcbiAgICAgIHRoaXMuc2hvd1N1YnNjcmliZSgpXG4gICAgfSlcbiAgICB0aGlzLmNsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuICAgICAgdGhpcy5jbG9zZVN1YnNjcmliZSgpXG4gICAgfSlcbiAgICB0aGlzLmJnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuICAgICAgdGhpcy5jbG9zZVN1YnNjcmliZSgpXG4gICAgfSlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGV2ZW50ID0+IHtcbiAgICAgIHRoaXMuY2xvc2VLZXlzKClcblx0XHR9KVxuICB9XG5cbiAgc2hvd1N1YnNjcmliZSgpIHtcbiAgICBpZiAodGhpcy50cmlnZ2VyLmNoZWNrZWQpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luUmlnaHQgPSB0aGlzLnNjcm9sbFdpZHRoICsgJ3B4J1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdyZW1vdmUtc2Nyb2xsJylcbiAgICAgIHRoaXMuaGVhZGVyQmxvY2tJY29uLmNsYXNzTGlzdC5hZGQoJy0tb3BlbmVkJylcbiAgICAgIGlmICh0aGlzLmhlYWRlci5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbnRhaW5lcl9fc2l0ZUhlYWRlci0tZml4ZWQnKSkge1xuICAgICAgICB0aGlzLmhlYWRlci5zdHlsZS5wYWRkaW5nUmlnaHQgPSB0aGlzLnNjcm9sbFdpZHRoICsgJ3B4J1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlucHV0LnZhbHVlID0gJydcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luUmlnaHQgPSAnJ1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdyZW1vdmUtc2Nyb2xsJylcbiAgICAgIHRoaXMuaGVhZGVyQmxvY2tJY29uLmNsYXNzTGlzdC5yZW1vdmUoJy0tb3BlbmVkJylcbiAgICAgIGlmICh0aGlzLmhlYWRlci5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbnRhaW5lcl9fc2l0ZUhlYWRlci0tZml4ZWQnKSkge1xuICAgICAgICB0aGlzLmhlYWRlci5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnJ1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNsb3NlU3Vic2NyaWJlKCkge1xuICAgIHRoaXMudHJpZ2dlci5jbGljaygpXG4gICAgdGhpcy5pbnB1dC52YWx1ZSA9ICcnXG4gIH1cblxuICBjbG9zZUtleXMoKSB7XG4gICAgaWYgKGV2ZW50LmtleT09J0VzY2FwZSd8fGV2ZW50LmtleT09J0VzYyd8fGV2ZW50LmtleUNvZGU9PTI3KSB7XG4gICAgICBpZiAodGhpcy50cmlnZ2VyLmNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyLmNsaWNrKClcbiAgICAgICAgdGhpcy5pbnB1dC52YWx1ZSA9ICcnXG4gICAgICB9XG4gICAgfVxuICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmhlYWRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkZXJCbG9nJylcbiAgICB0aGlzLnRyaWdnZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVudS10cmlnZ2VyJylcbiAgICB0aGlzLmJ1cmRlckJHID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhlYWRlckJsb2dfX21lbnVIaWRkZW4tYmcnKVxuICAgIHRoaXMuc2Nyb2xsV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGhcblxuICAgIHRoaXMubGlzdGVuZXJzKClcbiAgfVxuXG4gIGxpc3RlbmVycygpIHtcbiAgICB0aGlzLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZXZlbnQgPT4ge1xuICAgICAgdGhpcy5zaG93QnVyZ2VyKClcbiAgICB9KVxuICAgIHRoaXMuYnVyZGVyQkcuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7XG4gICAgICB0aGlzLmNsb3NlQnVyZ2VyKClcbiAgICB9KVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXZlbnQgPT4ge1xuICAgICAgdGhpcy5jbG9zZUtleXMoKVxuXHRcdH0pXG4gIH1cblxuICBzaG93QnVyZ2VyKCkge1xuICAgIGlmICh0aGlzLnRyaWdnZXIuY2hlY2tlZCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW5SaWdodCA9IHRoaXMuc2Nyb2xsV2lkdGggKyAncHgnXG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ3JlbW92ZS1zY3JvbGwnKVxuICAgICAgaWYgKHRoaXMuaGVhZGVyLmNsYXNzTGlzdC5jb250YWlucygnY29udGFpbmVyX19zaXRlSGVhZGVyLS1maXhlZCcpKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyLnN0eWxlLnBhZGRpbmdSaWdodCA9IHRoaXMuc2Nyb2xsV2lkdGggKyAncHgnXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luUmlnaHQgPSAnJ1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdyZW1vdmUtc2Nyb2xsJylcbiAgICAgIGlmICh0aGlzLmhlYWRlci5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbnRhaW5lcl9fc2l0ZUhlYWRlci0tZml4ZWQnKSkge1xuICAgICAgICB0aGlzLmhlYWRlci5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnJ1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNsb3NlQnVyZ2VyKCkge1xuICAgIHRoaXMudHJpZ2dlci5jbGljaygpXG4gIH1cblxuICBjbG9zZUtleXMoKSB7XG4gICAgaWYgKGV2ZW50LmtleT09J0VzY2FwZSd8fGV2ZW50LmtleT09J0VzYyd8fGV2ZW50LmtleUNvZGU9PTI3KSB7XG4gICAgICBpZiAodGhpcy50cmlnZ2VyLmNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyLmNsaWNrKClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBUYWdzRmlsdGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy50YWdzQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRhZ3NGaWx0ZXInKTtcbiAgICBpZiAoIXRoaXMudGFnc0NvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgdGhpcy50YWdzID0gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy10YWdGaWx0ZXInKV07XG4gICAgdGhpcy50YWdIZWlnaHQgPSB0aGlzLnRhZ3NbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIHRoaXMudGFnTWFyZ2luID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnRhZ3NbMF0pLm1hcmdpbkJvdHRvbTtcbiAgICB0aGlzLnRhZ01hcmdpbk51bWJlciA9IHRoaXMudGFnTWFyZ2luLnJlcGxhY2UoJ3B4JywgJycpO1xuICAgIHRoaXMuaGVpZ2h0SW5kaWNhdG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRhZ3NGaWx0ZXJfX2NvbnRhaW5lcicpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDsgICAgXG5cbiAgICB0aGlzLnRhZ3NDb250YWluZXJIZWlnaHQgPSB0aGlzLnRhZ3NDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIHRoaXMucm93SGVpZ2h0ID0gdGhpcy50YWdIZWlnaHQgKyArdGhpcy50YWdNYXJnaW5OdW1iZXI7XG4gICAgdGhpcy5tYXhIZWlnaHQgPSB0aGlzLnJvd0hlaWdodCAqIDQ7XG5cbiAgICB0aGlzLmJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy10YWdzLWJ0bicpO1xuICAgIHRoaXMuYnV0dG9uVHJpZ2dlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy10YWdzLWJ0biAuYnV0dG9uTW9yZS1saW5rJyk7XG5cbiAgICB0aGlzLmxpc3RlbmVycygpO1xuICAgIHRoaXMuc2V0QmxvY2soKTtcbiAgfVxuXG4gIGxpc3RlbmVycygpIHtcbiAgICB0aGlzLnRhZ3MuZm9yRWFjaCh0YWcgPT4ge1xuICAgICAgdGFnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuICAgICAgICB0aGlzLnRhZ0FjdGl2ZSh0YWcpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmJ1dHRvblRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7XG4gICAgICB0aGlzLmJ1dHRvbkFjdGl2ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgdGFnQWN0aXZlKHRhZykge1xuICAgIGlmICghdGFnLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIHtcbiAgICAgIHRhZy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFnLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIH1cbiAgfVxuXG4gIGJ1dHRvbkFjdGl2ZSgpIHtcbiAgICBpZiAoIXRoaXMuYnV0dG9uLmNsYXNzTGlzdC5jb250YWlucygnLS1vcGVuJykpIHtcbiAgICAgIHRoaXMuYnV0dG9uLmNsYXNzTGlzdC5hZGQoJy0tb3BlbicpO1xuICAgICAgdGhpcy5idXR0b25UcmlnZ2VyLmlubmVyVGV4dCA9ICfQodC60YDRi9GC0Ywg0YLQtdCz0LguLi4nOyAgICAgIFxuICAgICAgdGhpcy50YWdzQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IHRoaXMuaGVpZ2h0SW5kaWNhdG9yICsgJ3B4JztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnLS1vcGVuJyk7XG4gICAgICB0aGlzLmJ1dHRvblRyaWdnZXIuaW5uZXJUZXh0ID0gJ9Cf0L7QutCw0LfQsNGC0Ywg0LLRgdC1INGC0LXQs9C4Li4uJztcbiAgICAgIHRoaXMudGFnc0NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSB0aGlzLm1heEhlaWdodCArICdweCc7XG4gICAgfVxuICB9XG5cbiAgc2V0QmxvY2soKSB7XG4gICAgaWYgKHRoaXMudGFnc0NvbnRhaW5lckhlaWdodCA+IHRoaXMubWF4SGVpZ2h0KSB7XG4gICAgICB0aGlzLmJ1dHRvbi5jbGFzc0xpc3QuYWRkKCctLXNob3cnKTtcbiAgICAgIHRoaXMudGFnc0NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSB0aGlzLm1heEhlaWdodCArICdweCc7XG4gICAgfVxuICB9XG59IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuLy8gVGhpcyBtZXRob2Qgb2Ygb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0IG5lZWRzIHRvIGJlXG4vLyBrZXB0IGlkZW50aWNhbCB0byB0aGUgd2F5IGl0IGlzIG9idGFpbmVkIGluIHJ1bnRpbWUuanNcbnZhciBnID0gKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcblxuLy8gVXNlIGBnZXRPd25Qcm9wZXJ0eU5hbWVzYCBiZWNhdXNlIG5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCBjYWxsaW5nXG4vLyBgaGFzT3duUHJvcGVydHlgIG9uIHRoZSBnbG9iYWwgYHNlbGZgIG9iamVjdCBpbiBhIHdvcmtlci4gU2VlICMxODMuXG52YXIgaGFkUnVudGltZSA9IGcucmVnZW5lcmF0b3JSdW50aW1lICYmXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGcpLmluZGV4T2YoXCJyZWdlbmVyYXRvclJ1bnRpbWVcIikgPj0gMDtcblxuLy8gU2F2ZSB0aGUgb2xkIHJlZ2VuZXJhdG9yUnVudGltZSBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIHJlc3RvcmVkIGxhdGVyLlxudmFyIG9sZFJ1bnRpbWUgPSBoYWRSdW50aW1lICYmIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuXG4vLyBGb3JjZSByZWV2YWx1dGF0aW9uIG9mIHJ1bnRpbWUuanMuXG5nLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9ydW50aW1lXCIpO1xuXG5pZiAoaGFkUnVudGltZSkge1xuICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBydW50aW1lLlxuICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IG9sZFJ1bnRpbWU7XG59IGVsc2Uge1xuICAvLyBSZW1vdmUgdGhlIGdsb2JhbCBwcm9wZXJ0eSBhZGRlZCBieSBydW50aW1lLmpzLlxuICB0cnkge1xuICAgIGRlbGV0ZSBnLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgfSBjYXRjaChlKSB7XG4gICAgZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuIShmdW5jdGlvbihnbG9iYWwpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICB2YXIgaW5Nb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiO1xuICB2YXIgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIGlmIChydW50aW1lKSB7XG4gICAgaWYgKGluTW9kdWxlKSB7XG4gICAgICAvLyBJZiByZWdlbmVyYXRvclJ1bnRpbWUgaXMgZGVmaW5lZCBnbG9iYWxseSBhbmQgd2UncmUgaW4gYSBtb2R1bGUsXG4gICAgICAvLyBtYWtlIHRoZSBleHBvcnRzIG9iamVjdCBpZGVudGljYWwgdG8gcmVnZW5lcmF0b3JSdW50aW1lLlxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgZXZhbHVhdGluZyB0aGUgcmVzdCBvZiB0aGlzIGZpbGUgaWYgdGhlIHJ1bnRpbWUgd2FzXG4gICAgLy8gYWxyZWFkeSBkZWZpbmVkIGdsb2JhbGx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmluZSB0aGUgcnVudGltZSBnbG9iYWxseSAoYXMgZXhwZWN0ZWQgYnkgZ2VuZXJhdGVkIGNvZGUpIGFzIGVpdGhlclxuICAvLyBtb2R1bGUuZXhwb3J0cyAoaWYgd2UncmUgaW4gYSBtb2R1bGUpIG9yIGEgbmV3LCBlbXB0eSBvYmplY3QuXG4gIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lID0gaW5Nb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA6IHt9O1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIHJ1bnRpbWUud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9XG4gICAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgcnVudGltZS5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBpZiAoISh0b1N0cmluZ1RhZ1N5bWJvbCBpbiBnZW5GdW4pKSB7XG4gICAgICAgIGdlbkZ1blt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIHJ1bnRpbWUuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLiBJZiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZCwgaG93ZXZlciwgdGhlXG4gICAgICAgICAgLy8gcmVzdWx0IGZvciB0aGlzIGl0ZXJhdGlvbiB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWVcbiAgICAgICAgICAvLyByZWFzb24uIE5vdGUgdGhhdCByZWplY3Rpb25zIG9mIHlpZWxkZWQgUHJvbWlzZXMgYXJlIG5vdFxuICAgICAgICAgIC8vIHRocm93biBiYWNrIGludG8gdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgYXMgaXMgdGhlIGNhc2VcbiAgICAgICAgICAvLyB3aGVuIGFuIGF3YWl0ZWQgUHJvbWlzZSBpcyByZWplY3RlZC4gVGhpcyBkaWZmZXJlbmNlIGluXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYmV0d2VlbiB5aWVsZCBhbmQgYXdhaXQgaXMgaW1wb3J0YW50LCBiZWNhdXNlIGl0XG4gICAgICAgICAgLy8gYWxsb3dzIHRoZSBjb25zdW1lciB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHRoZSB5aWVsZGVkXG4gICAgICAgICAgLy8gcmVqZWN0aW9uIChzd2FsbG93IGl0IGFuZCBjb250aW51ZSwgbWFudWFsbHkgLnRocm93IGl0IGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBnZW5lcmF0b3IsIGFiYW5kb24gaXRlcmF0aW9uLCB3aGF0ZXZlcikuIFdpdGhcbiAgICAgICAgICAvLyBhd2FpdCwgYnkgY29udHJhc3QsIHRoZXJlIGlzIG5vIG9wcG9ydHVuaXR5IHRvIGV4YW1pbmUgdGhlXG4gICAgICAgICAgLy8gcmVqZWN0aW9uIHJlYXNvbiBvdXRzaWRlIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIHNvIHRoZVxuICAgICAgICAgIC8vIG9ubHkgb3B0aW9uIGlzIHRvIHRocm93IGl0IGZyb20gdGhlIGF3YWl0IGV4cHJlc3Npb24sIGFuZFxuICAgICAgICAgIC8vIGxldCB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhbmRsZSB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgcnVudGltZS5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgcnVudGltZS5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpXG4gICAgKTtcblxuICAgIHJldHVybiBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAgIC8vIFwicmV0dXJuXCIgdG8gXCJ0aHJvd1wiLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgR3BbdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JcIjtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBydW50aW1lLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgcnVudGltZS52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcbn0pKFxuICAvLyBJbiBzbG9wcHkgbW9kZSwgdW5ib3VuZCBgdGhpc2AgcmVmZXJzIHRvIHRoZSBnbG9iYWwgb2JqZWN0LCBmYWxsYmFjayB0b1xuICAvLyBGdW5jdGlvbiBjb25zdHJ1Y3RvciBpZiB3ZSdyZSBpbiBnbG9iYWwgc3RyaWN0IG1vZGUuIFRoYXQgaXMgc2FkbHkgYSBmb3JtXG4gIC8vIG9mIGluZGlyZWN0IGV2YWwgd2hpY2ggdmlvbGF0ZXMgQ29udGVudCBTZWN1cml0eSBQb2xpY3kuXG4gIChmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMgfSkoKSB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKClcbik7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1vZGFsKG9wdGlvbnMpIHtcblxuICBpZiAoIW9wdGlvbnMpIHJldHVybjtcblxuICB0aGlzLl9fcGFyc2VPcHRpb25zKG9wdGlvbnMpO1xuXG4gIGlmICghd2luZG93Lk1vZGFsQ291bnRfX1Fhc1JmbXdPUmtkYXNScykgd2luZG93Lk1vZGFsQ291bnRfX1Fhc1JmbXdPUmtkYXNScyA9IDA7XG5cbiAgaWYgKCF3aW5kb3cuQWZtSmRuSlJFUWpvc19fbW9kYWxTdHlsZXMpIHRoaXMuX19zdHlsZXMoKTtcbiAgaWYgKHRoaXMuaGFzaCkgdGhpcy5fX2hhc2hMaXN0ZW5lcigpO1xuXG4gIHRoaXMuX19yZXNpemVzKCk7XG59XG5cbk1vZGFsLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblxuICBpZiAodGhpcy5jbG9zaW5nIHx8IHRoaXMub3BlbmluZykgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG4gIGlmICh0aGlzLl9fb3BlbmVkKSByZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcbiAgdGhpcy5fX2RpbmFtaWMgJiYgdGhpcy5lbGVtZW50KHRoaXMuX19xdWVyeSk7XG4gIGlmICghdGhpcy5fX2VsKSB7XG4gICAgdGhpcy5vcGVuaW5nID0gbnVsbDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCLQndC1INC30LDQtNCw0L0g0Y3Qu9C10LzQtdC90YIgfiBlbGVtZW50OicuYXNkJyB8fCBlbGVtZW50OmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hc2QnKSB+IFwiKTtcbiAgfVxuICBpZiAod2luZG93Ll9fTW9kYWxPcGVuX19BZGFOSFJHVVd1bmRxVSA9PSB0aGlzLl9fZWwpIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuICB0aGlzLm9wZW5pbmcgPSB0cnVlO1xuICB3aW5kb3cuX19Nb2RhbE9wZW5fX0FkYU5IUkdVV3VuZHFVID0gdGhpcy5fX2VsO1xuXG5cbiAgZG9jdW1lbnQuYm9keS5zdHlsZS53aWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCArICdweCc7XG4gIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgdGhpcy5fX3Njcm9sbGJhclNpemUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggLSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoO1xuXG4gIGlmICh0aGlzLl9fbW9kYWxTdHlsZSkge1xuICAgIGZvciAodmFyIHZhcmlhYmxlIGluIHRoaXMuX19tb2RhbFN0eWxlKSB7XG4gICAgICB0aGlzLl9fZWwuc3R5bGVbdmFyaWFibGVdID0gdGhpcy5fX21vZGFsU3R5bGVbdmFyaWFibGVdO1xuICAgIH1cbiAgfVxuICBvcHRpb25zICYmIHRoaXMuX19wYXJzZU9wdGlvbnMob3B0aW9ucyk7XG4gIHRoaXMuX19vcGVuQ2FsbGJhY2sgJiYgdGhpcy5fX29wZW5DYWxsYmFjaygpO1xuICB0aGlzLl9fc2V0QmcoKTtcbiAgdmFyIF90aGlzID0gdGhpcztcbiAgcmV0dXJuIHRoaXMuX19zaG93RWxlbWVudCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuXG4gICAgX3RoaXMuX19idXR0b25zTGlzdGVuZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGUudGFyZ2V0LmNsb3Nlc3QoJy5tb2RhbF9fY2xvc2UnKSkge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX19lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX19idXR0b25zTGlzdGVuZXIpO1xuICAgICAgfVxuICAgIH0uYmluZChfdGhpcyk7XG5cbiAgICBfdGhpcy5fX2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgX3RoaXMuX19idXR0b25zTGlzdGVuZXIpO1xuXG4gICAgaWYgKF90aGlzLmhhc2gpIGxvY2F0aW9uLmhhc2ggPSBfdGhpcy5oYXNoO1xuICAgIF90aGlzLl9fb3BlbmVkID0gdHJ1ZTtcbiAgICBfdGhpcy5vcGVuaW5nID0gbnVsbDtcbiAgICBfdGhpcy5fX2FmdGVyT3BlbkNhbGxiYWNrICYmIF90aGlzLl9fYWZ0ZXJPcGVuQ2FsbGJhY2soKTtcbiAgfSk7XG59O1xuXG5Nb2RhbC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICBvcHRpb25zICYmIHRoaXMuX19wYXJzZU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgaWYgKHRoaXMuY2xvc2luZyB8fCB0aGlzLm9wZW5pbmcpIHtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIGlmIChfdGhpcy50aW1lb3V0KSBjbGVhclRpbWVvdXQoX3RoaXMudGltZW91dCk7XG5cbiAgICAgIF90aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICBfdGhpcy5fX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCB0cmFuc2l0aW9uRW5kRik7XG4gICAgICAgIGNvbnNvbGUud2Fybign0JDQstCw0LnRgNC40LnQvdC+0LUg0LfQsNC60YDRi9GC0LjQtSDQv9C+0L/QsNC/0LAuINCd0LUg0L/RgNCw0LLQuNC70YzQvdC+INGB0YDQsNCx0L7RgtCw0Lsg0YHQutGA0LjQv9GCINC30LDQutGA0YvRgtC40Y8uINCd0LXQvtCx0YXQvtC00LjQvNC+INGA0LDQt9C+0LHRgNCw0YLRjNGB0Y8uJywgbmV3IEVycm9yKCkuc3RhY2spO1xuICAgICAgICBfdGhpcy5fX2JnLnJlbW92ZSgpO1xuICAgICAgICB3aW5kb3cuX19Nb2RhbE9wZW5fX0FkYU5IUkdVV3VuZHFVID0gbnVsbDtcbiAgICAgICAgX3RoaXMuX19lbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIF90aGlzLl9fZWwuc3R5bGUub3BhY2l0eSA9ICcnO1xuICAgICAgICBfdGhpcy5fX29wZW5lZCA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5vcGVuaW5nID0gbnVsbDtcbiAgICAgICAgX3RoaXMuY2xvc2luZyA9IG51bGw7XG4gICAgICB9LCAzMDAwKTtcblxuICAgICAgZnVuY3Rpb24gdHJhbnNpdGlvbkVuZEYoKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgX3RoaXMuY2xvc2UoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMudGltZW91dCk7XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIF90aGlzLl9fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHRyYW5zaXRpb25FbmRGKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX19lbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgdHJhbnNpdGlvbkVuZEYpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKCF0aGlzLl9fb3BlbmVkKSByZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcbiAgdGhpcy5jbG9zaW5nID0gdHJ1ZTtcbiAgd2luZG93Ll9fTW9kYWxPcGVuX19BZGFOSFJHVVd1bmRxVSA9IG51bGw7XG4gIHRoaXMuX19jbG9zZUNhbGxiYWNrICYmIHRoaXMuX19jbG9zZUNhbGxiYWNrKCk7XG4gIHRoaXMuX19iZy5jbGFzc0xpc3QucmVtb3ZlKCdtb2RhbC0tb3BlbicpO1xuICB0aGlzLl9fYmcuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpcy5fX2JnLnJlbW92ZSgpO1xuICB9KTtcbiAgcmV0dXJuIHRoaXMuX19oaWRlRWxlbWVudCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAnJztcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG4gICAgX3RoaXMuX19lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIF90aGlzLl9fYnV0dG9uc0xpc3RlbmVyKTtcbiAgICBpZiAoX3RoaXMuaGFzaCAmJiBfdGhpcy5oYXNoID09IGxvY2F0aW9uLmhhc2gpIHtcbiAgICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBkb2N1bWVudC50aXRsZSwgbG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZSgvIy8sICcnKSk7XG4gICAgICAvLyB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2hhc2hjaGFuZ2UnKSk7XG4gICAgfVxuICAgIF90aGlzLl9fb3BlbmVkID0gZmFsc2U7XG4gICAgX3RoaXMuY2xvc2luZyA9IG51bGw7XG4gICAgX3RoaXMuX19hZnRlckNsb3NlQ2FsbGJhY2sgJiYgX3RoaXMuX19hZnRlckNsb3NlQ2FsbGJhY2soKTtcbiAgfSk7XG59O1xuXG5Nb2RhbC5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyAmJiB0aGlzLl9fcGFyc2VPcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gdGhpcy5fX29wZW5lZCA/IHRoaXMuY2xvc2UoKSA6IHRoaXMub3BlbigpO1xufTtcbk1vZGFsLm9wZW4gPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xuICBpZiAoIXdpbmRvdy5Nb2RhbENvdW50X19RYXNSZm13T1JrZGFzUnMpIHdpbmRvdy5Nb2RhbENvdW50X19RYXNSZm13T1JrZGFzUnMgPSAwO1xuXG4gIC8vYmdcbiAgdmFyIGJnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGJnLmNsYXNzTGlzdC5hZGQoJ21vZGFsLS1iZycpO1xuICBiZy5kYXRhc2V0Lm1vZGFsSWQgPSBlbGVtZW50LmlkO1xuICBiZy5zdHlsZS56SW5kZXggPSAnOTAwJyArIHdpbmRvdy5Nb2RhbENvdW50X19RYXNSZm13T1JrZGFzUnMrKztcblxuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICBiZy5jbGFzc0xpc3QuYWRkKCdtb2RhbC0tb3BlbicpO1xuICAgIH0pO1xuICB9KTtcbiAgYmcuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuXG4gICAgYmcuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtLW9wZW4nKTtcbiAgICBiZy5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgYmcucmVtb3ZlKCk7XG4gICAgfSk7XG4gIH0sIGZhbHNlKTtcbiAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWVuZCcsIGJnKTtcblxuICAvLyBlbFxuICBlbGVtZW50LnN0eWxlLnpJbmRleCA9ICc5OTknICsgd2luZG93Lk1vZGFsQ291bnRfX1Fhc1JmbXdPUmtkYXNScysrO1xuICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG5cbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsLTUwJSkgc2NhbGUoMSknO1xuICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgIH0pO1xuICB9KTtcbiAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgdmFyIGEgPSBmdW5jdGlvbiBhKGUpIHtcbiAgICAgIGVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9ICcnO1xuICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgYSk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBhLCBmYWxzZSk7XG4gIH0pLnRoZW4oZnVuY3Rpb24gKCkge30pO1xuXG4gIFtdLmZvckVhY2guY2FsbChlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tb2RhbF9fY2xvc2UnKSwgZnVuY3Rpb24gKGJ1dHRvbikge1xuICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJnLmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLS1vcGVuJyk7XG4gICAgICBiZy5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBiZy5yZW1vdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn07XG5Nb2RhbC5jbG9zZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XG5cbiAgdmFyIGJnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtbW9kYWwtaWQ9XCInICsgZWxlbWVudC5pZCArICdcIl0nKTtcbiAgYmcuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtLW9wZW4nKTtcbn07XG4vLyBNb2RhbC50b2dnbGUgPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKXtcblxuLy8gfVxuXG5Nb2RhbC5wcm90b3R5cGUuX19zZXRIZWlnaHQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICBpZiAoIXRoaXMuX19lbCkgcmV0dXJuO1xuICBsZXQgYm90dG9tID0gdGhpcy5fX2VsLnN0eWxlLmJvdHRvbTtcbiAgdGhpcy5fX2VsLnN0eWxlLmhlaWdodCA9ICcnO1xuICB0aGlzLl9fZWwuc3R5bGUuYm90dG9tID0gJyc7XG4gIGxldCBoZWlnaHQgPSB0aGlzLl9fZWwuc2Nyb2xsSGVpZ2h0O1xuXG4gIFtdLmZvckVhY2guY2FsbCggdGhpcy5fX2VsLmNoaWxkcmVuLCAoaXRlbSkgPT4ge1xuICAgIGhlaWdodCArPSBpdGVtLnNjcm9sbEhlaWdodCAtIGl0ZW0uY2xpZW50SGVpZ2h0O1xuICB9KTtcblxuICB0aGlzLl9fZWwuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgdGhpcy5fX2VsLnN0eWxlLmJvdHRvbSA9IGJvdHRvbTtcblxufVxuXG5Nb2RhbC5wcm90b3R5cGUuX19vYnNlcnZlciA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLl9fZWwpIHJldHVybjtcbiAgaWYgKHRoaXMuX29ic2VydmVyT2JqKSB7XG4gICAgdGhpcy5fb2JzZXJ2ZXJPYmouZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgdGhpcy5fb2JzZXJ2ZXJPYmogPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoIG11dGF0aW9ucyApID0+IHtcbiAgICBtdXRhdGlvbnMuZm9yRWFjaCgoaXRlbSxpbmRleCkgPT4ge1xuICAgICAgaWYgKGl0ZW0uYWRkZWROb2Rlcy5sZW5ndGggfHwgaXRlbS5yZW1vdmVkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX19zZXRIZWlnaHQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cblxuICB0aGlzLl9vYnNlcnZlck9iai5vYnNlcnZlKHRoaXMuX19lbCwge1xuICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICBzdWJ0cmVlOiB0cnVlXG4gIH0pXG59XG5cbk1vZGFsLnByb3RvdHlwZS5lbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgaWYgKCFlbGVtZW50KSByZXR1cm4gdGhpcy5fX2VsO1xuXG4gIGlmICh0eXBlb2YgZWxlbWVudCA9PSAnc3RyaW5nJykge1xuICAgIGlmICghdGhpcy5mb3JtYXRlZFF1ZXJ5KSB7XG5cbiAgICAgIGlmIChlbGVtZW50LmluZGV4T2YoJyMnKSAhPT0gMClcbiAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnN1YnN0cmluZyhlbGVtZW50LmluZGV4T2YoJyMnKSk7XG4gICAgICBpZiAoZWxlbWVudC5pbmRleE9mKCclJykpXG4gICAgICBlbGVtZW50ID0gZGVjb2RlVVJJQ29tcG9uZW50KGVsZW1lbnQpO1xuICAgICAgLy/QtdGB0LvQuCDQvdC1INGG0LjRhNGA0LAg0Lgg0L3QtSDQsdGD0LrQstCwXG4gICAgICAgIC8v0YPQtNCw0LvRj9C10Lwg0YDQtdGI0LXRgtC60YMg0LjQtyDRhdGN0YjQsFxuICAgICAgaWYgKGVsZW1lbnRbMV0udG9Mb3dlckNhc2UoKSA9PT0gZWxlbWVudFsxXS50b1VwcGVyQ2FzZSgpKVxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5zdWJzdHJpbmcoMSk7XG4gICAgICB0aGlzLmZvcm1hdGVkUXVlcnkgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9fZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICB9IGVsc2UgaWYgKCcnICsgZWxlbWVudCA9PSAnW29iamVjdCBIVE1MQ29sbGVjdGlvbl0nKSB7XG4gICAgdGhpcy5fX2VsID0gZWxlbWVudFswXTtcbiAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgdGhpcy5fX2VsID0gZWxlbWVudDtcbiAgfVxuICB0aGlzLl9fcXVlcnkgPSBlbGVtZW50O1xuICB0aGlzLl9fb2JzZXJ2ZXIoKTtcblxuICBpZiAoIWVsZW1lbnQpIHRocm93IG5ldyBFcnJvcihcItCd0LUg0LfQsNC00LDQvSDRjdC70LXQvNC10L3RgiB+IGVsZW1lbnQ6Jy5hc2QnIHx8IGVsZW1lbnQ6ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFzZCcpIH4gXCIsIHRoaXMuX19lbCk7XG59O1xuTW9kYWwucHJvdG90eXBlLl9fc2V0QmcgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX19iZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICB0aGlzLl9fYmcuY2xhc3NMaXN0LmFkZCgnbW9kYWwtLWJnJyk7XG4gIHRoaXMuX19iZy5zdHlsZS56SW5kZXggPSAnOTk5JyArIHdpbmRvdy5Nb2RhbENvdW50X19RYXNSZm13T1JrZGFzUnMrKztcblxuICBpZiAodGhpcy5fX2JnU3R5bGUpIHtcbiAgICBmb3IgKHZhciB2YXJpYWJsZSBpbiB0aGlzLl9fYmdTdHlsZSkge1xuICAgICAgdGhpcy5fX2JnLnN0eWxlW3ZhcmlhYmxlXSA9IHRoaXMuX19iZ1N0eWxlW3ZhcmlhYmxlXTtcbiAgICB9XG4gIH1cblxuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLl9fYmcuY2xhc3NMaXN0LmFkZCgnbW9kYWwtLW9wZW4nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhpcy5fX2JnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICBfdGhpcy5jbG9zZS5jYWxsKF90aGlzKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLl9fQkdjbG9zZUNhbGxiYWNrICYmIF90aGlzLl9fQkdjbG9zZUNhbGxiYWNrKCk7XG4gICAgfSwgZnVuY3Rpb24gKCkge30pO1xuICB9LCBmYWxzZSk7XG5cbiAgdGhpcy5fX2VsLmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCB0aGlzLl9fYmcpO1xufTtcbk1vZGFsLnByb3RvdHlwZS5fX3Nob3dFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHRoaXMuX19lbC5zdHlsZS56SW5kZXggPSAnOTk5JyArIHdpbmRvdy5Nb2RhbENvdW50X19RYXNSZm13T1JrZGFzUnMrKztcbiAgdGhpcy5fX2VsLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gIHRoaXMuX19zZXRIZWlnaHQoKTtcbiAgdGhpcy5fX2VsLnN0eWxlLnRvcCA9ICcwJztcbiAgdGhpcy5fX2VsLnN0eWxlLmJvdHRvbSA9ICcwJztcbiAgdGhpcy5fX2VsLnN0eWxlLnRyYW5zaXRpb24gPSAnYm90dG9tIC4zcyBlYXNlLG9wYWNpdHkgLjNzIGVhc2UsdHJhbnNmb3JtIC4zcyBlYXNlJztcblxuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5fX2VsLnN0eWxlLmJvdHRvbSA9ICczJSc7XG4gICAgICBfdGhpcy5fX2VsLnN0eWxlLnRyYW5zZm9ybSA9ICdzY2FsZSgxKSc7XG4gICAgICBfdGhpcy5fX2VsLnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICB2YXIgYSA9IGZ1bmN0aW9uIGEoZSkge1xuICAgICAgX3RoaXMuX19lbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgYSk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfTtcbiAgICBfdGhpcy5fX2VsLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBhLCBmYWxzZSk7XG4gIH0pO1xufTtcbk1vZGFsLnByb3RvdHlwZS5fX2hpZGVFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHRoaXMuX19lbC5zdHlsZS50cmFuc2Zvcm0gPSAnJztcbiAgdGhpcy5fX2VsLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gIF90aGlzLl9fZWwuc3R5bGUuYm90dG9tID0gJzAnO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gaGlkZShlKSB7XG5cbiAgICAgIHJlc29sdmUoKTtcbiAgICAgIF90aGlzLl9fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGhpZGUpO1xuICAgICAgX3RoaXMuX19lbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICBfdGhpcy5fX2VsLnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgIF90aGlzLl9fZWwuc3R5bGUudHJhbnNpdGlvbiA9ICcnO1xuICAgIH1cbiAgICBfdGhpcy5fX2VsLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBoaWRlLCBmYWxzZSk7XG4gIH0pO1xufTtcblxuTW9kYWwucHJvdG90eXBlLl9fcGFyc2VPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblxuICBpZiAob3B0aW9ucy50YWdOYW1lIHx8IHR5cGVvZiBvcHRpb25zID09ICdzdHJpbmcnKSB7XG4gICAgdGhpcy5lbGVtZW50KG9wdGlvbnMpO1xuICAgIHJldHVybjtcbiAgfTtcbiAgb3B0aW9ucy5lbGVtZW50ICYmIHRoaXMuZWxlbWVudChvcHRpb25zLmVsZW1lbnQpO1xuXG4gIGlmIChvcHRpb25zLm9wZW4gIT09IHVuZGVmaW5lZCkgdGhpcy5fX29wZW5DYWxsYmFjayA9IG9wdGlvbnMub3BlbjtcblxuICBpZiAob3B0aW9ucy5jbG9zZSAhPT0gdW5kZWZpbmVkKSB0aGlzLl9fY2xvc2VDYWxsYmFjayA9IG9wdGlvbnMuY2xvc2U7XG5cbiAgaWYgKG9wdGlvbnMuQkdjbG9zZSAhPT0gdW5kZWZpbmVkKSB0aGlzLl9fQkdjbG9zZUNhbGxiYWNrID0gb3B0aW9ucy5CR2Nsb3NlO1xuXG4gIGlmIChvcHRpb25zLmFmdGVyT3BlbiAhPT0gdW5kZWZpbmVkKSB0aGlzLl9fYWZ0ZXJPcGVuQ2FsbGJhY2sgPSBvcHRpb25zLmFmdGVyT3BlbjtcblxuICBpZiAob3B0aW9ucy5hZnRlckNsb3NlICE9PSB1bmRlZmluZWQpIHRoaXMuX19hZnRlckNsb3NlQ2FsbGJhY2sgPSBvcHRpb25zLmFmdGVyQ2xvc2U7XG5cbiAgaWYgKG9wdGlvbnMuaGFzaCAhPT0gdW5kZWZpbmVkKSB7XG5cbiAgICBpZiAob3B0aW9ucy5oYXNoID09PSB0cnVlKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX19xdWVyeSA9PSAnc3RyaW5nJyAmJiAvIy8udGVzdCh0aGlzLl9fcXVlcnkpKSB7XG5cbiAgICAgICAgaWYgKCt0aGlzLl9fcXVlcnlbMV0gIT09ICt0aGlzLl9fcXVlcnlbMV0gfHwgdGhpcy5fX3F1ZXJ5WzFdLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMuX19xdWVyeVsxXS50b1VwcGVyQ2FzZSgpKVxuICAgICAgICAgIC8v0YPQtNCw0LvRj9C10Lwg0YDQtdGI0LXRgtC60YMg0LjQtyDRhdGN0YjQsFxuICAgICAgICAgIHRoaXMuaGFzaCA9IHRoaXMuX19xdWVyeS5zdWJzdHJpbmcodGhpcy5fX3F1ZXJ5LmluZGV4T2YoJyMnKSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aGlzLmhhc2ggPSB0aGlzLl9fcXVlcnk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgrb3B0aW9ucy5oYXNoWzFdICE9PSArb3B0aW9ucy5oYXNoWzFdIHx8IG9wdGlvbnMuaGFzaFsxXS50b0xvd2VyQ2FzZSgpICE9PSBvcHRpb25zLmhhc2hbMV0udG9VcHBlckNhc2UoKSlcbiAgICAgICAgLy/Rg9C00LDQu9GP0LXQvCDRgNC10YjQtdGC0LrRgyDQuNC3INGF0Y3RiNCwXG4gICAgICAgIHRoaXMuaGFzaCA9IG9wdGlvbnMuaGFzaC5zdWJzdHJpbmcob3B0aW9ucy5oYXNoLmluZGV4T2YoJyMnKSk7XG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMuaGFzaCA9IG9wdGlvbnMuaGFzaDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9faGFzaExpc3RlbmVyQmluZGVkKSB7XG4gICAgICB0aGlzLl9faGFzaExpc3RlbmVyQmluZGVkID0gdGhpcy5fX2hhc2hMaXN0ZW5lci5iaW5kKHRoaXMpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJoYXNoY2hhbmdlXCIsIHRoaXMuX19oYXNoTGlzdGVuZXJCaW5kZWQpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLm1vZGFsU3R5bGUpIHRoaXMuX19tb2RhbFN0eWxlID0gb3B0aW9ucy5tb2RhbFN0eWxlO1xuXG4gIGlmIChvcHRpb25zLmJnU3R5bGUpIHRoaXMuX19iZ1N0eWxlID0gb3B0aW9ucy5iZ1N0eWxlO1xuXG4gIGlmIChvcHRpb25zLmRpbmFtaWMgIT09IHVuZGVmaW5lZCkgdGhpcy5fX2RpbmFtaWMgPSBvcHRpb25zLmRpbmFtaWM7XG59O1xuXG5Nb2RhbC5wcm90b3R5cGUuX19oYXNoTGlzdGVuZXIgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXG4gIGlmICh0aGlzLmhhc2ggPT0gbG9jYXRpb24uaGFzaCAmJiAhdGhpcy5fX29wZW5lZCkge1xuICAgIHRoaXMub3BlbigpO1xuICB9IGVsc2UgaWYgKHRoaXMuaGFzaCAhPSBsb2NhdGlvbi5oYXNoICYmIHRoaXMuX19vcGVuZWQpIHtcbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cbn07XG5cbk1vZGFsLnByb3RvdHlwZS5fX3N0eWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgd2luZG93LkFmbUpkbkpSRVFqb3NfX21vZGFsU3R5bGVzID0gdHJ1ZTtcbiAgdmFyIHN0eWxlcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gIHN0eWxlcy5pbm5lckhUTUwgPSBgXG4gIC5tb2RhbC0tYmcge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB3aWxsLWNoYW5nZTogb3BhY2l0eTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwuOSk7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2l0aW9uOiBhbGwgLjJzIGVhc2UgLjFzO1xuICB9XG5cbiAgQHN1cHBvcnRzICgtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cigyMHB4KSkgb3IgKGJhY2tkcm9wLWZpbHRlcjogYmx1cigyMHB4KSkge1xuICAgIC5tb2RhbC0tYmcge1xuICAgICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoMjBweCk7XG4gICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMjBweCk7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LC4wKTtcbiAgICB9XG4gIH1cbiAgLm1vZGFsLS1iZy5tb2RhbC0tb3BlbiB7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0b3A6MDtcbiAgICB0cmFuc2l0aW9uOiBhbGwgLjNzIGVhc2UgLjFzO1xuICB9XG4gIC5tb2RhbCB7XG4gICAgY29sb3I6IzMzMztcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB0b3A6IDUlO1xuICAgIGxlZnQ6IDAlO1xuICAgIHJpZ2h0OiAwJTtcbiAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCB0b3AsIG9wYWNpdHk7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHdpZHRoOiA1NSU7XG4gICAgbWluLWhlaWdodDogMTc3cHg7XG4gICAgbWF4LXdpZHRoOiAxMDAwcHg7XG4gICAgbWF4LWhlaWdodDogOTAlO1xuICAgIGhlaWdodDphdXRvO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSguOSwgMSk7XG4gICAgbWFyZ2luOiBhdXRvO1xuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94IDtcbiAgICBib3gtc2hhZG93OiAwIDEwcHggMzJweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICAgIGJveC1zaGFkb3c6IDAgMTZweCAyOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjIyKSwgMCAyNXB4IDU1cHggMCByZ2JhKDAsIDAsIDAsIDAuMjEpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZmxleC1kaXJlY3Rpb246Y29sdW1uO1xuICB9XG4gIC5tb2RhbF9fY29udGVudCB7XG4gICAgbWluLWhlaWdodDogMTIwcHg7XG4gICAgbWF4LWhlaWdodDo0MDBweDtcbiAgICBtYXgtaGVpZ2h0OiA5MHZoO1xuICAgIG1hcmdpbjogMDtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIHBhZGRpbmc6IDMwcHg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBvcmRlcjoxO1xuICB9XG4gIC5tb2RhbF9fZm9vdGVyIHtcbiAgICBvcmRlcjoyO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWFyZ2luOiAwIDEwcHg7XG4gICAgcGFkZGluZzowIDZweDtcbiAgICBoZWlnaHQ6IDU2cHg7XG4gICAgbWluLWhlaWdodDogNTZweDtcbiAgICBtYXJnaW4tdG9wOi01NnB4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTBlMGUwO1xuICB9XG4gIC5tb2RhbF9fZm9vdGVyIC5idG4ge1xuICAgIGZvbnQtc2l6ZTogLjg1cmVtO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgfVxuICAubW9kYWxfX2Zvb3RlciB+IC5tb2RhbF9fY29udGVudCB7XG4gICAgbWF4LWhlaWdodDogY2FsYyg5MHZoIC0gNTZweCk7XG4gICAgbWFyZ2luLWJvdHRvbTogNTZweDtcbiAgfVxuXG4gIEBtZWRpYSAobWF4LXdpZHRoOjEwMDBweCkge1xuICAgIC5tb2RhbCB7XG4gICAgICB3aWR0aDogNjUlO1xuICAgICAgbWF4LXdpZHRoOiAxMDAwcHg7XG4gICAgfVxuICB9XG4gIEBtZWRpYSAobWF4LXdpZHRoOjgwMHB4KSB7XG4gICAgLm1vZGFsIHtcbiAgICAgIHdpZHRoOiA2NSU7XG4gICAgICBtYXgtd2lkdGg6IDEwMDBweDtcbiAgICB9XG4gIH1cbiAgQG1lZGlhIChtYXgtd2lkdGg6NjAwcHgpIHtcbiAgICAubW9kYWwge1xuICAgICAgd2lkdGg6IDc1JTtcbiAgICAgIG1heC13aWR0aDogMTAwMHB4O1xuICAgIH1cbiAgfVxuICBAbWVkaWEgKG1heC13aWR0aDo0ODBweCkge1xuICAgIC5tb2RhbCB7XG4gICAgICB3aWR0aDogODUlO1xuICAgICAgbWF4LXdpZHRoOiAxMDAwcHg7XG4gICAgfVxuICB9XG4gIEBtZWRpYSAobWF4LXdpZHRoOjM2MHB4KSB7XG4gICAgLm1vZGFsIHtcbiAgICAgIHdpZHRoOiA5NSU7XG4gICAgfVxuICB9XG4gIGA7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kKHN0eWxlcyk7XG59O1xuXG5Nb2RhbC5wcm90b3R5cGUuX19yZXNpemVzID0gZnVuY3Rpb24oKXtcbiAgdGhpcy5fcmVzaXplRm4gJiYgcmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fcmVzaXplRm4pXG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIHRoaXMuX3Jlc2l6ZUZuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICBfdGhpcy5fX3NldEhlaWdodCgpO1xuICAgIGlmIChfdGhpcy5fX29wZW5lZCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS53aWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCAtICh0aGlzLl9fc2Nyb2xsYmFyU2l6ZSB8fCAxNSkgKyAncHgnO1xuICAgIH1cbiAgfTtcblxuICBhZGRFdmVudExpc3RlbmVyKCAncmVzaXplJywgdGhpcy5fcmVzaXplRm4pO1xufVxuXG47K2Z1bmN0aW9uICgpIHtcbiAgYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHtcblxuICAgIHZhciBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tb2RhbF9fdHJpZ2dlcicpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhyZWYgPSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBlbGVtZW50OiBocmVmLFxuICAgICAgICBoYXNoOiBocmVmXG4gICAgICB9O1xuICAgICAgaWYgKGVsZW1lbnRzW2ldLmNsYXNzTGlzdC5jb250YWlucygnbW9kYWxfX2RpbmFtaWMnKSkgb3B0aW9ucy5kaW5hbWljID0gdHJ1ZTtcbiAgICAgIG5ldyBNb2RhbChvcHRpb25zKTtcbiAgICB9XG4gIH0pO1xufSgpO1xuIiwiaW1wb3J0IFN3aXBlciBmcm9tICdzd2lwZXIvZGlzdC9qcy9zd2lwZXIuanMnO1xuaW1wb3J0IE1vZGFsIGZyb20gJ3BvcHVwLXdpbmRvdy1tb2R1bGUnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIHtcblx0Y29uc3RydWN0b3IoY2FyZCwgdGFyZ2V0KSB7XG5cblx0XHR0aGlzLmxvZ2ljKGNhcmQsIHRhcmdldCk7XG5cdH1cblxuXHRnZW5lcmF0ZU1vZGFsSFRNTCgpIHtcblx0XHRsZXQgTW9kYWxFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdE1vZGFsRWwuY2xhc3NOYW1lID0gJ2ZvclBob3RvJztcblx0XHRNb2RhbEVsLmlkID0gJ2ZvclBob3RvJztcblx0XHRNb2RhbEVsLmlubmVySFRNTCA9IGBcblx0XHRcdDxkaXYgY2xhc3M9XCJmb3JQaG90b19fY29udGVudFwiPlxuXG5cdFx0XHQ8L2Rpdj5cblx0XHRgO1xuXHRcdHRoaXMuY29udGVudCA9IE1vZGFsRWwucXVlcnlTZWxlY3RvcignLmZvclBob3RvX19jb250ZW50Jyk7XG5cdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChNb2RhbEVsKTtcblxuXHRcdHJldHVybiBNb2RhbEVsO1xuXHR9XG5cblx0YXN5bmMgbG9naWMoY2FyZCwgdGFyZ2V0KSB7XG5cblx0XHRsZXQgZWwgPSB0YXJnZXQuY2xvc2VzdCgnLm5ld3NDYXJkX19pbWFnZScpIHx8IHRhcmdldC5jbG9zZXN0KCcubmV3c0NhcmRfX2hlYWQnKSB8fCB0YXJnZXQuY2xvc2VzdCgnLmp1c3RpZmllZEdhbGxlcnknKTtcblx0XHQvL1xuXHRcdGlmICggIWVsICkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgaW5pdGlhbFNsaWRlID0gdGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLXNsaWRlXScpLmRhdGFzZXQuc2xpZGUgfHwgMFxuXHRcdGNvbnNvbGUubG9nKGluaXRpYWxTbGlkZSk7XG5cdFx0dGhpcy5lbCA9IHRoaXMuZ2VuZXJhdGVNb2RhbEhUTUwoKTtcblxuXHRcdGxldCBkYXRhID0gYXdhaXQgZmV0Y2goZWwuZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuXG5cdFx0ZGF0YSA9IGF3YWl0IGRhdGEuanNvbigpO1xuXG5cdFx0dGhpcy5lbC5pbm5lckhUTUwgPSBgXG5cdFx0PGRpdiBjbGFzcz1cInN3aXBlci1jb250YWluZXIgZ2FsbGVyeS10b3BcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJzd2lwZXItd3JhcHBlclwiPlxuXHRcdFx0XHQke2RhdGEubWFwKCBpdGVtID0+IGBcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzd2lwZXItc2xpZGVcIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvclBob3RvX19zbGlkZVwiPlxuXHRcdFx0XHRcdFx0XHRcdDxpbWcgc3JjPVwiJHtpdGVtLmltYWdlLnRodW1ifVwiIGFsdD1cItCS0LXRgNGC0LjQutCw0LvRjNC90L7QtSDQv9C+0YDRgtC80L7QvdC1XCIgLz5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdGAgKS5qb2luKCcnKX1cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJzd2lwZXItY29udGFpbmVyIGdhbGxlcnktYm90dG9tXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiZm9yUGhvdG9fX2Nsb3NlXCI+PC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwic3dpcGVyLXdyYXBwZXJcIj5cblx0XHRcdFx0JHtkYXRhLm1hcCggaXRlbSA9PiBgXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic3dpcGVyLXNsaWRlXCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JQaG90b19fc2xpZGVcIj5cblx0XHRcdFx0XHRcdFx0XHQ8aW1nIHNyYz1cIiR7aXRlbS5pbWFnZS5ub3JtYWx9XCIgYWx0PVwi0JLQtdGA0YLQuNC60LDQu9GM0L3QvtC1INC/0L7RgNGC0LzQvtC90LVcIiAvPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JQaG90b19fY29udGVudFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInNlY3Rpb25OYW1lXCI+JHtpdGVtLnRpdGxlfTwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIlwiPiR7aXRlbS5hbGJ1bX08L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJcIj4ke2l0ZW0uZGVzY3JpcHRpb259PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0YCApLmpvaW4oJycpfVxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdFx0YDtcblxuXHRcdHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmZvclBob3RvX19jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGV2ZW50ID0+IHtcblx0XHRcdHRoaXMuZGVzdHJveSgpO1xuXHRcdH0pOztcblxuXHRcdHZhciBnYWxsZXJ5VG9wID0gbmV3IFN3aXBlcignLmdhbGxlcnktdG9wJywge1xuXHRcdFx0c3BhY2VCZXR3ZWVuOiAxMCxcblx0XHRcdGluaXRpYWxTbGlkZSxcblx0XHRcdGNlbnRlcmVkU2xpZGVzOiB0cnVlLFxuXHRcdFx0c2xpZGVzUGVyVmlldzogJ2F1dG8nLFxuXHRcdFx0dG91Y2hSYXRpbzogLjIsXG5cdFx0XHRzbGlkZVRvQ2xpY2tlZFNsaWRlOiB0cnVlLFxuXHRcdH0pO1xuXG5cdFx0dmFyIGdhbGxlcnlUaHVtYnMgPSBuZXcgU3dpcGVyKCcuZ2FsbGVyeS1ib3R0b20nLCB7XG5cdFx0XHRzcGFjZUJldHdlZW46IDEwLFxuXHRcdFx0aW5pdGlhbFNsaWRlLFxuXHRcdFx0bmF2aWdhdGlvbjoge1xuXHRcdFx0XHRuZXh0RWw6ICcuc3dpcGVyLWJ1dHRvbi1uZXh0Jyxcblx0XHRcdFx0cHJldkVsOiAnLnN3aXBlci1idXR0b24tcHJldicsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5hdGlvbjoge1xuXHRcdFx0XHRlbDogJy5zd2lwZXItcGFnaW5hdGlvbidcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGdhbGxlcnlUb3AuY29udHJvbGxlci5jb250cm9sID0gZ2FsbGVyeVRodW1icztcblx0XHRnYWxsZXJ5VGh1bWJzLmNvbnRyb2xsZXIuY29udHJvbCA9IGdhbGxlcnlUb3A7XG5cdH1cblxuXHRkZXN0cm95KCkge1xuXHRcdHRoaXMuZWwucmVtb3ZlKCk7XG5cblx0XHR0aGlzLmVsID0gbnVsbDtcblx0fVxufVxuXG5cbi8vIHtcbi8vIFx0dGl0bGU6ICfQndCw0LfQstCw0L3QuNC1Jyxcbi8vIFx0ZGVzY3JpcHRpb246ICfQntC/0LjRgdCw0L3QuNC1Jyxcbi8vIFx0YWxidW06ICfQndCw0LfQstCw0L3QuNC1INCw0LvRjNCx0L7QvNCwJyxcbi8vIFx0aW1hZ2U6IHtcbi8vIFx0XHR3aWR0aDogJzQwMDAnLFxuLy8gXHRcdGhlaWdodDogJzMwMDAnLFxuLy8gXHRcdHRodW1iOiAnL2FkZmFmYS5qcGcnLFxuLy8gXHRcdG5vcm1hbDogJy96ZGZhZ2FnJyxcbi8vIFx0XHRvcmlnaW5hbDogJy9mZGZhZGZhJyxcbi8vIFx0XHRleHRlbnNpb246ICdqcGcnLFxuLy8gXHRcdG9yaWdpbmFsTmFtZTogJ9Cc0L7QttC90L4g0LXRidGRINC/0LXRgNC10LTQsNGC0Ywg0L7RgNC40LPQuNC90LDQu9GM0L3QvtC1INC90LDQt9Cy0LDQvdC40LUg0YTQsNC50LvQsCwg0L3QtdC30L3QsNGOINC30LDRh9C10LwnXG4vLyBcdH1cbi8vIH1cbiIsImltcG9ydCBBbmltYXRpb24gZnJvbSAnLi4vLi4vLi4vbGF5b3V0L2pzL2FuaW1hdGlvbi5qcyc7XG5pbXBvcnQgQ2xpY2sgZnJvbSAnLi4vLi4vLi4vbGF5b3V0L2pzL2NsaWNrLmpzJztcbmltcG9ydCBDdXN0b21MaXN0ZW5lciBmcm9tICcuLi8uLi8uLi9sYXlvdXQvanMvY3VzdG9tTGlzdGVuZXIuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYWxsIGV4dGVuZHMgQW5pbWF0aW9uIHtcblx0Y29uc3RydWN0b3IoKXtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5fX2JhbGxzID0ge307XG5cblx0XHRsZXQgYSA9IFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jbGljay1iYWxsXScpXTtcblxuXHRcdGEuZm9yRWFjaCggaXRlbSA9PiB0aGlzLmluaXRCYWxsKGl0ZW0pICk7XG4gIH1cblxuXHRpbml0QmFsbCggaXRlbSwgc2Nyb2xsVG9Ub3AgPSB0cnVlICkge1xuXHRcdGNvbnN0IE5hbWUgPSBpdGVtLmRhdGFzZXQuY2xpY2tCYWxsO1xuXHRcdGxldCBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1iYWxsLWNsaWNrPVwiJHtOYW1lfVwiXWApO1xuXHRcdGxldCBiZyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdkaXYnKTtcblxuXHRcdGxldCBmbiA9IChldmVudCkgPT4ge1xuXG5cdFx0XHRpZiAoZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5uZXdzQ2FyZF9fdGFnJykpIHtcblx0XHRcdFx0cmV0dXJuXG5cdFx0XHR9XG5cblx0XHRcdGxldCB3aW5kb3dXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcblx0XHRcdGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggKyAncHgnO1xuXHRcdFx0ZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuXHRcdFx0bGV0IHNjcm9sbEJhciA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCAtIHdpbmRvd1dpZHRoO1xuXHRcdFx0dGhpcy5yZXNpemVMaXN0ZW5lciA9IG5ldyBDdXN0b21MaXN0ZW5lcih7XG5cdFx0XHRcdGxpc3RlbmVyOiAncmVzaXplJyxcblx0XHRcdFx0Y2FsbGJhY2s6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLndpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoIC0gc2Nyb2xsQmFyICsgJ3B4Jztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRsZXQge3gsIHl9ID0gZXZlbnQ7XG5cdFx0XHRsZXQgc2Nyb2xsID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuXG5cdFx0XHR0aGlzLl9fYmFsbHNbTmFtZV0gPSB7XG5cdFx0XHRcdGNvbnRhaW5lcixcblx0XHRcdFx0YmcsXG5cdFx0XHRcdGNsb3NlOmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS1iYWxsLWNsb3NlXScpLFxuXHRcdFx0XHRzY3JvbGwsXG5cdFx0XHRcdHgsXG5cdFx0XHRcdHlcblx0XHRcdH07XG5cblx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSggKCkgPT4ge1xuXHRcdFx0XHRjb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0XHRcdGNvbnRhaW5lci5zdHlsZS50b3AgPSB5ICsgJ3B4Jztcblx0XHRcdFx0Y29udGFpbmVyLnN0eWxlLmxlZnQgPSB4ICsgJ3B4Jztcblx0XHRcdFx0Ymcuc3R5bGUubGVmdCA9IC14ICsgJ3B4Jztcblx0XHRcdFx0Ymcuc3R5bGUudG9wID0gLXkgKyAncHgnO1xuXG5cdFx0XHRcdGlmICggc2Nyb2xsVG9Ub3AgKSB7XG5cdFx0XHRcdFx0d2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdzY3JvbGxUb1RvcCcpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMub3BlbkNvbnRhaW5lciggTmFtZSApO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLnZpZGVvU2V0dGluZ3MoIE5hbWUgKTtcblxuXHRcdH07XG5cblx0XHRpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZm4pO1xuXG5cdFx0cmV0dXJuIGZuO1xuXHR9XG5cblx0b3BlbkNvbnRhaW5lcihOYW1lKXtcblxuXHRcdGNvbnN0IHtjb250YWluZXIsIHgsIHksIGJnLCBzY3JvbGwsIGNsb3NlfSA9IHRoaXMuX19iYWxsc1tOYW1lXTtcblxuXHRcdGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuXHRcdGNvbnN0IHsgY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodCB9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0Y29uc3QgU2l6ZSA9IE1hdGguc3FydChjbGllbnRXaWR0aCAqKiAyICsgY2xpZW50SGVpZ2h0ICoqIDIpICogMjtcblxuXHRcdGNvbnN0IGFuaW1hdGUgPSAoKSA9PiB7XG5cblx0XHRcdGNvbnN0IHByb2dyZXNzID0gdGhpcy5fX3Byb2dyZXNzKHN0YXJ0LDEwMDApO1xuXHRcdFx0Y29uc3QgcHJvZ3Jlc3NTaXplID0gU2l6ZSAqIHByb2dyZXNzO1xuXG5cdFx0XHRjb250YWluZXIuc3R5bGUud2lkdGggPSBwcm9ncmVzc1NpemUgKyAncHgnO1xuXHRcdFx0Y29udGFpbmVyLnN0eWxlLmhlaWdodCA9IHByb2dyZXNzU2l6ZSArICdweCc7XG5cblx0XHRcdGxldCB0b3AgPSB5ICsgKChjbGllbnRIZWlnaHQvMiAtIHkpIC0gU2l6ZS8yKSAqIHByb2dyZXNzO1xuXHRcdFx0bGV0IGxlZnQgPSB4ICsgKChjbGllbnRXaWR0aC8yIC0geCkgLSBTaXplLzIpICogcHJvZ3Jlc3M7XG5cblx0XHRcdGNvbnRhaW5lci5zdHlsZS50b3AgPSB0b3AgKyAncHgnO1xuXHRcdFx0Y29udGFpbmVyLnN0eWxlLmxlZnQgPSBsZWZ0ICsgJ3B4Jztcblx0XHRcdGJnLnN0eWxlLnRvcCA9IC10b3AgKyAncHgnO1xuXHRcdFx0Ymcuc3R5bGUubGVmdCA9IC1sZWZ0ICsgJ3B4JztcblxuXHRcdFx0aWYgKHByb2dyZXNzID09PSAxKSB7XG5cdFx0XHRcdGNvbnN0IGNsb3NlQ2xpY2tMaXN0ZW5lciA9IG5ldyBDbGljayh7XG5cdFx0XHRcdFx0ZWxlbWVudDogY2xvc2UsXG5cdFx0XHRcdFx0Y2FsbGJhY2s6ICgpPT57XG5cdFx0XHRcdFx0XHR0aGlzLmNsb3NlQ29udGFpbmVyKE5hbWUpO1xuXHRcdFx0XHRcdFx0Y2xvc2VDbGlja0xpc3RlbmVyLmVuZCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcblx0XHR9O1xuXHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcblx0fVxuXG5cdGNsb3NlQ29udGFpbmVyKE5hbWUpe1xuXHRcdGNvbnN0IG5ld1Njcm9sbCA9IHdpbmRvdy5wYWdlWU9mZnNldDtcblx0XHRjb25zdCB7Y29udGFpbmVyLCBzY3JvbGwsIGNsb3NlLCBiZywgdmlkZW99ID0gdGhpcy5fX2JhbGxzW05hbWVdO1xuXHRcdGlmICh2aWRlbykge1xuXHRcdFx0dmlkZW8ucGF1c2UoKTtcblx0XHRcdHRoaXMudmlkZW9MaXN0ZW5lcnMuZm9yRWFjaCggaXRlbSA9PiB7XG5cdFx0XHRcdGl0ZW0uZW5kKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0bGV0IHt4LCB5fSA9IHRoaXMuX19iYWxsc1tOYW1lXTtcblxuXHRcdHkgPSBzY3JvbGwgKyB5IC0gbmV3U2Nyb2xsO1xuXG5cdFx0Y29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuXG5cdFx0Y29uc3QgeyBjbGllbnRXaWR0aCwgY2xpZW50SGVpZ2h0IH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHRjb25zdCBTaXplID0gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpLndpZHRoKTtcblxuXHRcdGNvbnN0IGFuaW1hdGUgPSAoKSA9PiB7XG5cblx0XHRcdGNvbnN0IHByb2dyZXNzID0gMSAtIHRoaXMuX19wcm9ncmVzcyhzdGFydCw1MDApO1xuXHRcdFx0Y29uc3QgcHJvZ3Jlc3NTaXplID0gU2l6ZSAqIHByb2dyZXNzO1xuXG5cdFx0XHRjb250YWluZXIuc3R5bGUud2lkdGggPSBwcm9ncmVzc1NpemUgKyAncHgnO1xuXHRcdFx0Y29udGFpbmVyLnN0eWxlLmhlaWdodCA9IHByb2dyZXNzU2l6ZSArICdweCc7XG5cdFx0XHRsZXQgdG9wID0geSArICgoY2xpZW50SGVpZ2h0LzIgLSB5KSAtIFNpemUvMikgKiBwcm9ncmVzcztcblx0XHRcdGxldCBsZWZ0ID0geCArICgoY2xpZW50V2lkdGgvMiAtIHgpIC0gU2l6ZS8yKSAqIHByb2dyZXNzO1xuXHRcdFx0Y29udGFpbmVyLnN0eWxlLnRvcCA9IHRvcCArICdweCc7XG5cdFx0XHRjb250YWluZXIuc3R5bGUubGVmdCA9IGxlZnQgKyAncHgnO1xuXG5cdFx0XHRiZy5zdHlsZS50b3AgPSAtdG9wICsgJ3B4Jztcblx0XHRcdGJnLnN0eWxlLmxlZnQgPSAtbGVmdCArICdweCc7XG5cblx0XHRcdGlmIChwcm9ncmVzcyA9PT0gMCkge1xuXHRcdFx0XHRkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJyc7XG5cdFx0XHRcdGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAnJztcblx0XHRcdFx0dGhpcy5yZXNpemVMaXN0ZW5lci5lbmQoKTtcblx0XHRcdFx0Y29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cblx0XHRcdFx0aWYgKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdpZnJhbWUnKSkge1xuXHRcdFx0XHRcdGxldCBpZnJhbWUgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJylcblx0XHRcdFx0XHRsZXQgbmV4dEVsID0gaWZyYW1lLm5leHRFbGVtZW50U2libGluZ1xuXHRcdFx0XHRcdGlmcmFtZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSghaWZyYW1lLnJlbW92ZSgpICYmIGlmcmFtZSxuZXh0RWwpXG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XG5cdFx0fTtcblx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XG5cdH1cblxuXHR2aWRlb1NldHRpbmdzKE5hbWUpe1xuXHRcdHRoaXMudmlkZW9MaXN0ZW5lcnMgPSBbXTtcblx0XHRjb25zdCBjb250ZW50ID0gdGhpcy5fX2JhbGxzW05hbWVdLmJnO1xuXG5cdFx0Y29uc3QgdmlkZW8gPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlbycpO1xuXHRcdGlmICghdmlkZW8pIHJldHVybjtcblxuXHRcdHRoaXMuX19iYWxsc1tOYW1lXS52aWRlbyA9IHZpZGVvO1xuXHRcdGNvbnN0IHByb2dyZXNzID0gY29udGVudC5xdWVyeVNlbGVjdG9yKCcudmlkZW9fX3Byb2dyZXNzLWFjdHVhbCcpO1xuXHRcdGNvbnN0IHN0b3BCdXR0b24gPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoJy52aWRlb19fc3RvcCcpO1xuXG5cblx0XHR2aWRlby5wbGF5KClcblx0XHRcdC50aGVuKCgpPT57XG5cblx0XHRcdFx0ZnVuY3Rpb24gdG9nZ2xlUGxheSgpIHtcblx0XHRcdFx0XHRpZiAoc3RhdHVzID09ICdwbGF5ZWQnKSB7XG5cdFx0XHRcdFx0XHR2aWRlby5wYXVzZSgpO1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gJ3N0b3BwZWQnO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoc3RhdHVzID09ICdzdG9wcGVkJykge1xuXHRcdFx0XHRcdFx0dmlkZW8ucGxheSgpO1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gJ3BsYXllZCc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy52aWRlb0xpc3RlbmVycy5wdXNoKFxuXHRcdFx0XHRcdG5ldyBDbGljayh7XG5cdFx0XHRcdFx0XHRlbGVtZW50OiBzdG9wQnV0dG9uLFxuXHRcdFx0XHRcdFx0Y2FsbGJhY2soKXtcblx0XHRcdFx0XHRcdFx0dG9nZ2xlUGxheSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdClcblxuXHRcdFx0XHR0aGlzLnZpZGVvTGlzdGVuZXJzLnB1c2goXG5cdFx0XHRcdFx0bmV3IENsaWNrKHtcblx0XHRcdFx0XHRcdGVsZW1lbnQ6IHZpZGVvLFxuXHRcdFx0XHRcdFx0Y2FsbGJhY2soKXtcblx0XHRcdFx0XHRcdFx0dG9nZ2xlUGxheSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdClcblx0XHRcdFx0dGhpcy52aWRlb0xpc3RlbmVycy5wdXNoKFxuXHRcdFx0XHRcdG5ldyBDdXN0b21MaXN0ZW5lcih7XG5cdFx0XHRcdFx0XHRlbGVtZW50OiB2aWRlbyxcblx0XHRcdFx0XHRcdGxpc3RlbmVyOiAndGltZXVwZGF0ZScsXG5cdFx0XHRcdFx0XHRjYWxsYmFjazogdGhpcy52aWRlb1NldFByb2dyZXNzKHZpZGVvKVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdClcblxuXHRcdFx0XHRsZXQgc3RhdHVzID0gJ3BsYXllZCc7XG5cblx0XHRcdFx0dGhpcy52aWRlb0xpc3RlbmVycy5wdXNoKFxuXHRcdFx0XHRcdG5ldyBDdXN0b21MaXN0ZW5lcih7XG5cdFx0XHRcdFx0XHRlbGVtZW50OiB2aWRlbyxcblx0XHRcdFx0XHRcdGxpc3RlbmVyOiAncGxheScsXG5cdFx0XHRcdFx0XHRjYWxsYmFjaygpe1xuXHRcdFx0XHRcdFx0XHRzdGF0dXMgPSAncGxheWVkJztcblx0XHRcdFx0XHRcdFx0c3RvcEJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCd2aWRlb19fc3RvcC0tc3RvcHBlZCcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdClcblxuXHRcdFx0XHR0aGlzLnZpZGVvTGlzdGVuZXJzLnB1c2goXG5cdFx0XHRcdFx0bmV3IEN1c3RvbUxpc3RlbmVyKHtcblx0XHRcdFx0XHRcdGVsZW1lbnQ6IHZpZGVvLFxuXHRcdFx0XHRcdFx0bGlzdGVuZXI6ICdwYXVzZScsXG5cdFx0XHRcdFx0XHRjYWxsYmFjaygpe1xuXHRcdFx0XHRcdFx0XHRzdGF0dXMgPSAnc3RvcHBlZCc7XG5cdFx0XHRcdFx0XHRcdHN0b3BCdXR0b24uY2xhc3NMaXN0LmFkZCgndmlkZW9fX3N0b3AtLXN0b3BwZWQnKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpXG5cblx0XHRcdFx0dGhpcy52aWRlb0xpc3RlbmVycy5wdXNoKFxuXHRcdFx0XHRcdG5ldyBDdXN0b21MaXN0ZW5lcih7XG5cdFx0XHRcdFx0XHRsaXN0ZW5lcjogJ2tleXVwJyxcblx0XHRcdFx0XHRcdGNhbGxiYWNrKGUpe1xuXHRcdFx0XHRcdFx0XHRpZiAoZS53aGljaCAhPT0gMzIpIHJldHVybjtcblx0XHRcdFx0XHRcdFx0c3RvcEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCd2aWRlb19fc3RvcC0tc3RvcHBlZCcpO1xuXHRcdFx0XHRcdFx0XHR0b2dnbGVQbGF5KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0KVxuXG5cdFx0XHRcdHRoaXMudmlkZW9MaXN0ZW5lcnMucHVzaChcblx0XHRcdFx0XHRuZXcgQ2xpY2soe1xuXHRcdFx0XHRcdFx0ZWxlbWVudDogY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2aWRlb19fcHJvZ3Jlc3MnKVswXSxcblx0XHRcdFx0XHRcdGNhbGxiYWNrKGUpe1xuXHRcdFx0XHRcdFx0XHRjb25zdCB7eH0gPSBlO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjbGlja1Byb2dyZXNzID0geC90aGlzLm9mZnNldFdpZHRoO1xuXHRcdFx0XHRcdFx0XHR2aWRlby5jdXJyZW50VGltZSA9IHZpZGVvLmR1cmF0aW9uICogY2xpY2tQcm9ncmVzcztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGNvbnN0IG11dGUgPSBuZXcgQ2xpY2soe1xuXHRcdFx0XHRcdGVsZW1lbnQ6IGNvbnRlbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndmlkZW9fX211dGUnKVswXSxcblx0XHRcdFx0XHRjYWxsYmFjaygpe1xuXHRcdFx0XHRcdFx0aWYgKCF2aWRlby5tdXRlZCkge1xuXHRcdFx0XHRcdFx0XHR2aWRlby5tdXRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG11dGUuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd2aWRlb19fbXV0ZS0tbXV0ZWQnKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHZpZGVvLm11dGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdG11dGUuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd2aWRlb19fbXV0ZS0tbXV0ZWQnKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLnZpZGVvTGlzdGVuZXJzLnB1c2goIG11dGUgKTtcblxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgoKT0+e1xuXHRcdFx0XHRjb25zb2xlLmxvZygn0J3QtSDQt9Cw0L/Rg9GB0YLQuNC70L7RgdGMJyk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdHZpZGVvU2V0UHJvZ3Jlc3ModmlkZW8pe1xuXHRcdGNvbnN0IGNvbnRhaW5lciA9IHZpZGVvLnBhcmVudEVsZW1lbnQ7XG5cdFx0Y29uc3QgYWN0dWFsUHJvZ3Jlc3MgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignLnZpZGVvX19wcm9ncmVzcy1hY3R1YWwnKTtcblx0XHRjb25zdCBhY3R1YWxUaW1lID0gY29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3ZpZGVvX19hY3R1YWxUaW1lJylbMF07XG5cdFx0Y29uc3QgYWN0dWFsVGltZV9taW51dGVzID0gYWN0dWFsVGltZS5xdWVyeVNlbGVjdG9yKCcudmlkZW9fX2FjdHVhbFRpbWUtbWludXRlcycpO1xuXHRcdGNvbnN0IGFjdHVhbFRpbWVfc2Vjb25kcyA9IGFjdHVhbFRpbWUucXVlcnlTZWxlY3RvcignLnZpZGVvX19hY3R1YWxUaW1lLXNlY29uZHMnKTtcblxuXHRcdGNvbnN0IGZ1bGxUaW1lID0gY29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3ZpZGVvX19mdWxsVGltZScpWzBdO1xuXHRcdGNvbnN0IGZ1bGxUaW1lX21pbnV0ZXMgPSBmdWxsVGltZS5xdWVyeVNlbGVjdG9yKCcudmlkZW9fX2Z1bGxUaW1lLW1pbnV0ZXMnKTtcblx0XHRjb25zdCBmdWxsVGltZV9zZWNvbmRzID0gZnVsbFRpbWUucXVlcnlTZWxlY3RvcignLnZpZGVvX19mdWxsVGltZS1zZWNvbmRzJyk7XG5cblxuXHRcdGxldCBmdWxsTWluID0gfn4odmlkZW8uZHVyYXRpb24vNjApO1xuXHRcdGxldCBmdWxsU2VjID0gfn4odmlkZW8uZHVyYXRpb24gJSA2MCk7XG5cdFx0aWYgKCBmdWxsTWluIDwgMTAgKVxuXHRcdFx0ZnVsbE1pbiA9ICcwJyArIGZ1bGxNaW47XG5cblx0XHRpZiAoIGZ1bGxTZWMgPCAxMCApXG5cdFx0XHRmdWxsU2VjID0gJzAnICsgZnVsbFNlYztcblxuXHRcdGZ1bGxUaW1lX21pbnV0ZXMudGV4dENvbnRlbnQgPSBmdWxsTWluO1xuXHRcdGZ1bGxUaW1lX3NlY29uZHMudGV4dENvbnRlbnQgPSBmdWxsU2VjO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uKCl7XG5cdFx0XHRjb25zdCBwcm9ncmVzcyA9IHZpZGVvLmN1cnJlbnRUaW1lL3ZpZGVvLmR1cmF0aW9uO1xuXG5cdFx0XHRsZXQgYWN0dWFsTWluID0gfn4odmlkZW8uY3VycmVudFRpbWUvNjApO1xuXHRcdFx0bGV0IGFjdHVhbFNlYyA9IH5+KHZpZGVvLmN1cnJlbnRUaW1lICUgNjApO1xuXG5cdFx0XHRpZiAoIGFjdHVhbE1pbiA8IDEwIClcblx0XHRcdFx0YWN0dWFsTWluID0gJzAnICsgYWN0dWFsTWluO1xuXG5cdFx0XHRpZiAoIGFjdHVhbFNlYyA8IDEwIClcblx0XHRcdFx0YWN0dWFsU2VjID0gJzAnICsgYWN0dWFsU2VjO1xuXG5cdFx0XHRhY3R1YWxUaW1lX21pbnV0ZXMudGV4dENvbnRlbnQgPSBhY3R1YWxNaW47XG5cdFx0XHRhY3R1YWxUaW1lX3NlY29uZHMudGV4dENvbnRlbnQgPSBhY3R1YWxTZWM7XG5cblx0XHRcdGFjdHVhbFByb2dyZXNzLnN0eWxlLnRyYW5zaXRpb24gPSAnd2lkdGggLjJzIGxpbmVhcic7XG5cdFx0XHRhY3R1YWxQcm9ncmVzcy5zdHlsZS53aWR0aCA9IHByb2dyZXNzICogMTAwICsgJyUnO1xuXHRcdH1cblx0fVxuXG5cbn1cbiIsIi8vIHZlcnNpb24gMC4wLjBcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaWNrIHtcblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdHRoaXMuZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudCB8fCB3aW5kb3c7XG5cdFx0dGhpcy5jYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2s7XG5cdFx0dGhpcy5wYXJlbnQgPSBvcHRpb25zLnBhcmVudCB8fCBudWxsO1xuXG5cdFx0dGhpcy5MaXN0ZW5lcigpO1xuXHR9XG5cblx0TGlzdGVuZXIoKSB7XG5cdFx0dGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLmNhbGxiYWNrKTtcblx0fVxuXG5cdGVuZCgpIHtcblx0XHR0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuY2FsbGJhY2spO1xuXHR9XG59XG4iLCIvLyB2ZXJzaW9uIDAuMC4wXG5leHBvcnQgZGVmYXVsdCBjbGFzcyB7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHR0aGlzLmVsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQgfHwgd2luZG93O1xuXHRcdHRoaXMuY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrO1xuXHRcdHRoaXMubGlzdGVuZXIgPSBvcHRpb25zLmxpc3RlbmVyO1xuXHRcdHRoaXMucGFyZW50ID0gb3B0aW9ucy5wYXJlbnQgfHwgbnVsbDtcblxuXHRcdHRoaXMuTGlzdGVuZXIoKTtcblx0fVxuXG5cdExpc3RlbmVyKCkge1xuXHRcdHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMubGlzdGVuZXIsdGhpcy5jYWxsYmFjayk7XG5cdH1cblxuXHRlbmQoKSB7XG5cdFx0dGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5saXN0ZW5lcix0aGlzLmNhbGxiYWNrKTtcblx0fVxufVxuIiwiaW1wb3J0IEJhbGwgZnJvbSAnLi4vLi4vLi4vcGFnZXMvdGl0bGUvanMvYmFsbC5qcyc7XG5cbmNvbnN0IGJhbGwgPSBuZXcgQmFsbCgpO1xubGV0IHRlbXBsYXRlTnVtYmVyID0gMDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlkZW8ge1xuXHRjb25zdHJ1Y3RvcihjYXJkLCB0YXJnZXQsIGNsaWNrRXZlbnQpIHtcblxuXHRcdGlmIChjYXJkLmNsYXNzTGlzdC5jb250YWlucygnanMtZ2VuZXJhdGVkQ2xpY2tCYWxsJykpIHJldHVybjtcblx0XHRjb25zdCBidXR0b25zID0gWy4uLmNhcmQucXVlcnlTZWxlY3RvckFsbChbJy5uZXdzQ2FyZF9faW1hZ2UnLCcubmV3c0NhcmRfX2hlYWQnXSldO1xuXG5cdFx0aWYgKCAhdGFyZ2V0LmNsb3Nlc3QoJy5uZXdzQ2FyZF9faW1hZ2UnKSAmJiAhdGFyZ2V0LmNsb3Nlc3QoJy5uZXdzQ2FyZF9faGVhZCcpICkgcmV0dXJuO1xuXG5cdFx0bGV0IHRlbXBsYXRlU3RyaW5nID0gdGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLXZpZGVvLXN0cmluZ10nKTtcblx0XHR0ZW1wbGF0ZVN0cmluZyA9IHRlbXBsYXRlU3RyaW5nICYmIHRlbXBsYXRlU3RyaW5nLmRhdGFzZXQudmlkZW9TdHJpbmc7XG5cblx0XHRpZiAoICF0ZW1wbGF0ZVN0cmluZyApIHJldHVybjtcblxuXHRcdGNhcmQuZGF0YXNldC5jbGlja0JhbGwgPSAndmlkZW8nICsgdGVtcGxhdGVOdW1iZXI7XG5cblx0XHRsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0ZGl2LmlubmVySFRNTCA9IHRoaXMudGVtcGxhdGUodGVtcGxhdGVTdHJpbmcpO1xuXHRcdGxldCBlbGVtZW50ID0gZGl2LmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG5cdFx0ZGl2ID0gbnVsbDtcblx0XHRjYXJkLmNsYXNzTGlzdC5hZGQoJ2pzLWdlbmVyYXRlZENsaWNrQmFsbCcpO1xuXG5cblx0XHRsZXQgZm5PcGVuID0gYmFsbC5pbml0QmFsbChjYXJkLCBmYWxzZSk7XG5cblx0XHRmbk9wZW4oY2xpY2tFdmVudCk7XG5cblx0fVxuXG5cblx0dGVtcGxhdGUoc3RyaW5nKSB7XG5cblxuXHRcdGlmICgvaWZyYW1lLy50ZXN0KHN0cmluZykpXG5cdFx0XHRyZXR1cm4gYFxuXHRcdFx0XHQ8ZGl2IGRhdGEtYmFsbC1jbGljaz1cInZpZGVvJHt0ZW1wbGF0ZU51bWJlcisrfVwiPlxuXHRcdFx0XHRcdDxkaXYgc3R5bGU9XCIgYmFja2dyb3VuZDogIzAwMDtcIj5cblx0XHRcdFx0XHRcdCR7c3RyaW5nfVxuXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgZGF0YS1iYWxsLWNsb3NlPVwidmlkZW9cIj48L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5gO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBgXG5cdFx0XHRcdDxkaXYgZGF0YS1iYWxsLWNsaWNrPVwidmlkZW8ke3RlbXBsYXRlTnVtYmVyKyt9XCI+XG5cdFx0XHRcdFx0PGRpdiBzdHlsZT1cIiBiYWNrZ3JvdW5kOiAjMDAwO1wiPlxuXG5cdFx0XHRcdFx0XHQ8dmlkZW8gY2xhc3M9XCJ2aWRlb1wiIHByZWxvYWQ9XCJub25lXCIgd2lkdGg9XCIxMDAwcHhcIiBoZWlnaHQ9XCIxMDAwcHhcIj5cblx0XHRcdFx0XHRcdFx0PHNvdXJjZSBzcmM9XCIke3N0cmluZ31cIiB0eXBlPVwidmlkZW8vbXA0XCI+XG5cdFx0XHRcdFx0XHQ8L3ZpZGVvPlxuXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidmlkZW9fX2NvbnRyb2xzXCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ2aWRlb19fc3RvcFwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidmlkZW9fX211dGVcIj48L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInZpZGVvX190aW1lXCI+PHNwYW4gY2xhc3M9XCJ2aWRlb19fYWN0dWFsVGltZVwiPjxzcGFuIGNsYXNzPVwidmlkZW9fX2FjdHVhbFRpbWUtbWludXRlc1wiPjwvc3Bhbj46PHNwYW4gY2xhc3M9XCJ2aWRlb19fYWN0dWFsVGltZS1zZWNvbmRzXCI+PC9zcGFuPjwvc3Bhbj4vPHNwYW4gY2xhc3M9XCJ2aWRlb19fZnVsbFRpbWVcIj48c3BhbiBjbGFzcz1cInZpZGVvX19mdWxsVGltZS1taW51dGVzXCI+PC9zcGFuPjo8c3BhbiBjbGFzcz1cInZpZGVvX19mdWxsVGltZS1zZWNvbmRzXCI+PC9zcGFuPjwvc3Bhbj48L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidmlkZW9fX3Byb2dyZXNzXCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ2aWRlb19fcHJvZ3Jlc3MtYWN0dWFsXCI+PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGRhdGEtYmFsbC1jbG9zZT1cInZpZGVvXCI+PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+YDtcblxuXHR9XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5vbigpO1xuXHR9XG5cblx0b24oKSB7XG5cblx0XHRpZiAoJ3NlcnZpY2VXb3JrZXInIGluIG5hdmlnYXRvcikge1xuXHRcdFx0Ly8g0JLQtdGB0Ywg0LrQvtC0INGA0LXQs9C40YHRgtGA0LDRhtC40Lgg0YMg0L3QsNGBINCw0YHQuNC90YXRgNC+0L3QvdGL0LkuXG5cdFx0XHRuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWdpc3RlcignL3NlcnZpY2VXb3JrZXJMb2dpYy5qcycpXG5cdFx0XHRcdC50aGVuKCgpID0+ICB7XG5cdFx0XHRcdFx0cmV0dXJuIG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlYWR5XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmxvZyhlcnIpKTtcblxuXG5cdFx0XHRmdW5jdGlvbiB1bnJlZ1dvcmtlcnMoKSB7XG5cblx0XHRcdFx0dmFyIHJlZ3MgPSBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5nZXRSZWdpc3RyYXRpb25zKClcblx0XHRcdFx0LnRoZW4oYXJyID0+IHtcblxuXHRcdFx0XHRcdGFyci5mb3JFYWNoKCByZWcgPT4ge1xuXHRcdFx0XHRcdFx0cmVnLnVucmVnaXN0ZXIoKVxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdH0pXG5cblx0XHRcdH1cblx0XHRcdHdpbmRvdy5kZWwgPSB1bnJlZ1dvcmtlcnM7XG5cblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCBNb2RhbCBmcm9tICdwb3B1cC13aW5kb3ctbW9kdWxlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xuXHRjb25zdHJ1Y3RvcihjYXJkLCB0YXJnZXQpIHtcblxuXHRcdHRoaXMubG9naWMoY2FyZCwgdGFyZ2V0KTtcblx0fVxuXG5cdGdlbmVyYXRlTW9kYWxIVE1MKCkge1xuXHRcdGxldCBNb2RhbEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0TW9kYWxFbC5jbGFzc05hbWUgPSAnUERGVmlld2VyIG1vZGFsJztcblx0XHRNb2RhbEVsLmlkID0gJ1BERlZpZXdlcic7XG5cblx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKE1vZGFsRWwpO1xuXG5cdFx0cmV0dXJuIE1vZGFsRWw7XG5cdH1cblxuXHRhc3luYyBsb2dpYyhjYXJkLCB0YXJnZXQpIHtcblxuXHRcdGxldCBlbCA9IHRhcmdldC5jbG9zZXN0KCcubmV3c0NhcmRfX2ltYWdlJykgfHwgdGFyZ2V0LmNsb3Nlc3QoJy5uZXdzQ2FyZF9faGVhZCcpO1xuXG5cdFx0aWYgKCAhZWwgKSByZXR1cm47XG5cblx0XHR0aGlzLmVsID0gdGhpcy5nZW5lcmF0ZU1vZGFsSFRNTCgpO1xuXG5cdFx0dGhpcy5lbC5pbm5lckhUTUwgPSBgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWxfX2Zvb3RlclwiPlxuXHRcdFx0XHQ8YSBjbGFzcz1cIm1vZGFsX19jbG9zZVwiIGhyZWY9XCIkeyBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSB9XCI+0KHQutCw0YfQsNGC0Yw8L2E+XG5cdFx0XHRcdDxhIGNsYXNzPVwiZnVsbFNjcmVlblwiID7Qn9C+0LvQvdC+0Y3QutGA0LDQvdC90YvQuSDRgNC10LbQuNC8PC9hPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWxfX2Nsb3NlXCIgPtCX0LDQutGA0YvRgtGMPC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbF9fY29udGVudFwiIHN0eWxlPVwicGFkZGluZzowO1wiPlxuXHRcdFx0XHQ8aWZyYW1lIHNyYz1cIiR7IGVsLmdldEF0dHJpYnV0ZSgnaHJlZicpIH1cIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7XCIgZnJhbWVib3JkZXI9XCIwXCI+XG5cdFx0XHRcdFx00KTQsNC50LvRiyDQvdC1INC00L7RgdGC0YPQv9C90Ytcblx0XHRcdFx0PC9pZnJhbWU+XG5cdFx0XHQ8L2Rpdj5cblx0XHRgO1xuXG5cdFx0bmV3IE1vZGFsKHtcblx0XHRcdGVsZW1lbnQ6IHRoaXMuZWwsXG5cdFx0XHRhZnRlckNsb3NlOiAoKT0+e1xuXHRcdFx0XHR0aGlzLmRlc3Ryb3koKTtcblx0XHRcdH1cblx0XHR9KS5vcGVuKClcblx0XHRcdC50aGVuKCgpPT57XG5cdFx0XHRcdGxldCBmbHNjciA9IGZhbHNlO1xuXHRcdFx0XHRsZXQgYnV0dG9uID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuZnVsbFNjcmVlbicpO1xuXHRcdFx0XHRsZXQgb3JpZ2luYWxUZXh0ID0gYnV0dG9uLmlubmVyVGV4dDtcblx0XHRcdFx0YnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGV2ZW50ID0+IHtcblx0XHRcdFx0XHRpZiAoIWZsc2NyKSB7XG5cdFx0XHRcdFx0XHRmbHNjciA9IHRydWU7XG5cdFx0XHRcdFx0XHRidXR0b24uaW5uZXJUZXh0ID0gJ9Cj0LzQtdC90YzRiNC40YLRjCc7XG5cdFx0XHRcdFx0XHR0aGlzLmVsLnN0eWxlLm1heFdpZHRoID0gJzk4JSc7XG5cdFx0XHRcdFx0XHR0aGlzLmVsLnN0eWxlLndpZHRoID0gJzk4JSc7XG5cdFx0XHRcdFx0XHR0aGlzLmVsLnN0eWxlLm1heEhlaWdodCA9ICc5OCUnO1xuXHRcdFx0XHRcdFx0dGhpcy5lbC5zdHlsZS5oZWlnaHQgPSAnOTglJztcblx0XHRcdFx0XHRcdHRoaXMuZWwucXVlcnlTZWxlY3RvcignLm1vZGFsX19jb250ZW50Jykuc3R5bGUubWF4SGVpZ2h0ID0gJ2NhbGMoOTh2aCAtIDU2cHgpJztcblx0XHRcdFx0XHRcdHRoaXMuZWwuc3R5bGUuYm90dG9tID0gJzElJztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0ZmxzY3IgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGJ1dHRvbi5pbm5lclRleHQgPSBvcmlnaW5hbFRleHQ7XG5cdFx0XHRcdFx0XHR0aGlzLmVsLnN0eWxlLm1heFdpZHRoID0gJyc7XG5cdFx0XHRcdFx0XHR0aGlzLmVsLnN0eWxlLndpZHRoID0gJyc7XG5cdFx0XHRcdFx0XHR0aGlzLmVsLnN0eWxlLm1heEhlaWdodCA9ICcnO1xuXHRcdFx0XHRcdFx0dGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcubW9kYWxfX2NvbnRlbnQnKS5zdHlsZS5tYXhIZWlnaHQgPSAnJztcblx0XHRcdFx0XHRcdHRoaXMuZWwuc3R5bGUuYm90dG9tID0gJzMlJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0fVxuXG5cdGRlc3Ryb3koKSB7XG5cdFx0dGhpcy5lbC5yZW1vdmUoKTtcblx0XHR0aGlzLmVsID0gbnVsbDtcblx0fVxufVxuIiwiLyohXG4gKiBqdXN0aWZpZWRHYWxsZXJ5IC0gdjMuNy4wXG4gKiBodHRwOi8vbWlyb21hbm5pbm8uZ2l0aHViLmlvL0p1c3RpZmllZC1HYWxsZXJ5L1xuICogQ29weXJpZ2h0IChjKSAyMDE4IE1pcm8gTWFubmlub1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICovXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICBkZWZpbmUoWydqcXVlcnknXSwgZmFjdG9yeSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAvLyBOb2RlL0NvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiggcm9vdCwgalF1ZXJ5ICkge1xuICAgICAgaWYgKCBqUXVlcnkgPT09IHVuZGVmaW5lZCApIHtcbiAgICAgICAgLy8gcmVxdWlyZSgnalF1ZXJ5JykgcmV0dXJucyBhIGZhY3RvcnkgdGhhdCByZXF1aXJlcyB3aW5kb3cgdG9cbiAgICAgICAgLy8gYnVpbGQgYSBqUXVlcnkgaW5zdGFuY2UsIHdlIG5vcm1hbGl6ZSBob3cgd2UgdXNlIG1vZHVsZXNcbiAgICAgICAgLy8gdGhhdCByZXF1aXJlIHRoaXMgcGF0dGVybiBidXQgdGhlIHdpbmRvdyBwcm92aWRlZCBpcyBhIG5vb3BcbiAgICAgICAgLy8gaWYgaXQncyBkZWZpbmVkIChob3cganF1ZXJ5IHdvcmtzKVxuICAgICAgICBpZiAoIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICkge1xuICAgICAgICAgIGpRdWVyeSA9IHJlcXVpcmUoJ2pxdWVyeScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGpRdWVyeSA9IHJlcXVpcmUoJ2pxdWVyeScpKHJvb3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmYWN0b3J5KGpRdWVyeSk7XG4gICAgICByZXR1cm4galF1ZXJ5O1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gQnJvd3NlciBnbG9iYWxzXG4gICAgZmFjdG9yeShqUXVlcnkpO1xuICB9XG59KGZ1bmN0aW9uICgkKSB7XG5cbiAgLyoqXG4gICAqIEp1c3RpZmllZCBHYWxsZXJ5IGNvbnRyb2xsZXIgY29uc3RydWN0b3JcbiAgICpcbiAgICogQHBhcmFtICRnYWxsZXJ5IHRoZSBnYWxsZXJ5IHRvIGJ1aWxkXG4gICAqIEBwYXJhbSBzZXR0aW5ncyB0aGUgc2V0dGluZ3MgKHRoZSBkZWZhdWx0cyBhcmUgaW4gSnVzdGlmaWVkR2FsbGVyeS5kZWZhdWx0cylcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqL1xuICB2YXIgSnVzdGlmaWVkR2FsbGVyeSA9IGZ1bmN0aW9uICgkZ2FsbGVyeSwgc2V0dGluZ3MpIHtcbiAgXG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMuY2hlY2tTZXR0aW5ncygpO1xuICBcbiAgICB0aGlzLmltZ0FuYWx5emVyVGltZW91dCA9IG51bGw7XG4gICAgdGhpcy5lbnRyaWVzID0gbnVsbDtcbiAgICB0aGlzLmJ1aWxkaW5nUm93ID0ge1xuICAgICAgZW50cmllc0J1ZmYgOiBbXSxcbiAgICAgIHdpZHRoIDogMCxcbiAgICAgIGhlaWdodCA6IDAsXG4gICAgICBhc3BlY3RSYXRpbyA6IDBcbiAgICB9O1xuICAgIHRoaXMubGFzdEZldGNoZWRFbnRyeSA9IG51bGw7XG4gICAgdGhpcy5sYXN0QW5hbHl6ZWRJbmRleCA9IC0xO1xuICAgIHRoaXMueWllbGQgPSB7XG4gICAgICBldmVyeSA6IDIsIC8vIGRvIGEgZmx1c2ggZXZlcnkgbiBmbHVzaGVzIChtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxKVxuICAgICAgZmx1c2hlZCA6IDAgLy8gZmx1c2hlZCByb3dzIHdpdGhvdXQgYSB5aWVsZFxuICAgIH07XG4gICAgdGhpcy5ib3JkZXIgPSBzZXR0aW5ncy5ib3JkZXIgPj0gMCA/IHNldHRpbmdzLmJvcmRlciA6IHNldHRpbmdzLm1hcmdpbnM7XG4gICAgdGhpcy5tYXhSb3dIZWlnaHQgPSB0aGlzLnJldHJpZXZlTWF4Um93SGVpZ2h0KCk7XG4gICAgdGhpcy5zdWZmaXhSYW5nZXMgPSB0aGlzLnJldHJpZXZlU3VmZml4UmFuZ2VzKCk7XG4gICAgdGhpcy5vZmZZID0gdGhpcy5ib3JkZXI7XG4gICAgdGhpcy5yb3dzID0gMDtcbiAgICB0aGlzLnNwaW5uZXIgPSB7XG4gICAgICBwaGFzZSA6IDAsXG4gICAgICB0aW1lU2xvdCA6IDE1MCxcbiAgICAgICRlbCA6ICQoJzxkaXYgY2xhc3M9XCJzcGlubmVyXCI+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PC9kaXY+JyksXG4gICAgICBpbnRlcnZhbElkIDogbnVsbFxuICAgIH07XG4gICAgdGhpcy5zY3JvbGxCYXJPbiA9IGZhbHNlO1xuICAgIHRoaXMuY2hlY2tXaWR0aEludGVydmFsSWQgPSBudWxsO1xuICAgIHRoaXMuZ2FsbGVyeVdpZHRoID0gJGdhbGxlcnkud2lkdGgoKTtcbiAgICB0aGlzLiRnYWxsZXJ5ID0gJGdhbGxlcnk7XG4gIFxuICB9O1xuICBcbiAgLyoqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBiZXN0IHN1ZmZpeCBnaXZlbiB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQgKi9cbiAgSnVzdGlmaWVkR2FsbGVyeS5wcm90b3R5cGUuZ2V0U3VmZml4ID0gZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB2YXIgbG9uZ2VzdFNpZGUsIGk7XG4gICAgbG9uZ2VzdFNpZGUgPSAod2lkdGggPiBoZWlnaHQpID8gd2lkdGggOiBoZWlnaHQ7XG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc3VmZml4UmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobG9uZ2VzdFNpZGUgPD0gdGhpcy5zdWZmaXhSYW5nZXNbaV0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3Muc2l6ZVJhbmdlU3VmZml4ZXNbdGhpcy5zdWZmaXhSYW5nZXNbaV1dO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5zaXplUmFuZ2VTdWZmaXhlc1t0aGlzLnN1ZmZpeFJhbmdlc1tpIC0gMV1dO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgc3VmZml4IGZyb20gdGhlIHN0cmluZ1xuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBhIG5ldyBzdHJpbmcgd2l0aG91dCB0aGUgc3VmZml4XG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5yZW1vdmVTdWZmaXggPSBmdW5jdGlvbiAoc3RyLCBzdWZmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCk7XG4gIH07XG4gIFxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGEgYm9vbGVhbiB0byBzYXkgaWYgdGhlIHN1ZmZpeCBpcyBjb250YWluZWQgaW4gdGhlIHN0ciBvciBub3RcbiAgICovXG4gIEp1c3RpZmllZEdhbGxlcnkucHJvdG90eXBlLmVuZHNXaXRoID0gZnVuY3Rpb24gKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5pbmRleE9mKHN1ZmZpeCwgc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpICE9PSAtMTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVzZWQgc3VmZml4IG9mIGEgcGFydGljdWxhciB1cmxcbiAgICpcbiAgICogQHBhcmFtIHN0clxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSByZXR1cm4gdGhlIHVzZWQgc3VmZml4XG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5nZXRVc2VkU3VmZml4ID0gZnVuY3Rpb24gKHN0cikge1xuICAgIGZvciAodmFyIHNpIGluIHRoaXMuc2V0dGluZ3Muc2l6ZVJhbmdlU3VmZml4ZXMpIHtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLnNpemVSYW5nZVN1ZmZpeGVzLmhhc093blByb3BlcnR5KHNpKSkge1xuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5zaXplUmFuZ2VTdWZmaXhlc1tzaV0ubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHRoaXMuZW5kc1dpdGgoc3RyLCB0aGlzLnNldHRpbmdzLnNpemVSYW5nZVN1ZmZpeGVzW3NpXSkpIHJldHVybiB0aGlzLnNldHRpbmdzLnNpemVSYW5nZVN1ZmZpeGVzW3NpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEdpdmVuIGFuIGltYWdlIHNyYywgd2l0aCB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQsIHJldHVybnMgdGhlIG5ldyBpbWFnZSBzcmMgd2l0aCB0aGVcbiAgICogYmVzdCBzdWZmaXggdG8gc2hvdyB0aGUgYmVzdCBxdWFsaXR5IHRodW1ibmFpbC5cbiAgICpcbiAgICogQHJldHVybnMge1N0cmluZ30gdGhlIHN1ZmZpeCB0byB1c2VcbiAgICovXG4gIEp1c3RpZmllZEdhbGxlcnkucHJvdG90eXBlLm5ld1NyYyA9IGZ1bmN0aW9uIChpbWFnZVNyYywgaW1nV2lkdGgsIGltZ0hlaWdodCwgaW1hZ2UpIHtcbiAgICB2YXIgbmV3SW1hZ2VTcmM7XG4gIFxuICAgIGlmICh0aGlzLnNldHRpbmdzLnRodW1ibmFpbFBhdGgpIHtcbiAgICAgIG5ld0ltYWdlU3JjID0gdGhpcy5zZXR0aW5ncy50aHVtYm5haWxQYXRoKGltYWdlU3JjLCBpbWdXaWR0aCwgaW1nSGVpZ2h0LCBpbWFnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtYXRjaFJlcyA9IGltYWdlU3JjLm1hdGNoKHRoaXMuc2V0dGluZ3MuZXh0ZW5zaW9uKTtcbiAgICAgIHZhciBleHQgPSAobWF0Y2hSZXMgIT09IG51bGwpID8gbWF0Y2hSZXNbMF0gOiAnJztcbiAgICAgIG5ld0ltYWdlU3JjID0gaW1hZ2VTcmMucmVwbGFjZSh0aGlzLnNldHRpbmdzLmV4dGVuc2lvbiwgJycpO1xuICAgICAgbmV3SW1hZ2VTcmMgPSB0aGlzLnJlbW92ZVN1ZmZpeChuZXdJbWFnZVNyYywgdGhpcy5nZXRVc2VkU3VmZml4KG5ld0ltYWdlU3JjKSk7XG4gICAgICBuZXdJbWFnZVNyYyArPSB0aGlzLmdldFN1ZmZpeChpbWdXaWR0aCwgaW1nSGVpZ2h0KSArIGV4dDtcbiAgICB9XG4gIFxuICAgIHJldHVybiBuZXdJbWFnZVNyYztcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBTaG93cyB0aGUgaW1hZ2VzIHRoYXQgaXMgaW4gdGhlIGdpdmVuIGVudHJ5XG4gICAqXG4gICAqIEBwYXJhbSAkZW50cnkgdGhlIGVudHJ5XG4gICAqIEBwYXJhbSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgc2hvdyBhbmltYXRpb24gaXMgZmluaXNoZWRcbiAgICovXG4gIEp1c3RpZmllZEdhbGxlcnkucHJvdG90eXBlLnNob3dJbWcgPSBmdW5jdGlvbiAoJGVudHJ5LCBjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLnNldHRpbmdzLmNzc0FuaW1hdGlvbikge1xuICAgICAgJGVudHJ5LmFkZENsYXNzKCdlbnRyeS12aXNpYmxlJyk7XG4gICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRlbnRyeS5zdG9wKCkuZmFkZVRvKHRoaXMuc2V0dGluZ3MuaW1hZ2VzQW5pbWF0aW9uRHVyYXRpb24sIDEuMCwgY2FsbGJhY2spO1xuICAgICAgJGVudHJ5LmZpbmQodGhpcy5zZXR0aW5ncy5pbWdTZWxlY3Rvcikuc3RvcCgpLmZhZGVUbyh0aGlzLnNldHRpbmdzLmltYWdlc0FuaW1hdGlvbkR1cmF0aW9uLCAxLjAsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH07XG4gIFxuICAvKipcbiAgICogRXh0cmFjdCB0aGUgaW1hZ2Ugc3JjIGZvcm0gdGhlIGltYWdlLCBsb29raW5nIGZyb20gdGhlICdzYWZlLXNyYycsIGFuZCBpZiBpdCBjYW4ndCBiZSBmb3VuZCwgZnJvbSB0aGVcbiAgICogJ3NyYycgYXR0cmlidXRlLiBJdCBzYXZlcyBpbiB0aGUgaW1hZ2UgZGF0YSB0aGUgJ2pnLm9yaWdpbmFsU3JjJyBmaWVsZCwgd2l0aCB0aGUgZXh0cmFjdGVkIHNyYy5cbiAgICpcbiAgICogQHBhcmFtICRpbWFnZSB0aGUgaW1hZ2UgdG8gYW5hbHl6ZVxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgZXh0cmFjdGVkIHNyY1xuICAgKi9cbiAgSnVzdGlmaWVkR2FsbGVyeS5wcm90b3R5cGUuZXh0cmFjdEltZ1NyY0Zyb21JbWFnZSA9IGZ1bmN0aW9uICgkaW1hZ2UpIHtcbiAgICB2YXIgaW1hZ2VTcmMgPSAodHlwZW9mICRpbWFnZS5kYXRhKCdzYWZlLXNyYycpICE9PSAndW5kZWZpbmVkJykgPyAkaW1hZ2UuZGF0YSgnc2FmZS1zcmMnKSA6ICRpbWFnZS5hdHRyKCdzcmMnKTtcbiAgICAkaW1hZ2UuZGF0YSgnamcub3JpZ2luYWxTcmMnLCBpbWFnZVNyYyk7XG4gICAgcmV0dXJuIGltYWdlU3JjO1xuICB9O1xuICBcbiAgLyoqIEByZXR1cm5zIHtqUXVlcnl9IHRoZSBpbWFnZSBpbiB0aGUgZ2l2ZW4gZW50cnkgKi9cbiAgSnVzdGlmaWVkR2FsbGVyeS5wcm90b3R5cGUuaW1nRnJvbUVudHJ5ID0gZnVuY3Rpb24gKCRlbnRyeSkge1xuICAgIHZhciAkaW1nID0gJGVudHJ5LmZpbmQodGhpcy5zZXR0aW5ncy5pbWdTZWxlY3Rvcik7XG4gICAgcmV0dXJuICRpbWcubGVuZ3RoID09PSAwID8gbnVsbCA6ICRpbWc7XG4gIH07XG4gIFxuICAvKiogQHJldHVybnMge2pRdWVyeX0gdGhlIGNhcHRpb24gaW4gdGhlIGdpdmVuIGVudHJ5ICovXG4gIEp1c3RpZmllZEdhbGxlcnkucHJvdG90eXBlLmNhcHRpb25Gcm9tRW50cnkgPSBmdW5jdGlvbiAoJGVudHJ5KSB7XG4gICAgdmFyICRjYXB0aW9uID0gJGVudHJ5LmZpbmQoJz4gLmNhcHRpb24nKTtcbiAgICByZXR1cm4gJGNhcHRpb24ubGVuZ3RoID09PSAwID8gbnVsbCA6ICRjYXB0aW9uO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIERpc3BsYXkgdGhlIGVudHJ5XG4gICAqXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSAkZW50cnkgdGhlIGVudHJ5IHRvIGRpc3BsYXlcbiAgICogQHBhcmFtIHtpbnR9IHggdGhlIHggcG9zaXRpb24gd2hlcmUgdGhlIGVudHJ5IG11c3QgYmUgcG9zaXRpb25lZFxuICAgKiBAcGFyYW0geSB0aGUgeSBwb3NpdGlvbiB3aGVyZSB0aGUgZW50cnkgbXVzdCBiZSBwb3NpdGlvbmVkXG4gICAqIEBwYXJhbSBpbWdXaWR0aCB0aGUgaW1hZ2Ugd2lkdGhcbiAgICogQHBhcmFtIGltZ0hlaWdodCB0aGUgaW1hZ2UgaGVpZ2h0XG4gICAqIEBwYXJhbSByb3dIZWlnaHQgdGhlIHJvdyBoZWlnaHQgb2YgdGhlIHJvdyB0aGF0IG93bnMgdGhlIGVudHJ5XG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5kaXNwbGF5RW50cnkgPSBmdW5jdGlvbiAoJGVudHJ5LCB4LCB5LCBpbWdXaWR0aCwgaW1nSGVpZ2h0LCByb3dIZWlnaHQpIHtcbiAgICAkZW50cnkud2lkdGgoaW1nV2lkdGgpO1xuICAgICRlbnRyeS5oZWlnaHQocm93SGVpZ2h0KTtcbiAgICAkZW50cnkuY3NzKCd0b3AnLCB5KTtcbiAgICAkZW50cnkuY3NzKCdsZWZ0JywgeCk7XG4gIFxuICAgIHZhciAkaW1hZ2UgPSB0aGlzLmltZ0Zyb21FbnRyeSgkZW50cnkpO1xuICAgIGlmICgkaW1hZ2UgIT09IG51bGwpIHtcbiAgICAgICRpbWFnZS5jc3MoJ3dpZHRoJywgaW1nV2lkdGgpO1xuICAgICAgJGltYWdlLmNzcygnaGVpZ2h0JywgaW1nSGVpZ2h0KTtcbiAgICAgICRpbWFnZS5jc3MoJ21hcmdpbi1sZWZ0JywgLSBpbWdXaWR0aCAvIDIpO1xuICAgICAgJGltYWdlLmNzcygnbWFyZ2luLXRvcCcsIC0gaW1nSGVpZ2h0IC8gMik7XG4gIFxuICAgICAgLy8gSW1hZ2UgcmVsb2FkaW5nIGZvciBhbiBoaWdoIHF1YWxpdHkgb2YgdGh1bWJuYWlsc1xuICAgICAgdmFyIGltYWdlU3JjID0gJGltYWdlLmF0dHIoJ3NyYycpO1xuICAgICAgdmFyIG5ld0ltYWdlU3JjID0gdGhpcy5uZXdTcmMoaW1hZ2VTcmMsIGltZ1dpZHRoLCBpbWdIZWlnaHQsICRpbWFnZVswXSk7XG4gIFxuICAgICAgJGltYWdlLm9uZSgnZXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICRpbWFnZS5hdHRyKCdzcmMnLCAkaW1hZ2UuZGF0YSgnamcub3JpZ2luYWxTcmMnKSk7IC8vcmV2ZXJ0IHRvIHRoZSBvcmlnaW5hbCB0aHVtYm5haWwsIHdlIGdvdCBpdC5cbiAgICAgIH0pO1xuICBcbiAgICAgIHZhciBsb2FkTmV3SW1hZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpbWFnZVNyYyAhPT0gbmV3SW1hZ2VTcmMpIHsgLy9sb2FkIHRoZSBuZXcgaW1hZ2UgYWZ0ZXIgdGhlIGZhZGVJblxuICAgICAgICAgICRpbWFnZS5hdHRyKCdzcmMnLCBuZXdJbWFnZVNyYyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gIFxuICAgICAgaWYgKCRlbnRyeS5kYXRhKCdqZy5sb2FkZWQnKSA9PT0gJ3NraXBwZWQnKSB7XG4gICAgICAgIHRoaXMub25JbWFnZUV2ZW50KGltYWdlU3JjLCAkLnByb3h5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHRoaXMuc2hvd0ltZygkZW50cnksIGxvYWROZXdJbWFnZSk7XG4gICAgICAgICAgJGVudHJ5LmRhdGEoJ2pnLmxvYWRlZCcsIHRydWUpO1xuICAgICAgICB9LCB0aGlzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNob3dJbWcoJGVudHJ5LCBsb2FkTmV3SW1hZ2UpO1xuICAgICAgfVxuICBcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93SW1nKCRlbnRyeSk7XG4gICAgfVxuICBcbiAgICB0aGlzLmRpc3BsYXlFbnRyeUNhcHRpb24oJGVudHJ5KTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBEaXNwbGF5IHRoZSBlbnRyeSBjYXB0aW9uLiBJZiB0aGUgY2FwdGlvbiBlbGVtZW50IGRvZXNuJ3QgZXhpc3RzLCBpdCBjcmVhdGVzIHRoZSBjYXB0aW9uIHVzaW5nIHRoZSAnYWx0J1xuICAgKiBvciB0aGUgJ3RpdGxlJyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge2pRdWVyeX0gJGVudHJ5IHRoZSBlbnRyeSB0byBwcm9jZXNzXG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5kaXNwbGF5RW50cnlDYXB0aW9uID0gZnVuY3Rpb24gKCRlbnRyeSkge1xuICAgIHZhciAkaW1hZ2UgPSB0aGlzLmltZ0Zyb21FbnRyeSgkZW50cnkpO1xuICAgIGlmICgkaW1hZ2UgIT09IG51bGwgJiYgdGhpcy5zZXR0aW5ncy5jYXB0aW9ucykge1xuICAgICAgdmFyICRpbWdDYXB0aW9uID0gdGhpcy5jYXB0aW9uRnJvbUVudHJ5KCRlbnRyeSk7XG4gIFxuICAgICAgLy8gQ3JlYXRlIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3RzXG4gICAgICBpZiAoJGltZ0NhcHRpb24gPT09IG51bGwpIHtcbiAgICAgICAgdmFyIGNhcHRpb24gPSAkaW1hZ2UuYXR0cignYWx0Jyk7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkQ2FwdGlvbihjYXB0aW9uKSkgY2FwdGlvbiA9ICRlbnRyeS5hdHRyKCd0aXRsZScpO1xuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkQ2FwdGlvbihjYXB0aW9uKSkgeyAvLyBDcmVhdGUgb25seSB3ZSBmb3VuZCBzb21ldGhpbmdcbiAgICAgICAgICAkaW1nQ2FwdGlvbiA9ICQoJzxkaXYgY2xhc3M9XCJjYXB0aW9uXCI+JyArIGNhcHRpb24gKyAnPC9kaXY+Jyk7XG4gICAgICAgICAgJGVudHJ5LmFwcGVuZCgkaW1nQ2FwdGlvbik7XG4gICAgICAgICAgJGVudHJ5LmRhdGEoJ2pnLmNyZWF0ZWRDYXB0aW9uJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgXG4gICAgICAvLyBDcmVhdGUgZXZlbnRzICh3ZSBjaGVjayBhZ2FpbiB0aGUgJGltZ0NhcHRpb24gYmVjYXVzZSBpdCBjYW4gYmUgc3RpbGwgaW5leGlzdGVudClcbiAgICAgIGlmICgkaW1nQ2FwdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MuY3NzQW5pbWF0aW9uKSAkaW1nQ2FwdGlvbi5zdG9wKCkuZmFkZVRvKDAsIHRoaXMuc2V0dGluZ3MuY2FwdGlvblNldHRpbmdzLm5vblZpc2libGVPcGFjaXR5KTtcbiAgICAgICAgdGhpcy5hZGRDYXB0aW9uRXZlbnRzSGFuZGxlcnMoJGVudHJ5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVDYXB0aW9uRXZlbnRzSGFuZGxlcnMoJGVudHJ5KTtcbiAgICB9XG4gIH07XG4gIFxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBjYXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBjYXB0aW9uIFRoZSBjYXB0aW9uIHRoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZFxuICAgKiBAcmV0dXJuIHtib29sZWFufSBWYWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgSnVzdGlmaWVkR2FsbGVyeS5wcm90b3R5cGUuaXNWYWxpZENhcHRpb24gPSBmdW5jdGlvbiAoY2FwdGlvbikge1xuICAgIHJldHVybiAodHlwZW9mIGNhcHRpb24gIT09ICd1bmRlZmluZWQnICYmIGNhcHRpb24ubGVuZ3RoID4gMCk7XG4gIH07XG4gIFxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIGZvciB0aGUgZXZlbnQgJ21vdXNlZW50ZXInLiBJdCBhc3N1bWVzIHRoYXQgdGhlIGV2ZW50IGN1cnJlbnRUYXJnZXQgaXMgYW4gZW50cnkuXG4gICAqIEl0IHNob3dzIHRoZSBjYXB0aW9uIHVzaW5nIGpRdWVyeSAob3IgdXNpbmcgQ1NTIGlmIGl0IGlzIGNvbmZpZ3VyZWQgc28pXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50T2JqZWN0IHRoZSBldmVudCBvYmplY3RcbiAgICovXG4gIEp1c3RpZmllZEdhbGxlcnkucHJvdG90eXBlLm9uRW50cnlNb3VzZUVudGVyRm9yQ2FwdGlvbiA9IGZ1bmN0aW9uIChldmVudE9iamVjdCkge1xuICAgIHZhciAkY2FwdGlvbiA9IHRoaXMuY2FwdGlvbkZyb21FbnRyeSgkKGV2ZW50T2JqZWN0LmN1cnJlbnRUYXJnZXQpKTtcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5jc3NBbmltYXRpb24pIHtcbiAgICAgICRjYXB0aW9uLmFkZENsYXNzKCdjYXB0aW9uLXZpc2libGUnKS5yZW1vdmVDbGFzcygnY2FwdGlvbi1oaWRkZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgJGNhcHRpb24uc3RvcCgpLmZhZGVUbyh0aGlzLnNldHRpbmdzLmNhcHRpb25TZXR0aW5ncy5hbmltYXRpb25EdXJhdGlvbixcbiAgICAgICAgICB0aGlzLnNldHRpbmdzLmNhcHRpb25TZXR0aW5ncy52aXNpYmxlT3BhY2l0eSk7XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIFRoZSBjYWxsYmFjayBmb3IgdGhlIGV2ZW50ICdtb3VzZWxlYXZlJy4gSXQgYXNzdW1lcyB0aGF0IHRoZSBldmVudCBjdXJyZW50VGFyZ2V0IGlzIGFuIGVudHJ5LlxuICAgKiBJdCBoaWRlcyB0aGUgY2FwdGlvbiB1c2luZyBqUXVlcnkgKG9yIHVzaW5nIENTUyBpZiBpdCBpcyBjb25maWd1cmVkIHNvKVxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudE9iamVjdCB0aGUgZXZlbnQgb2JqZWN0XG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5vbkVudHJ5TW91c2VMZWF2ZUZvckNhcHRpb24gPSBmdW5jdGlvbiAoZXZlbnRPYmplY3QpIHtcbiAgICB2YXIgJGNhcHRpb24gPSB0aGlzLmNhcHRpb25Gcm9tRW50cnkoJChldmVudE9iamVjdC5jdXJyZW50VGFyZ2V0KSk7XG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuY3NzQW5pbWF0aW9uKSB7XG4gICAgICAkY2FwdGlvbi5yZW1vdmVDbGFzcygnY2FwdGlvbi12aXNpYmxlJykucmVtb3ZlQ2xhc3MoJ2NhcHRpb24taGlkZGVuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRjYXB0aW9uLnN0b3AoKS5mYWRlVG8odGhpcy5zZXR0aW5ncy5jYXB0aW9uU2V0dGluZ3MuYW5pbWF0aW9uRHVyYXRpb24sXG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy5jYXB0aW9uU2V0dGluZ3Mubm9uVmlzaWJsZU9wYWNpdHkpO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBBZGQgdGhlIGhhbmRsZXJzIG9mIHRoZSBlbnRyeSBmb3IgdGhlIGNhcHRpb25cbiAgICpcbiAgICogQHBhcmFtICRlbnRyeSB0aGUgZW50cnkgdG8gbW9kaWZ5XG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5hZGRDYXB0aW9uRXZlbnRzSGFuZGxlcnMgPSBmdW5jdGlvbiAoJGVudHJ5KSB7XG4gICAgdmFyIGNhcHRpb25Nb3VzZUV2ZW50cyA9ICRlbnRyeS5kYXRhKCdqZy5jYXB0aW9uTW91c2VFdmVudHMnKTtcbiAgICBpZiAodHlwZW9mIGNhcHRpb25Nb3VzZUV2ZW50cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNhcHRpb25Nb3VzZUV2ZW50cyA9IHtcbiAgICAgICAgbW91c2VlbnRlcjogJC5wcm94eSh0aGlzLm9uRW50cnlNb3VzZUVudGVyRm9yQ2FwdGlvbiwgdGhpcyksXG4gICAgICAgIG1vdXNlbGVhdmU6ICQucHJveHkodGhpcy5vbkVudHJ5TW91c2VMZWF2ZUZvckNhcHRpb24sIHRoaXMpXG4gICAgICB9O1xuICAgICAgJGVudHJ5Lm9uKCdtb3VzZWVudGVyJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNhcHRpb25Nb3VzZUV2ZW50cy5tb3VzZWVudGVyKTtcbiAgICAgICRlbnRyeS5vbignbW91c2VsZWF2ZScsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjYXB0aW9uTW91c2VFdmVudHMubW91c2VsZWF2ZSk7XG4gICAgICAkZW50cnkuZGF0YSgnamcuY2FwdGlvbk1vdXNlRXZlbnRzJywgY2FwdGlvbk1vdXNlRXZlbnRzKTtcbiAgICB9XG4gIH07XG4gIFxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBoYW5kbGVycyBvZiB0aGUgZW50cnkgZm9yIHRoZSBjYXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSAkZW50cnkgdGhlIGVudHJ5IHRvIG1vZGlmeVxuICAgKi9cbiAgSnVzdGlmaWVkR2FsbGVyeS5wcm90b3R5cGUucmVtb3ZlQ2FwdGlvbkV2ZW50c0hhbmRsZXJzID0gZnVuY3Rpb24gKCRlbnRyeSkge1xuICAgIHZhciBjYXB0aW9uTW91c2VFdmVudHMgPSAkZW50cnkuZGF0YSgnamcuY2FwdGlvbk1vdXNlRXZlbnRzJyk7XG4gICAgaWYgKHR5cGVvZiBjYXB0aW9uTW91c2VFdmVudHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAkZW50cnkub2ZmKCdtb3VzZWVudGVyJywgdW5kZWZpbmVkLCBjYXB0aW9uTW91c2VFdmVudHMubW91c2VlbnRlcik7XG4gICAgICAkZW50cnkub2ZmKCdtb3VzZWxlYXZlJywgdW5kZWZpbmVkLCBjYXB0aW9uTW91c2VFdmVudHMubW91c2VsZWF2ZSk7XG4gICAgICAkZW50cnkucmVtb3ZlRGF0YSgnamcuY2FwdGlvbk1vdXNlRXZlbnRzJyk7XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIENsZWFyIHRoZSBidWlsZGluZyByb3cgZGF0YSB0byBiZSB1c2VkIGZvciBhIG5ldyByb3dcbiAgICovXG4gIEp1c3RpZmllZEdhbGxlcnkucHJvdG90eXBlLmNsZWFyQnVpbGRpbmdSb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5idWlsZGluZ1Jvdy5lbnRyaWVzQnVmZiA9IFtdO1xuICAgIHRoaXMuYnVpbGRpbmdSb3cuYXNwZWN0UmF0aW8gPSAwO1xuICAgIHRoaXMuYnVpbGRpbmdSb3cud2lkdGggPSAwO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEp1c3RpZnkgdGhlIGJ1aWxkaW5nIHJvdywgcHJlcGFyaW5nIGl0IHRvXG4gICAqXG4gICAqIEBwYXJhbSBpc0xhc3RSb3dcbiAgICogQHJldHVybnMgYSBib29sZWFuIHRvIGtub3cgaWYgdGhlIHJvdyBoYXMgYmVlbiBqdXN0aWZpZWQgb3Igbm90XG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5wcmVwYXJlQnVpbGRpbmdSb3cgPSBmdW5jdGlvbiAoaXNMYXN0Um93KSB7XG4gICAgdmFyIGksICRlbnRyeSwgaW1nQXNwZWN0UmF0aW8sIG5ld0ltZ1csIG5ld0ltZ0gsIGp1c3RpZnkgPSB0cnVlO1xuICAgIHZhciBtaW5IZWlnaHQgPSAwO1xuICAgIHZhciBhdmFpbGFibGVXaWR0aCA9IHRoaXMuZ2FsbGVyeVdpZHRoIC0gMiAqIHRoaXMuYm9yZGVyIC0gKFxuICAgICAgICAodGhpcy5idWlsZGluZ1Jvdy5lbnRyaWVzQnVmZi5sZW5ndGggLSAxKSAqIHRoaXMuc2V0dGluZ3MubWFyZ2lucyk7XG4gICAgdmFyIHJvd0hlaWdodCA9IGF2YWlsYWJsZVdpZHRoIC8gdGhpcy5idWlsZGluZ1Jvdy5hc3BlY3RSYXRpbztcbiAgICB2YXIgZGVmYXVsdFJvd0hlaWdodCA9IHRoaXMuc2V0dGluZ3Mucm93SGVpZ2h0O1xuICAgIHZhciBqdXN0aWZpYWJsZSA9IHRoaXMuYnVpbGRpbmdSb3cud2lkdGggLyBhdmFpbGFibGVXaWR0aCA+IHRoaXMuc2V0dGluZ3MuanVzdGlmeVRocmVzaG9sZDtcbiAgXG4gICAgLy9Ta2lwIHRoZSBsYXN0IHJvdyBpZiB3ZSBjYW4ndCBqdXN0aWZ5IGl0IGFuZCB0aGUgbGFzdFJvdyA9PSAnaGlkZSdcbiAgICBpZiAoaXNMYXN0Um93ICYmIHRoaXMuc2V0dGluZ3MubGFzdFJvdyA9PT0gJ2hpZGUnICYmICFqdXN0aWZpYWJsZSkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYnVpbGRpbmdSb3cuZW50cmllc0J1ZmYubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgJGVudHJ5ID0gdGhpcy5idWlsZGluZ1Jvdy5lbnRyaWVzQnVmZltpXTtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuY3NzQW5pbWF0aW9uKVxuICAgICAgICAgICRlbnRyeS5yZW1vdmVDbGFzcygnZW50cnktdmlzaWJsZScpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAkZW50cnkuc3RvcCgpLmZhZGVUbygwLCAwLjEpO1xuICAgICAgICAgICRlbnRyeS5maW5kKCc+IGltZywgPiBhID4gaW1nJykuZmFkZVRvKDAsIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICBcbiAgICAvLyBXaXRoIGxhc3RSb3cgPSBub2p1c3RpZnksIGp1c3RpZnkgaWYgaXMganVzdGlmaWNhYmxlICh0aGUgaW1hZ2VzIHdpbGwgbm90IGJlY29tZSB0b28gYmlnKVxuICAgIGlmIChpc0xhc3RSb3cgJiYgIWp1c3RpZmlhYmxlICYmIHRoaXMuc2V0dGluZ3MubGFzdFJvdyAhPT0gJ2p1c3RpZnknICYmIHRoaXMuc2V0dGluZ3MubGFzdFJvdyAhPT0gJ2hpZGUnKSB7XG4gICAgICBqdXN0aWZ5ID0gZmFsc2U7XG4gIFxuICAgICAgaWYgKHRoaXMucm93cyA+IDApIHtcbiAgICAgICAgZGVmYXVsdFJvd0hlaWdodCA9ICh0aGlzLm9mZlkgLSB0aGlzLmJvcmRlciAtIHRoaXMuc2V0dGluZ3MubWFyZ2lucyAqIHRoaXMucm93cykgLyB0aGlzLnJvd3M7XG4gICAgICAgIGp1c3RpZnkgPSBkZWZhdWx0Um93SGVpZ2h0ICogdGhpcy5idWlsZGluZ1Jvdy5hc3BlY3RSYXRpbyAvIGF2YWlsYWJsZVdpZHRoID4gdGhpcy5zZXR0aW5ncy5qdXN0aWZ5VGhyZXNob2xkO1xuICAgICAgfVxuICAgIH1cbiAgXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYnVpbGRpbmdSb3cuZW50cmllc0J1ZmYubGVuZ3RoOyBpKyspIHtcbiAgICAgICRlbnRyeSA9IHRoaXMuYnVpbGRpbmdSb3cuZW50cmllc0J1ZmZbaV07XG4gICAgICBpbWdBc3BlY3RSYXRpbyA9ICRlbnRyeS5kYXRhKCdqZy53aWR0aCcpIC8gJGVudHJ5LmRhdGEoJ2pnLmhlaWdodCcpO1xuICBcbiAgICAgIGlmIChqdXN0aWZ5KSB7XG4gICAgICAgIG5ld0ltZ1cgPSAoaSA9PT0gdGhpcy5idWlsZGluZ1Jvdy5lbnRyaWVzQnVmZi5sZW5ndGggLSAxKSA/IGF2YWlsYWJsZVdpZHRoIDogcm93SGVpZ2h0ICogaW1nQXNwZWN0UmF0aW87XG4gICAgICAgIG5ld0ltZ0ggPSByb3dIZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdJbWdXID0gZGVmYXVsdFJvd0hlaWdodCAqIGltZ0FzcGVjdFJhdGlvO1xuICAgICAgICBuZXdJbWdIID0gZGVmYXVsdFJvd0hlaWdodDtcbiAgICAgIH1cbiAgXG4gICAgICBhdmFpbGFibGVXaWR0aCAtPSBNYXRoLnJvdW5kKG5ld0ltZ1cpO1xuICAgICAgJGVudHJ5LmRhdGEoJ2pnLmp3aWR0aCcsIE1hdGgucm91bmQobmV3SW1nVykpO1xuICAgICAgJGVudHJ5LmRhdGEoJ2pnLmpoZWlnaHQnLCBNYXRoLmNlaWwobmV3SW1nSCkpO1xuICAgICAgaWYgKGkgPT09IDAgfHwgbWluSGVpZ2h0ID4gbmV3SW1nSCkgbWluSGVpZ2h0ID0gbmV3SW1nSDtcbiAgICB9XG4gIFxuICAgIHRoaXMuYnVpbGRpbmdSb3cuaGVpZ2h0ID0gbWluSGVpZ2h0O1xuICAgIHJldHVybiBqdXN0aWZ5O1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEZsdXNoIGEgcm93OiBqdXN0aWZ5IGl0LCBtb2RpZnkgdGhlIGdhbGxlcnkgaGVpZ2h0IGFjY29yZGluZ2x5IHRvIHRoZSByb3cgaGVpZ2h0XG4gICAqXG4gICAqIEBwYXJhbSBpc0xhc3RSb3dcbiAgICovXG4gIEp1c3RpZmllZEdhbGxlcnkucHJvdG90eXBlLmZsdXNoUm93ID0gZnVuY3Rpb24gKGlzTGFzdFJvdykge1xuICAgIHZhciBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3M7XG4gICAgdmFyICRlbnRyeSwgYnVpbGRpbmdSb3dSZXMsIG9mZlggPSB0aGlzLmJvcmRlciwgaTtcbiAgXG4gICAgYnVpbGRpbmdSb3dSZXMgPSB0aGlzLnByZXBhcmVCdWlsZGluZ1Jvdyhpc0xhc3RSb3cpO1xuICAgIGlmIChpc0xhc3RSb3cgJiYgc2V0dGluZ3MubGFzdFJvdyA9PT0gJ2hpZGUnICYmIGJ1aWxkaW5nUm93UmVzID09PSAtMSkge1xuICAgICAgdGhpcy5jbGVhckJ1aWxkaW5nUm93KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICBcbiAgICBpZih0aGlzLm1heFJvd0hlaWdodCkge1xuICAgICAgaWYodGhpcy5tYXhSb3dIZWlnaHQgPCB0aGlzLmJ1aWxkaW5nUm93LmhlaWdodCkgIHRoaXMuYnVpbGRpbmdSb3cuaGVpZ2h0ID0gdGhpcy5tYXhSb3dIZWlnaHQ7XG4gICAgfVxuICBcbiAgICAvL0FsaWduIGxhc3QgKHVuanVzdGlmaWVkKSByb3dcbiAgICBpZiAoaXNMYXN0Um93ICYmIChzZXR0aW5ncy5sYXN0Um93ID09PSAnY2VudGVyJyB8fCBzZXR0aW5ncy5sYXN0Um93ID09PSAncmlnaHQnKSkge1xuICAgICAgdmFyIGF2YWlsYWJsZVdpZHRoID0gdGhpcy5nYWxsZXJ5V2lkdGggLSAyICogdGhpcy5ib3JkZXIgLSAodGhpcy5idWlsZGluZ1Jvdy5lbnRyaWVzQnVmZi5sZW5ndGggLSAxKSAqIHNldHRpbmdzLm1hcmdpbnM7XG4gIFxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYnVpbGRpbmdSb3cuZW50cmllc0J1ZmYubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgJGVudHJ5ID0gdGhpcy5idWlsZGluZ1Jvdy5lbnRyaWVzQnVmZltpXTtcbiAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gJGVudHJ5LmRhdGEoJ2pnLmp3aWR0aCcpO1xuICAgICAgfVxuICBcbiAgICAgIGlmIChzZXR0aW5ncy5sYXN0Um93ID09PSAnY2VudGVyJylcbiAgICAgICAgb2ZmWCArPSBhdmFpbGFibGVXaWR0aCAvIDI7XG4gICAgICBlbHNlIGlmIChzZXR0aW5ncy5sYXN0Um93ID09PSAncmlnaHQnKVxuICAgICAgICBvZmZYICs9IGF2YWlsYWJsZVdpZHRoO1xuICAgIH1cbiAgXG4gICAgdmFyIGxhc3RFbnRyeUlkeCA9IHRoaXMuYnVpbGRpbmdSb3cuZW50cmllc0J1ZmYubGVuZ3RoIC0gMTtcbiAgICBmb3IgKGkgPSAwOyBpIDw9IGxhc3RFbnRyeUlkeDsgaSsrKSB7XG4gICAgICAkZW50cnkgPSB0aGlzLmJ1aWxkaW5nUm93LmVudHJpZXNCdWZmWyB0aGlzLnNldHRpbmdzLnJ0bCA/IGxhc3RFbnRyeUlkeCAtIGkgOiBpIF07XG4gICAgICB0aGlzLmRpc3BsYXlFbnRyeSgkZW50cnksIG9mZlgsIHRoaXMub2ZmWSwgJGVudHJ5LmRhdGEoJ2pnLmp3aWR0aCcpLCAkZW50cnkuZGF0YSgnamcuamhlaWdodCcpLCB0aGlzLmJ1aWxkaW5nUm93LmhlaWdodCk7XG4gICAgICBvZmZYICs9ICRlbnRyeS5kYXRhKCdqZy5qd2lkdGgnKSArIHNldHRpbmdzLm1hcmdpbnM7XG4gICAgfVxuICBcbiAgICAvL0dhbGxlcnkgSGVpZ2h0XG4gICAgdGhpcy5nYWxsZXJ5SGVpZ2h0VG9TZXQgPSB0aGlzLm9mZlkgKyB0aGlzLmJ1aWxkaW5nUm93LmhlaWdodCArIHRoaXMuYm9yZGVyO1xuICAgIHRoaXMuc2V0R2FsbGVyeVRlbXBIZWlnaHQodGhpcy5nYWxsZXJ5SGVpZ2h0VG9TZXQgKyB0aGlzLmdldFNwaW5uZXJIZWlnaHQoKSk7XG4gIFxuICAgIGlmICghaXNMYXN0Um93IHx8ICh0aGlzLmJ1aWxkaW5nUm93LmhlaWdodCA8PSBzZXR0aW5ncy5yb3dIZWlnaHQgJiYgYnVpbGRpbmdSb3dSZXMpKSB7XG4gICAgICAvL1JlYWR5IGZvciBhIG5ldyByb3dcbiAgICAgIHRoaXMub2ZmWSArPSB0aGlzLmJ1aWxkaW5nUm93LmhlaWdodCArIHNldHRpbmdzLm1hcmdpbnM7XG4gICAgICB0aGlzLnJvd3MgKz0gMTtcbiAgICAgIHRoaXMuY2xlYXJCdWlsZGluZ1JvdygpO1xuICAgICAgdGhpcy5zZXR0aW5ncy50cmlnZ2VyRXZlbnQuY2FsbCh0aGlzLCAnamcucm93Zmx1c2gnKTtcbiAgICB9XG4gIH07XG4gIFxuICBcbiAgLy8gU2Nyb2xsIHBvc2l0aW9uIG5vdCByZXN0b3Jpbmc6IGh0dHBzOi8vZ2l0aHViLmNvbS9taXJvbWFubmluby9KdXN0aWZpZWQtR2FsbGVyeS9pc3N1ZXMvMjIxXG4gIHZhciBnYWxsZXJ5UHJldlN0YXRpY0hlaWdodCA9IDA7XG4gIFxuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5yZW1lbWJlckdhbGxlcnlIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgZ2FsbGVyeVByZXZTdGF0aWNIZWlnaHQgPSB0aGlzLiRnYWxsZXJ5LmhlaWdodCgpO1xuICAgIHRoaXMuJGdhbGxlcnkuaGVpZ2h0KGdhbGxlcnlQcmV2U3RhdGljSGVpZ2h0KTtcbiAgfTtcbiAgXG4gIC8vIGdyb3cgb25seVxuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5zZXRHYWxsZXJ5VGVtcEhlaWdodCA9IGZ1bmN0aW9uIChoZWlnaHQpIHtcbiAgICBnYWxsZXJ5UHJldlN0YXRpY0hlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgZ2FsbGVyeVByZXZTdGF0aWNIZWlnaHQpO1xuICAgIHRoaXMuJGdhbGxlcnkuaGVpZ2h0KGdhbGxlcnlQcmV2U3RhdGljSGVpZ2h0KTtcbiAgfTtcbiAgXG4gIEp1c3RpZmllZEdhbGxlcnkucHJvdG90eXBlLnNldEdhbGxlcnlGaW5hbEhlaWdodCA9IGZ1bmN0aW9uIChoZWlnaHQpIHtcbiAgICBnYWxsZXJ5UHJldlN0YXRpY0hlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLiRnYWxsZXJ5LmhlaWdodChoZWlnaHQpO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBhIGJvb2xlYW4gc2F5aW5nIGlmIHRoZSBzY3JvbGxiYXIgaXMgYWN0aXZlIG9yIG5vdFxuICAgKi9cbiAgZnVuY3Rpb24gaGFzU2Nyb2xsQmFyKCkge1xuICAgIHJldHVybiAkKFwiYm9keVwiKS5oZWlnaHQoKSA+ICQod2luZG93KS5oZWlnaHQoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrcyB0aGUgd2lkdGggb2YgdGhlIGdhbGxlcnkgY29udGFpbmVyLCB0byBrbm93IGlmIGEgbmV3IGp1c3RpZmljYXRpb24gaXMgbmVlZGVkXG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5jaGVja1dpZHRoID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuY2hlY2tXaWR0aEludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgkLnByb3h5KGZ1bmN0aW9uICgpIHtcbiAgXG4gICAgICAvLyBpZiB0aGUgZ2FsbGVyeSBpcyBub3QgY3VycmVudGx5IHZpc2libGUsIGFib3J0LlxuICAgICAgaWYgKCF0aGlzLiRnYWxsZXJ5LmlzKFwiOnZpc2libGVcIikpIHJldHVybjtcbiAgXG4gICAgICB2YXIgZ2FsbGVyeVdpZHRoID0gcGFyc2VGbG9hdCh0aGlzLiRnYWxsZXJ5LndpZHRoKCkpO1xuICAgICAgaWYgKGhhc1Njcm9sbEJhcigpID09PSB0aGlzLnNjcm9sbEJhck9uKSB7XG4gICAgICAgIGlmIChNYXRoLmFicyhnYWxsZXJ5V2lkdGggLSB0aGlzLmdhbGxlcnlXaWR0aCkgPiB0aGlzLnNldHRpbmdzLnJlZnJlc2hTZW5zaXRpdml0eSkge1xuICAgICAgICAgIHRoaXMuZ2FsbGVyeVdpZHRoID0gZ2FsbGVyeVdpZHRoO1xuICAgICAgICAgIHRoaXMucmV3aW5kKCk7XG4gIFxuICAgICAgICAgIHRoaXMucmVtZW1iZXJHYWxsZXJ5SGVpZ2h0KCk7XG4gIFxuICAgICAgICAgIC8vIFJlc3RhcnQgdG8gYW5hbHl6ZVxuICAgICAgICAgIHRoaXMuc3RhcnRJbWdBbmFseXplcih0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zY3JvbGxCYXJPbiA9IGhhc1Njcm9sbEJhcigpO1xuICAgICAgICB0aGlzLmdhbGxlcnlXaWR0aCA9IGdhbGxlcnlXaWR0aDtcbiAgICAgIH1cbiAgICB9LCB0aGlzKSwgdGhpcy5zZXR0aW5ncy5yZWZyZXNoVGltZSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGEgYm9vbGVhbiBzYXlpbmcgaWYgdGhlIHNwaW5uZXIgaXMgYWN0aXZlIG9yIG5vdFxuICAgKi9cbiAgSnVzdGlmaWVkR2FsbGVyeS5wcm90b3R5cGUuaXNTcGlubmVyQWN0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNwaW5uZXIuaW50ZXJ2YWxJZCAhPT0gbnVsbDtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7aW50fSB0aGUgc3Bpbm5lciBoZWlnaHRcbiAgICovXG4gIEp1c3RpZmllZEdhbGxlcnkucHJvdG90eXBlLmdldFNwaW5uZXJIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3Bpbm5lci4kZWwuaW5uZXJIZWlnaHQoKTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgc3Bpbm5lciBhbmltYXRpb24gYW5kIG1vZGlmeSB0aGUgZ2FsbGVyeSBoZWlnaHQgdG8gZXhjbHVkZSB0aGUgc3Bpbm5lclxuICAgKi9cbiAgSnVzdGlmaWVkR2FsbGVyeS5wcm90b3R5cGUuc3RvcExvYWRpbmdTcGlubmVyQW5pbWF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zcGlubmVyLmludGVydmFsSWQpO1xuICAgIHRoaXMuc3Bpbm5lci5pbnRlcnZhbElkID0gbnVsbDtcbiAgICB0aGlzLnNldEdhbGxlcnlUZW1wSGVpZ2h0KHRoaXMuJGdhbGxlcnkuaGVpZ2h0KCkgLSB0aGlzLmdldFNwaW5uZXJIZWlnaHQoKSk7XG4gICAgdGhpcy5zcGlubmVyLiRlbC5kZXRhY2goKTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHNwaW5uZXIgYW5pbWF0aW9uXG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5zdGFydExvYWRpbmdTcGlubmVyQW5pbWF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzcGlubmVyQ29udGV4dCA9IHRoaXMuc3Bpbm5lcjtcbiAgICB2YXIgJHNwaW5uZXJQb2ludHMgPSBzcGlubmVyQ29udGV4dC4kZWwuZmluZCgnc3BhbicpO1xuICAgIGNsZWFySW50ZXJ2YWwoc3Bpbm5lckNvbnRleHQuaW50ZXJ2YWxJZCk7XG4gICAgdGhpcy4kZ2FsbGVyeS5hcHBlbmQoc3Bpbm5lckNvbnRleHQuJGVsKTtcbiAgICB0aGlzLnNldEdhbGxlcnlUZW1wSGVpZ2h0KHRoaXMub2ZmWSArIHRoaXMuYnVpbGRpbmdSb3cuaGVpZ2h0ICsgdGhpcy5nZXRTcGlubmVySGVpZ2h0KCkpO1xuICAgIHNwaW5uZXJDb250ZXh0LmludGVydmFsSWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc3Bpbm5lckNvbnRleHQucGhhc2UgPCAkc3Bpbm5lclBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgJHNwaW5uZXJQb2ludHMuZXEoc3Bpbm5lckNvbnRleHQucGhhc2UpLmZhZGVUbyhzcGlubmVyQ29udGV4dC50aW1lU2xvdCwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkc3Bpbm5lclBvaW50cy5lcShzcGlubmVyQ29udGV4dC5waGFzZSAtICRzcGlubmVyUG9pbnRzLmxlbmd0aCkuZmFkZVRvKHNwaW5uZXJDb250ZXh0LnRpbWVTbG90LCAwKTtcbiAgICAgIH1cbiAgICAgIHNwaW5uZXJDb250ZXh0LnBoYXNlID0gKHNwaW5uZXJDb250ZXh0LnBoYXNlICsgMSkgJSAoJHNwaW5uZXJQb2ludHMubGVuZ3RoICogMik7XG4gICAgfSwgc3Bpbm5lckNvbnRleHQudGltZVNsb3QpO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFJld2luZCB0aGUgaW1hZ2UgYW5hbHlzaXMgdG8gc3RhcnQgZnJvbSB0aGUgZmlyc3QgZW50cnkuXG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5yZXdpbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5sYXN0RmV0Y2hlZEVudHJ5ID0gbnVsbDtcbiAgICB0aGlzLmxhc3RBbmFseXplZEluZGV4ID0gLTE7XG4gICAgdGhpcy5vZmZZID0gdGhpcy5ib3JkZXI7XG4gICAgdGhpcy5yb3dzID0gMDtcbiAgICB0aGlzLmNsZWFyQnVpbGRpbmdSb3coKTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGVudHJpZXMgc2VhcmNoaW5nIGl0IGZyb20gdGhlIGp1c3RpZmllZCBnYWxsZXJ5IEhUTUwgZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0gbm9yZXdpbmQgaWYgbm9yZXdpbmQgb25seSB0aGUgbmV3IGVudHJpZXMgd2lsbCBiZSBjaGFuZ2VkIChpLmUuIHJhbmRvbWl6ZWQsIHNvcnRlZCBvciBmaWx0ZXJlZClcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgc29tZSBlbnRyaWVzIGhhcyBiZWVuIGZvdW5kZWRcbiAgICovXG4gIEp1c3RpZmllZEdhbGxlcnkucHJvdG90eXBlLnVwZGF0ZUVudHJpZXMgPSBmdW5jdGlvbiAobm9yZXdpbmQpIHtcbiAgICB2YXIgbmV3RW50cmllcztcbiAgXG4gICAgaWYgKG5vcmV3aW5kICYmIHRoaXMubGFzdEZldGNoZWRFbnRyeSAhPSBudWxsKSB7XG4gICAgICBuZXdFbnRyaWVzID0gJCh0aGlzLmxhc3RGZXRjaGVkRW50cnkpLm5leHRBbGwodGhpcy5zZXR0aW5ncy5zZWxlY3RvcikudG9BcnJheSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVudHJpZXMgPSBbXTtcbiAgICAgIG5ld0VudHJpZXMgPSB0aGlzLiRnYWxsZXJ5LmNoaWxkcmVuKHRoaXMuc2V0dGluZ3Muc2VsZWN0b3IpLnRvQXJyYXkoKTtcbiAgICB9XG4gIFxuICAgIGlmIChuZXdFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgXG4gICAgICAvLyBTb3J0IG9yIHJhbmRvbWl6ZVxuICAgICAgaWYgKCQuaXNGdW5jdGlvbih0aGlzLnNldHRpbmdzLnNvcnQpKSB7XG4gICAgICAgIG5ld0VudHJpZXMgPSB0aGlzLnNvcnRBcnJheShuZXdFbnRyaWVzKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXR0aW5ncy5yYW5kb21pemUpIHtcbiAgICAgICAgbmV3RW50cmllcyA9IHRoaXMuc2h1ZmZsZUFycmF5KG5ld0VudHJpZXMpO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0RmV0Y2hlZEVudHJ5ID0gbmV3RW50cmllc1tuZXdFbnRyaWVzLmxlbmd0aCAtIDFdO1xuICBcbiAgICAgIC8vIEZpbHRlclxuICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuZmlsdGVyKSB7XG4gICAgICAgIG5ld0VudHJpZXMgPSB0aGlzLmZpbHRlckFycmF5KG5ld0VudHJpZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZXNldEZpbHRlcnMobmV3RW50cmllcyk7XG4gICAgICB9XG4gIFxuICAgIH1cbiAgXG4gICAgdGhpcy5lbnRyaWVzID0gdGhpcy5lbnRyaWVzLmNvbmNhdChuZXdFbnRyaWVzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBBcHBseSB0aGUgZW50cmllcyBvcmRlciB0byB0aGUgRE9NLCBpdGVyYXRpbmcgdGhlIGVudHJpZXMgYW5kIGFwcGVuZGluZyB0aGUgaW1hZ2VzXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyaWVzIHRoZSBlbnRyaWVzIHRoYXQgaGFzIGJlZW4gbW9kaWZpZWQgYW5kIHRoYXQgbXVzdCBiZSByZS1vcmRlcmVkIGluIHRoZSBET01cbiAgICovXG4gIEp1c3RpZmllZEdhbGxlcnkucHJvdG90eXBlLmluc2VydFRvR2FsbGVyeSA9IGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICQuZWFjaChlbnRyaWVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKHRoaXMpLmFwcGVuZFRvKHRoYXQuJGdhbGxlcnkpO1xuICAgIH0pO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFNodWZmbGUgdGhlIGFycmF5IHVzaW5nIHRoZSBGaXNoZXItWWF0ZXMgc2h1ZmZsZSBhbGdvcml0aG1cbiAgICpcbiAgICogQHBhcmFtIGEgdGhlIGFycmF5IHRvIHNodWZmbGVcbiAgICogQHJldHVybiB0aGUgc2h1ZmZsZWQgYXJyYXlcbiAgICovXG4gIEp1c3RpZmllZEdhbGxlcnkucHJvdG90eXBlLnNodWZmbGVBcnJheSA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIGksIGosIHRlbXA7XG4gICAgZm9yIChpID0gYS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICB0ZW1wID0gYVtpXTtcbiAgICAgIGFbaV0gPSBhW2pdO1xuICAgICAgYVtqXSA9IHRlbXA7XG4gICAgfVxuICAgIHRoaXMuaW5zZXJ0VG9HYWxsZXJ5KGEpO1xuICAgIHJldHVybiBhO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFNvcnQgdGhlIGFycmF5IHVzaW5nIHNldHRpbmdzLmNvbXBhcmF0b3IgYXMgY29tcGFyYXRvclxuICAgKlxuICAgKiBAcGFyYW0gYSB0aGUgYXJyYXkgdG8gc29ydCAoaXQgaXMgc29ydGVkKVxuICAgKiBAcmV0dXJuIHRoZSBzb3J0ZWQgYXJyYXlcbiAgICovXG4gIEp1c3RpZmllZEdhbGxlcnkucHJvdG90eXBlLnNvcnRBcnJheSA9IGZ1bmN0aW9uIChhKSB7XG4gICAgYS5zb3J0KHRoaXMuc2V0dGluZ3Muc29ydCk7XG4gICAgdGhpcy5pbnNlcnRUb0dhbGxlcnkoYSk7XG4gICAgcmV0dXJuIGE7XG4gIH07XG4gIFxuICAvKipcbiAgICogUmVzZXQgdGhlIGZpbHRlcnMgcmVtb3ZpbmcgdGhlICdqZy1maWx0ZXJlZCcgY2xhc3MgZnJvbSBhbGwgdGhlIGVudHJpZXNcbiAgICpcbiAgICogQHBhcmFtIGEgdGhlIGFycmF5IHRvIHJlc2V0XG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5yZXNldEZpbHRlcnMgPSBmdW5jdGlvbiAoYSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgJChhW2ldKS5yZW1vdmVDbGFzcygnamctZmlsdGVyZWQnKTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBGaWx0ZXIgdGhlIGVudHJpZXMgY29uc2lkZXJpbmcgdGhlaXJzIGNsYXNzZXMgKGlmIGEgc3RyaW5nIGhhcyBiZWVuIHBhc3NlZCkgb3IgdXNpbmcgYSBmdW5jdGlvbiBmb3IgZmlsdGVyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gYSB0aGUgYXJyYXkgdG8gZmlsdGVyXG4gICAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIGFycmF5XG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5maWx0ZXJBcnJheSA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncztcbiAgICBpZiAoJC50eXBlKHNldHRpbmdzLmZpbHRlcikgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBGaWx0ZXIgb25seSBrZWVwaW5nIHRoZSBlbnRyaWVzIHBhc3NlZCBpbiB0aGUgc3RyaW5nXG4gICAgICByZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIHZhciAkZWwgPSAkKGVsKTtcbiAgICAgICAgaWYgKCRlbC5pcyhzZXR0aW5ncy5maWx0ZXIpKSB7XG4gICAgICAgICAgJGVsLnJlbW92ZUNsYXNzKCdqZy1maWx0ZXJlZCcpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRlbC5hZGRDbGFzcygnamctZmlsdGVyZWQnKS5yZW1vdmVDbGFzcygnamctdmlzaWJsZScpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICgkLmlzRnVuY3Rpb24oc2V0dGluZ3MuZmlsdGVyKSkge1xuICAgICAgLy8gRmlsdGVyIHVzaW5nIHRoZSBwYXNzZWQgZnVuY3Rpb25cbiAgICAgIHZhciBmaWx0ZXJlZEFyciA9IGEuZmlsdGVyKHNldHRpbmdzLmZpbHRlcik7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGZpbHRlcmVkQXJyLmluZGV4T2YoYVtpXSkgPT09IC0xKSB7XG4gICAgICAgICAgJChhW2ldKS5hZGRDbGFzcygnamctZmlsdGVyZWQnKS5yZW1vdmVDbGFzcygnamctdmlzaWJsZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICQoYVtpXSkucmVtb3ZlQ2xhc3MoJ2pnLWZpbHRlcmVkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmaWx0ZXJlZEFycjtcbiAgICB9XG4gIH07XG4gIFxuICAvKipcbiAgICogRGVzdHJveSB0aGUgSnVzdGlmaWVkIEdhbGxlcnkgaW5zdGFuY2UuXG4gICAqXG4gICAqIEl0IGNsZWFycyBhbGwgdGhlIGNzcyBwcm9wZXJ0aWVzIGFkZGVkIGluIHRoZSBzdHlsZSBhdHRyaWJ1dGVzLiBXZSBkb2Vzbid0IGJhY2t1cCB0aGUgb3JpZ2luYWxcbiAgICogdmFsdWVzIGZvciB0aG9zZSBjc3MgYXR0cmlidXRlcywgYmVjYXVzZSBpdCBjb3N0cyAocGVyZm9ybWFuY2UpIGFuZCBiZWNhdXNlIGluIGdlbmVyYWwgb25lXG4gICAqIHNob3VsZG4ndCB1c2UgdGhlIHN0eWxlIGF0dHJpYnV0ZSBmb3IgYW4gdW5pZm9ybSBzZXQgb2YgaW1hZ2VzICh3aGVyZSB3ZSBzdXBwb3NlIHRoZSB1c2Ugb2ZcbiAgICogY2xhc3NlcykuIENyZWF0aW5nIGEgYmFja3VwIGlzIGFsc28gZGlmZmljdWx0IGJlY2F1c2UgSkcgY291bGQgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFuZFxuICAgKiB3aXRoIGRpZmZlcmVudCBzdHlsZSBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgSnVzdGlmaWVkR2FsbGVyeS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjbGVhckludGVydmFsKHRoaXMuY2hlY2tXaWR0aEludGVydmFsSWQpO1xuICBcbiAgICAkLmVhY2godGhpcy5lbnRyaWVzLCAkLnByb3h5KGZ1bmN0aW9uKF8sIGVudHJ5KSB7XG4gICAgICB2YXIgJGVudHJ5ID0gJChlbnRyeSk7XG4gIFxuICAgICAgLy8gUmVzZXQgZW50cnkgc3R5bGVcbiAgICAgICRlbnRyeS5jc3MoJ3dpZHRoJywgJycpO1xuICAgICAgJGVudHJ5LmNzcygnaGVpZ2h0JywgJycpO1xuICAgICAgJGVudHJ5LmNzcygndG9wJywgJycpO1xuICAgICAgJGVudHJ5LmNzcygnbGVmdCcsICcnKTtcbiAgICAgICRlbnRyeS5kYXRhKCdqZy5sb2FkZWQnLCB1bmRlZmluZWQpO1xuICAgICAgJGVudHJ5LnJlbW92ZUNsYXNzKCdqZy1lbnRyeScpO1xuICBcbiAgICAgIC8vIFJlc2V0IGltYWdlIHN0eWxlXG4gICAgICB2YXIgJGltZyA9IHRoaXMuaW1nRnJvbUVudHJ5KCRlbnRyeSk7XG4gICAgICAkaW1nLmNzcygnd2lkdGgnLCAnJyk7XG4gICAgICAkaW1nLmNzcygnaGVpZ2h0JywgJycpO1xuICAgICAgJGltZy5jc3MoJ21hcmdpbi1sZWZ0JywgJycpO1xuICAgICAgJGltZy5jc3MoJ21hcmdpbi10b3AnLCAnJyk7XG4gICAgICAkaW1nLmF0dHIoJ3NyYycsICRpbWcuZGF0YSgnamcub3JpZ2luYWxTcmMnKSk7XG4gICAgICAkaW1nLmRhdGEoJ2pnLm9yaWdpbmFsU3JjJywgdW5kZWZpbmVkKTtcbiAgXG4gICAgICAvLyBSZW1vdmUgY2FwdGlvblxuICAgICAgdGhpcy5yZW1vdmVDYXB0aW9uRXZlbnRzSGFuZGxlcnMoJGVudHJ5KTtcbiAgICAgIHZhciAkY2FwdGlvbiA9IHRoaXMuY2FwdGlvbkZyb21FbnRyeSgkZW50cnkpO1xuICAgICAgaWYgKCRlbnRyeS5kYXRhKCdqZy5jcmVhdGVkQ2FwdGlvbicpKSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbHNvIHRoZSBjYXB0aW9uIGVsZW1lbnQgKGlmIGNyZWF0ZWQgYnkgamcpXG4gICAgICAgICRlbnRyeS5kYXRhKCdqZy5jcmVhdGVkQ2FwdGlvbicsIHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICgkY2FwdGlvbiAhPT0gbnVsbCkgJGNhcHRpb24ucmVtb3ZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoJGNhcHRpb24gIT09IG51bGwpICRjYXB0aW9uLmZhZGVUbygwLCAxKTtcbiAgICAgIH1cbiAgXG4gICAgfSwgdGhpcykpO1xuICBcbiAgICB0aGlzLiRnYWxsZXJ5LmNzcygnaGVpZ2h0JywgJycpO1xuICAgIHRoaXMuJGdhbGxlcnkucmVtb3ZlQ2xhc3MoJ2p1c3RpZmllZC1nYWxsZXJ5Jyk7XG4gICAgdGhpcy4kZ2FsbGVyeS5kYXRhKCdqZy5jb250cm9sbGVyJywgdW5kZWZpbmVkKTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBBbmFseXplIHRoZSBpbWFnZXMgYW5kIGJ1aWxkcyB0aGUgcm93cy4gSXQgcmV0dXJucyBpZiBpdCBmb3VuZCBhbiBpbWFnZSB0aGF0IGlzIG5vdCBsb2FkZWQuXG4gICAqXG4gICAqIEBwYXJhbSBpc0ZvclJlc2l6ZSBpZiB0aGUgaW1hZ2UgYW5hbHl6ZXIgaXMgY2FsbGVkIGZvciByZXNpemluZyBvciBub3QsIHRvIGNhbGwgYSBkaWZmZXJlbnQgY2FsbGJhY2sgYXQgdGhlIGVuZFxuICAgKi9cbiAgSnVzdGlmaWVkR2FsbGVyeS5wcm90b3R5cGUuYW5hbHl6ZUltYWdlcyA9IGZ1bmN0aW9uIChpc0ZvclJlc2l6ZSkge1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxhc3RBbmFseXplZEluZGV4ICsgMTsgaSA8IHRoaXMuZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyICRlbnRyeSA9ICQodGhpcy5lbnRyaWVzW2ldKTtcbiAgICAgIGlmICgkZW50cnkuZGF0YSgnamcubG9hZGVkJykgPT09IHRydWUgfHwgJGVudHJ5LmRhdGEoJ2pnLmxvYWRlZCcpID09PSAnc2tpcHBlZCcpIHtcbiAgICAgICAgdmFyIGF2YWlsYWJsZVdpZHRoID0gdGhpcy5nYWxsZXJ5V2lkdGggLSAyICogdGhpcy5ib3JkZXIgLSAoXG4gICAgICAgICAgICAodGhpcy5idWlsZGluZ1Jvdy5lbnRyaWVzQnVmZi5sZW5ndGggLSAxKSAqIHRoaXMuc2V0dGluZ3MubWFyZ2lucyk7XG4gICAgICAgIHZhciBpbWdBc3BlY3RSYXRpbyA9ICRlbnRyeS5kYXRhKCdqZy53aWR0aCcpIC8gJGVudHJ5LmRhdGEoJ2pnLmhlaWdodCcpO1xuICAgICAgICBpZiAoYXZhaWxhYmxlV2lkdGggLyAodGhpcy5idWlsZGluZ1Jvdy5hc3BlY3RSYXRpbyArIGltZ0FzcGVjdFJhdGlvKSA8IHRoaXMuc2V0dGluZ3Mucm93SGVpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5mbHVzaFJvdyhmYWxzZSk7XG4gIFxuICAgICAgICAgIGlmKCsrdGhpcy55aWVsZC5mbHVzaGVkID49IHRoaXMueWllbGQuZXZlcnkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRJbWdBbmFseXplcihpc0ZvclJlc2l6ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gIFxuICAgICAgICB0aGlzLmJ1aWxkaW5nUm93LmVudHJpZXNCdWZmLnB1c2goJGVudHJ5KTtcbiAgICAgICAgdGhpcy5idWlsZGluZ1Jvdy5hc3BlY3RSYXRpbyArPSBpbWdBc3BlY3RSYXRpbztcbiAgICAgICAgdGhpcy5idWlsZGluZ1Jvdy53aWR0aCArPSBpbWdBc3BlY3RSYXRpbyAqIHRoaXMuc2V0dGluZ3Mucm93SGVpZ2h0O1xuICAgICAgICB0aGlzLmxhc3RBbmFseXplZEluZGV4ID0gaTtcbiAgXG4gICAgICB9IGVsc2UgaWYgKCRlbnRyeS5kYXRhKCdqZy5sb2FkZWQnKSAhPT0gJ2Vycm9yJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICBcbiAgICAvLyBMYXN0IHJvdyBmbHVzaCAodGhlIHJvdyBpcyBub3QgZnVsbClcbiAgICBpZiAodGhpcy5idWlsZGluZ1Jvdy5lbnRyaWVzQnVmZi5sZW5ndGggPiAwKSB0aGlzLmZsdXNoUm93KHRydWUpO1xuICBcbiAgICBpZiAodGhpcy5pc1NwaW5uZXJBY3RpdmUoKSkge1xuICAgICAgdGhpcy5zdG9wTG9hZGluZ1NwaW5uZXJBbmltYXRpb24oKTtcbiAgICB9XG4gIFxuICAgIC8qIFN0b3AsIGlmIHRoZXJlIGlzLCB0aGUgdGltZW91dCB0byBzdGFydCB0aGUgYW5hbHl6ZUltYWdlcy5cbiAgICAgVGhpcyBpcyBiZWNhdXNlIGFuIGltYWdlIGNhbiBiZSBzZXQgbG9hZGVkLCBhbmQgdGhlIHRpbWVvdXQgY2FuIGJlIHNldCxcbiAgICAgYnV0IHRoaXMgaW1hZ2UgY2FuIGJlIGFuYWx5emVkIHlldC5cbiAgICAgKi9cbiAgICB0aGlzLnN0b3BJbWdBbmFseXplclN0YXJ0ZXIoKTtcbiAgXG4gICAgLy9PbiBjb21wbGV0ZSBjYWxsYmFja1xuICAgIHRoaXMuc2V0dGluZ3MudHJpZ2dlckV2ZW50LmNhbGwodGhpcywgaXNGb3JSZXNpemUgPyAnamcucmVzaXplJyA6ICdqZy5jb21wbGV0ZScpO1xuICAgIHRoaXMuc2V0R2FsbGVyeUZpbmFsSGVpZ2h0KHRoaXMuZ2FsbGVyeUhlaWdodFRvU2V0KTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBTdG9wcyBhbnkgSW1nQW5hbHl6ZXIgc3RhcnRlciAodGhhdCBoYXMgYW4gYXNzaWduZWQgdGltZW91dClcbiAgICovXG4gIEp1c3RpZmllZEdhbGxlcnkucHJvdG90eXBlLnN0b3BJbWdBbmFseXplclN0YXJ0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy55aWVsZC5mbHVzaGVkID0gMDtcbiAgICBpZiAodGhpcy5pbWdBbmFseXplclRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmltZ0FuYWx5emVyVGltZW91dCk7XG4gICAgICB0aGlzLmltZ0FuYWx5emVyVGltZW91dCA9IG51bGw7XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgaW1hZ2UgYW5hbHl6ZXIuIEl0IGlzIG5vdCBpbW1lZGlhdGVseSBjYWxsZWQgdG8gbGV0IHRoZSBicm93c2VyIHRvIHVwZGF0ZSB0aGUgdmlld1xuICAgKlxuICAgKiBAcGFyYW0gaXNGb3JSZXNpemUgc3BlY2lmaWVzIGlmIHRoZSBpbWFnZSBhbmFseXplciBtdXN0IGJlIGNhbGxlZCBmb3IgcmVzaXppbmcgb3Igbm90XG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5zdGFydEltZ0FuYWx5emVyID0gZnVuY3Rpb24gKGlzRm9yUmVzaXplKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgIHRoaXMuc3RvcEltZ0FuYWx5emVyU3RhcnRlcigpO1xuICAgIHRoaXMuaW1nQW5hbHl6ZXJUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB0aGF0LmFuYWx5emVJbWFnZXMoaXNGb3JSZXNpemUpO1xuICAgIH0sIDAuMDAxKTsgLy8gd2UgY2FuJ3Qgc3RhcnQgaXQgaW1tZWRpYXRlbHkgZHVlIHRvIGEgSUUgZGlmZmVyZW50IGJlaGF2aW91clxuICB9O1xuICBcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgaW1hZ2UgaXMgbG9hZGVkIG9yIG5vdCB1c2luZyBhbm90aGVyIGltYWdlIG9iamVjdC4gV2UgY2Fubm90IHVzZSB0aGUgJ2NvbXBsZXRlJyBpbWFnZSBwcm9wZXJ0eSxcbiAgICogYmVjYXVzZSBzb21lIGJyb3dzZXJzLCB3aXRoIGEgNDA0IHNldCBjb21wbGV0ZSA9IHRydWUuXG4gICAqXG4gICAqIEBwYXJhbSBpbWFnZVNyYyB0aGUgaW1hZ2Ugc3JjIHRvIGxvYWRcbiAgICogQHBhcmFtIG9uTG9hZCBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBpbWFnZSBoYXMgYmVlbiBsb2FkZWRcbiAgICogQHBhcmFtIG9uRXJyb3IgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgaW4gY2FzZSBvZiBhbiBlcnJvclxuICAgKi9cbiAgSnVzdGlmaWVkR2FsbGVyeS5wcm90b3R5cGUub25JbWFnZUV2ZW50ID0gZnVuY3Rpb24gKGltYWdlU3JjLCBvbkxvYWQsIG9uRXJyb3IpIHtcbiAgICBpZiAoIW9uTG9hZCAmJiAhb25FcnJvcikgcmV0dXJuO1xuICBcbiAgICB2YXIgbWVtSW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICB2YXIgJG1lbUltYWdlID0gJChtZW1JbWFnZSk7XG4gICAgaWYgKG9uTG9hZCkge1xuICAgICAgJG1lbUltYWdlLm9uZSgnbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJG1lbUltYWdlLm9mZignbG9hZCBlcnJvcicpO1xuICAgICAgICBvbkxvYWQobWVtSW1hZ2UpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChvbkVycm9yKSB7XG4gICAgICAkbWVtSW1hZ2Uub25lKCdlcnJvcicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAkbWVtSW1hZ2Uub2ZmKCdsb2FkIGVycm9yJyk7XG4gICAgICAgIG9uRXJyb3IobWVtSW1hZ2UpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIG1lbUltYWdlLnNyYyA9IGltYWdlU3JjO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEluaXQgb2YgSnVzdGlmaWVkIEdhbGxlcnkgY29udHJvbGxlZFxuICAgKiBJdCBhbmFseXplcyBhbGwgdGhlIGVudHJpZXMgc3RhcnRpbmcgdGhlaXJzIGxvYWRpbmcgYW5kIGNhbGxpbmcgdGhlIGltYWdlIGFuYWx5emVyICh0aGF0IHdvcmtzIHdpdGggbG9hZGVkIGltYWdlcylcbiAgICovXG4gIEp1c3RpZmllZEdhbGxlcnkucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGltYWdlc1RvTG9hZCA9IGZhbHNlLCBza2lwcGVkSW1hZ2VzID0gZmFsc2UsIHRoYXQgPSB0aGlzO1xuICAgICQuZWFjaCh0aGlzLmVudHJpZXMsIGZ1bmN0aW9uIChpbmRleCwgZW50cnkpIHtcbiAgICAgIHZhciAkZW50cnkgPSAkKGVudHJ5KTtcbiAgICAgIHZhciAkaW1hZ2UgPSB0aGF0LmltZ0Zyb21FbnRyeSgkZW50cnkpO1xuICBcbiAgICAgICRlbnRyeS5hZGRDbGFzcygnamctZW50cnknKTtcbiAgXG4gICAgICBpZiAoJGVudHJ5LmRhdGEoJ2pnLmxvYWRlZCcpICE9PSB0cnVlICYmICRlbnRyeS5kYXRhKCdqZy5sb2FkZWQnKSAhPT0gJ3NraXBwZWQnKSB7XG4gIFxuICAgICAgICAvLyBMaW5rIFJlbCBnbG9iYWwgb3ZlcndyaXRlXG4gICAgICAgIGlmICh0aGF0LnNldHRpbmdzLnJlbCAhPT0gbnVsbCkgJGVudHJ5LmF0dHIoJ3JlbCcsIHRoYXQuc2V0dGluZ3MucmVsKTtcbiAgXG4gICAgICAgIC8vIExpbmsgVGFyZ2V0IGdsb2JhbCBvdmVyd3JpdGVcbiAgICAgICAgaWYgKHRoYXQuc2V0dGluZ3MudGFyZ2V0ICE9PSBudWxsKSAkZW50cnkuYXR0cigndGFyZ2V0JywgdGhhdC5zZXR0aW5ncy50YXJnZXQpO1xuICBcbiAgICAgICAgaWYgKCRpbWFnZSAhPT0gbnVsbCkge1xuICBcbiAgICAgICAgICAvLyBJbWFnZSBzcmNcbiAgICAgICAgICB2YXIgaW1hZ2VTcmMgPSB0aGF0LmV4dHJhY3RJbWdTcmNGcm9tSW1hZ2UoJGltYWdlKTtcbiAgICAgICAgICAkaW1hZ2UuYXR0cignc3JjJywgaW1hZ2VTcmMpO1xuICBcbiAgICAgICAgICAvKiBJZiB3ZSBoYXZlIHRoZSBoZWlnaHQgYW5kIHRoZSB3aWR0aCwgd2UgZG9uJ3Qgd2FpdCB0aGF0IHRoZSBpbWFnZSBpcyBsb2FkZWQsIGJ1dCB3ZSBzdGFydCBkaXJlY3RseVxuICAgICAgICAgICAqIHdpdGggdGhlIGp1c3RpZmljYXRpb24gKi9cbiAgICAgICAgICBpZiAodGhhdC5zZXR0aW5ncy53YWl0VGh1bWJuYWlsc0xvYWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB2YXIgd2lkdGggPSBwYXJzZUZsb2F0KCRpbWFnZS5wcm9wKCd3aWR0aCcpKTtcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSBwYXJzZUZsb2F0KCRpbWFnZS5wcm9wKCdoZWlnaHQnKSk7XG4gICAgICAgICAgICBpZiAoIWlzTmFOKHdpZHRoKSAmJiAhaXNOYU4oaGVpZ2h0KSkge1xuICAgICAgICAgICAgICAkZW50cnkuZGF0YSgnamcud2lkdGgnLCB3aWR0aCk7XG4gICAgICAgICAgICAgICRlbnRyeS5kYXRhKCdqZy5oZWlnaHQnLCBoZWlnaHQpO1xuICAgICAgICAgICAgICAkZW50cnkuZGF0YSgnamcubG9hZGVkJywgJ3NraXBwZWQnKTtcbiAgICAgICAgICAgICAgc2tpcHBlZEltYWdlcyA9IHRydWU7XG4gICAgICAgICAgICAgIHRoYXQuc3RhcnRJbWdBbmFseXplcihmYWxzZSk7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgXG4gICAgICAgICAgJGVudHJ5LmRhdGEoJ2pnLmxvYWRlZCcsIGZhbHNlKTtcbiAgICAgICAgICBpbWFnZXNUb0xvYWQgPSB0cnVlO1xuICBcbiAgICAgICAgICAvLyBTcGlubmVyIHN0YXJ0XG4gICAgICAgICAgaWYgKCF0aGF0LmlzU3Bpbm5lckFjdGl2ZSgpKSB0aGF0LnN0YXJ0TG9hZGluZ1NwaW5uZXJBbmltYXRpb24oKTtcbiAgXG4gICAgICAgICAgdGhhdC5vbkltYWdlRXZlbnQoaW1hZ2VTcmMsIGZ1bmN0aW9uIChsb2FkSW1nKSB7IC8vIGltYWdlIGxvYWRlZFxuICAgICAgICAgICAgJGVudHJ5LmRhdGEoJ2pnLndpZHRoJywgbG9hZEltZy53aWR0aCk7XG4gICAgICAgICAgICAkZW50cnkuZGF0YSgnamcuaGVpZ2h0JywgbG9hZEltZy5oZWlnaHQpO1xuICAgICAgICAgICAgJGVudHJ5LmRhdGEoJ2pnLmxvYWRlZCcsIHRydWUpO1xuICAgICAgICAgICAgdGhhdC5zdGFydEltZ0FuYWx5emVyKGZhbHNlKTtcbiAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7IC8vIGltYWdlIGxvYWQgZXJyb3JcbiAgICAgICAgICAgICRlbnRyeS5kYXRhKCdqZy5sb2FkZWQnLCAnZXJyb3InKTtcbiAgICAgICAgICAgIHRoYXQuc3RhcnRJbWdBbmFseXplcihmYWxzZSk7XG4gICAgICAgICAgfSk7XG4gIFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRlbnRyeS5kYXRhKCdqZy5sb2FkZWQnLCB0cnVlKTtcbiAgICAgICAgICAkZW50cnkuZGF0YSgnamcud2lkdGgnLCAkZW50cnkud2lkdGgoKSB8IHBhcnNlRmxvYXQoJGVudHJ5LmNzcygnd2lkdGgnKSkgfCAxKTtcbiAgICAgICAgICAkZW50cnkuZGF0YSgnamcuaGVpZ2h0JywgJGVudHJ5LmhlaWdodCgpIHwgcGFyc2VGbG9hdCgkZW50cnkuY3NzKCdoZWlnaHQnKSkgfCAxKTtcbiAgICAgICAgfVxuICBcbiAgICAgIH1cbiAgXG4gICAgfSk7XG4gIFxuICAgIGlmICghaW1hZ2VzVG9Mb2FkICYmICFza2lwcGVkSW1hZ2VzKSB0aGlzLnN0YXJ0SW1nQW5hbHl6ZXIoZmFsc2UpO1xuICAgIHRoaXMuY2hlY2tXaWR0aCgpO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIENoZWNrcyB0aGF0IGl0IGlzIGEgdmFsaWQgbnVtYmVyLiBJZiBhIHN0cmluZyBpcyBwYXNzZWQgaXQgaXMgY29udmVydGVkIHRvIGEgbnVtYmVyXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5nQ29udGFpbmVyIHRoZSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgc2V0dGluZyAodG8gYWxsb3cgdGhlIGNvbnZlcnNpb24pXG4gICAqIEBwYXJhbSBzZXR0aW5nTmFtZSB0aGUgc2V0dGluZyBuYW1lXG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5jaGVja09yQ29udmVydE51bWJlciA9IGZ1bmN0aW9uIChzZXR0aW5nQ29udGFpbmVyLCBzZXR0aW5nTmFtZSkge1xuICAgIGlmICgkLnR5cGUoc2V0dGluZ0NvbnRhaW5lcltzZXR0aW5nTmFtZV0pID09PSAnc3RyaW5nJykge1xuICAgICAgc2V0dGluZ0NvbnRhaW5lcltzZXR0aW5nTmFtZV0gPSBwYXJzZUZsb2F0KHNldHRpbmdDb250YWluZXJbc2V0dGluZ05hbWVdKTtcbiAgICB9XG4gIFxuICAgIGlmICgkLnR5cGUoc2V0dGluZ0NvbnRhaW5lcltzZXR0aW5nTmFtZV0pID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGlzTmFOKHNldHRpbmdDb250YWluZXJbc2V0dGluZ05hbWVdKSkgdGhyb3cgJ2ludmFsaWQgbnVtYmVyIGZvciAnICsgc2V0dGluZ05hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IHNldHRpbmdOYW1lICsgJyBtdXN0IGJlIGEgbnVtYmVyJztcbiAgICB9XG4gIH07XG4gIFxuICAvKipcbiAgICogQ2hlY2tzIHRoZSBzaXplUmFuZ2VTdWZmaXhlcyBhbmQsIGlmIG5lY2Vzc2FyeSwgY29udmVydHNcbiAgICogaXRzIGtleXMgZnJvbSBzdHJpbmcgKGUuZy4gb2xkIHNldHRpbmdzIHdpdGggJ2x0MTAwJykgdG8gaW50LlxuICAgKi9cbiAgSnVzdGlmaWVkR2FsbGVyeS5wcm90b3R5cGUuY2hlY2tTaXplUmFuZ2VzU3VmZml4ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCQudHlwZSh0aGlzLnNldHRpbmdzLnNpemVSYW5nZVN1ZmZpeGVzKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93ICdzaXplUmFuZ2VTdWZmaXhlcyBtdXN0IGJlIGRlZmluZWQgYW5kIG11c3QgYmUgYW4gb2JqZWN0JztcbiAgICB9XG4gIFxuICAgIHZhciBzdWZmaXhSYW5nZXMgPSBbXTtcbiAgICBmb3IgKHZhciByYW5nZUlkeCBpbiB0aGlzLnNldHRpbmdzLnNpemVSYW5nZVN1ZmZpeGVzKSB7XG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5zaXplUmFuZ2VTdWZmaXhlcy5oYXNPd25Qcm9wZXJ0eShyYW5nZUlkeCkpIHN1ZmZpeFJhbmdlcy5wdXNoKHJhbmdlSWR4KTtcbiAgICB9XG4gIFxuICAgIHZhciBuZXdTaXplUm5nU3VmZml4ZXMgPSB7MDogJyd9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VmZml4UmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoJC50eXBlKHN1ZmZpeFJhbmdlc1tpXSkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIG51bUlkeCA9IHBhcnNlSW50KHN1ZmZpeFJhbmdlc1tpXS5yZXBsYWNlKC9eW2Etel0rLywgJycpLCAxMCk7XG4gICAgICAgICAgbmV3U2l6ZVJuZ1N1ZmZpeGVzW251bUlkeF0gPSB0aGlzLnNldHRpbmdzLnNpemVSYW5nZVN1ZmZpeGVzW3N1ZmZpeFJhbmdlc1tpXV07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aHJvdyAnc2l6ZVJhbmdlU3VmZml4ZXMga2V5cyBtdXN0IGNvbnRhaW5zIGNvcnJlY3QgbnVtYmVycyAoJyArIGUgKyAnKSc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1NpemVSbmdTdWZmaXhlc1tzdWZmaXhSYW5nZXNbaV1dID0gdGhpcy5zZXR0aW5ncy5zaXplUmFuZ2VTdWZmaXhlc1tzdWZmaXhSYW5nZXNbaV1dO1xuICAgICAgfVxuICAgIH1cbiAgXG4gICAgdGhpcy5zZXR0aW5ncy5zaXplUmFuZ2VTdWZmaXhlcyA9IG5ld1NpemVSbmdTdWZmaXhlcztcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBjaGVjayBhbmQgY29udmVydCB0aGUgbWF4Um93SGVpZ2h0IHNldHRpbmdcbiAgICogcmVxdWlyZXMgcm93SGVpZ2h0IHRvIGJlIGFscmVhZHkgc2V0XG4gICAqIFRPRE86IHNob3VsZCBiZSBhbHdheXMgY2FsbGVkIHdoZW4gb25seSByb3dIZWlnaHQgaXMgY2hhbmdlZFxuICAgKiBAcmV0dXJuIG51bWJlciBvciBudWxsXG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS5yZXRyaWV2ZU1heFJvd0hlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmV3TWF4Um93SGVpZ2h0ID0gbnVsbDtcbiAgICB2YXIgcm93SGVpZ2h0ID0gdGhpcy5zZXR0aW5ncy5yb3dIZWlnaHQ7XG4gIFxuICAgIGlmICgkLnR5cGUodGhpcy5zZXR0aW5ncy5tYXhSb3dIZWlnaHQpID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3MubWF4Um93SGVpZ2h0Lm1hdGNoKC9eWzAtOV0rJSQvKSkge1xuICAgICAgICBuZXdNYXhSb3dIZWlnaHQgPSByb3dIZWlnaHQgKiBwYXJzZUZsb2F0KHRoaXMuc2V0dGluZ3MubWF4Um93SGVpZ2h0Lm1hdGNoKC9eKFswLTldKyklJC8pWzFdKSAvIDEwMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld01heFJvd0hlaWdodCA9IHBhcnNlRmxvYXQodGhpcy5zZXR0aW5ncy5tYXhSb3dIZWlnaHQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoJC50eXBlKHRoaXMuc2V0dGluZ3MubWF4Um93SGVpZ2h0KSA9PT0gJ251bWJlcicpIHtcbiAgICAgIG5ld01heFJvd0hlaWdodCA9IHRoaXMuc2V0dGluZ3MubWF4Um93SGVpZ2h0O1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZXR0aW5ncy5tYXhSb3dIZWlnaHQgPT09IGZhbHNlIHx8IHRoaXMuc2V0dGluZ3MubWF4Um93SGVpZ2h0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyAnbWF4Um93SGVpZ2h0IG11c3QgYmUgYSBudW1iZXIgb3IgYSBwZXJjZW50YWdlJztcbiAgICB9XG4gIFxuICAgIC8vIGNoZWNrIGlmIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgbm90IGEgbnVtYmVyXG4gICAgaWYgKGlzTmFOKG5ld01heFJvd0hlaWdodCkpIHRocm93ICdpbnZhbGlkIG51bWJlciBmb3IgbWF4Um93SGVpZ2h0JztcbiAgXG4gICAgLy8gY2hlY2sgdmFsdWVzLCBtYXhSb3dIZWlnaHQgbXVzdCBiZSA+PSByb3dIZWlnaHRcbiAgICBpZiAobmV3TWF4Um93SGVpZ2h0IDwgcm93SGVpZ2h0KSBuZXdNYXhSb3dIZWlnaHQgPSByb3dIZWlnaHQ7XG4gIFxuICAgIHJldHVybiBuZXdNYXhSb3dIZWlnaHQ7XG4gIH07XG4gIFxuICAvKipcbiAgICogQ2hlY2tzIHRoZSBzZXR0aW5nc1xuICAgKi9cbiAgSnVzdGlmaWVkR2FsbGVyeS5wcm90b3R5cGUuY2hlY2tTZXR0aW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmNoZWNrU2l6ZVJhbmdlc1N1ZmZpeGVzKCk7XG4gIFxuICAgIHRoaXMuY2hlY2tPckNvbnZlcnROdW1iZXIodGhpcy5zZXR0aW5ncywgJ3Jvd0hlaWdodCcpO1xuICAgIHRoaXMuY2hlY2tPckNvbnZlcnROdW1iZXIodGhpcy5zZXR0aW5ncywgJ21hcmdpbnMnKTtcbiAgICB0aGlzLmNoZWNrT3JDb252ZXJ0TnVtYmVyKHRoaXMuc2V0dGluZ3MsICdib3JkZXInKTtcbiAgXG4gICAgdmFyIGxhc3RSb3dNb2RlcyA9IFtcbiAgICAgICdqdXN0aWZ5JyxcbiAgICAgICdub2p1c3RpZnknLFxuICAgICAgJ2xlZnQnLFxuICAgICAgJ2NlbnRlcicsXG4gICAgICAncmlnaHQnLFxuICAgICAgJ2hpZGUnXG4gICAgXTtcbiAgICBpZiAobGFzdFJvd01vZGVzLmluZGV4T2YodGhpcy5zZXR0aW5ncy5sYXN0Um93KSA9PT0gLTEpIHtcbiAgICAgIHRocm93ICdsYXN0Um93IG11c3QgYmUgb25lIG9mOiAnICsgbGFzdFJvd01vZGVzLmpvaW4oJywgJyk7XG4gICAgfVxuICBcbiAgICB0aGlzLmNoZWNrT3JDb252ZXJ0TnVtYmVyKHRoaXMuc2V0dGluZ3MsICdqdXN0aWZ5VGhyZXNob2xkJyk7XG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuanVzdGlmeVRocmVzaG9sZCA8IDAgfHwgdGhpcy5zZXR0aW5ncy5qdXN0aWZ5VGhyZXNob2xkID4gMSkge1xuICAgICAgdGhyb3cgJ2p1c3RpZnlUaHJlc2hvbGQgbXVzdCBiZSBpbiB0aGUgaW50ZXJ2YWwgWzAsMV0nO1xuICAgIH1cbiAgICBpZiAoJC50eXBlKHRoaXMuc2V0dGluZ3MuY3NzQW5pbWF0aW9uKSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyAnY3NzQW5pbWF0aW9uIG11c3QgYmUgYSBib29sZWFuJztcbiAgICB9XG4gIFxuICAgIGlmICgkLnR5cGUodGhpcy5zZXR0aW5ncy5jYXB0aW9ucykgIT09ICdib29sZWFuJykgdGhyb3cgJ2NhcHRpb25zIG11c3QgYmUgYSBib29sZWFuJztcbiAgICB0aGlzLmNoZWNrT3JDb252ZXJ0TnVtYmVyKHRoaXMuc2V0dGluZ3MuY2FwdGlvblNldHRpbmdzLCAnYW5pbWF0aW9uRHVyYXRpb24nKTtcbiAgXG4gICAgdGhpcy5jaGVja09yQ29udmVydE51bWJlcih0aGlzLnNldHRpbmdzLmNhcHRpb25TZXR0aW5ncywgJ3Zpc2libGVPcGFjaXR5Jyk7XG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuY2FwdGlvblNldHRpbmdzLnZpc2libGVPcGFjaXR5IDwgMCB8fFxuICAgICAgICB0aGlzLnNldHRpbmdzLmNhcHRpb25TZXR0aW5ncy52aXNpYmxlT3BhY2l0eSA+IDEpIHtcbiAgICAgIHRocm93ICdjYXB0aW9uU2V0dGluZ3MudmlzaWJsZU9wYWNpdHkgbXVzdCBiZSBpbiB0aGUgaW50ZXJ2YWwgWzAsIDFdJztcbiAgICB9XG4gIFxuICAgIHRoaXMuY2hlY2tPckNvbnZlcnROdW1iZXIodGhpcy5zZXR0aW5ncy5jYXB0aW9uU2V0dGluZ3MsICdub25WaXNpYmxlT3BhY2l0eScpO1xuICAgIGlmICh0aGlzLnNldHRpbmdzLmNhcHRpb25TZXR0aW5ncy5ub25WaXNpYmxlT3BhY2l0eSA8IDAgfHxcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5jYXB0aW9uU2V0dGluZ3Mubm9uVmlzaWJsZU9wYWNpdHkgPiAxKSB7XG4gICAgICB0aHJvdyAnY2FwdGlvblNldHRpbmdzLm5vblZpc2libGVPcGFjaXR5IG11c3QgYmUgaW4gdGhlIGludGVydmFsIFswLCAxXSc7XG4gICAgfVxuICBcbiAgICB0aGlzLmNoZWNrT3JDb252ZXJ0TnVtYmVyKHRoaXMuc2V0dGluZ3MsICdpbWFnZXNBbmltYXRpb25EdXJhdGlvbicpO1xuICAgIHRoaXMuY2hlY2tPckNvbnZlcnROdW1iZXIodGhpcy5zZXR0aW5ncywgJ3JlZnJlc2hUaW1lJyk7XG4gICAgdGhpcy5jaGVja09yQ29udmVydE51bWJlcih0aGlzLnNldHRpbmdzLCAncmVmcmVzaFNlbnNpdGl2aXR5Jyk7XG4gICAgaWYgKCQudHlwZSh0aGlzLnNldHRpbmdzLnJhbmRvbWl6ZSkgIT09ICdib29sZWFuJykgdGhyb3cgJ3JhbmRvbWl6ZSBtdXN0IGJlIGEgYm9vbGVhbic7XG4gICAgaWYgKCQudHlwZSh0aGlzLnNldHRpbmdzLnNlbGVjdG9yKSAhPT0gJ3N0cmluZycpIHRocm93ICdzZWxlY3RvciBtdXN0IGJlIGEgc3RyaW5nJztcbiAgXG4gICAgaWYgKHRoaXMuc2V0dGluZ3Muc29ydCAhPT0gZmFsc2UgJiYgISQuaXNGdW5jdGlvbih0aGlzLnNldHRpbmdzLnNvcnQpKSB7XG4gICAgICB0aHJvdyAnc29ydCBtdXN0IGJlIGZhbHNlIG9yIGEgY29tcGFyaXNvbiBmdW5jdGlvbic7XG4gICAgfVxuICBcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5maWx0ZXIgIT09IGZhbHNlICYmICEkLmlzRnVuY3Rpb24odGhpcy5zZXR0aW5ncy5maWx0ZXIpICYmXG4gICAgICAgICQudHlwZSh0aGlzLnNldHRpbmdzLmZpbHRlcikgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyAnZmlsdGVyIG11c3QgYmUgZmFsc2UsIGEgc3RyaW5nIG9yIGEgZmlsdGVyIGZ1bmN0aW9uJztcbiAgICB9XG4gIH07XG4gIFxuICAvKipcbiAgICogSXQgYnJpbmdzIGFsbCB0aGUgaW5kZXhlcyBmcm9tIHRoZSBzaXplUmFuZ2VTdWZmaXhlcyBhbmQgaXQgb3JkZXJzIHRoZW0uIFRoZXkgYXJlIHRoZW4gc29ydGVkIGFuZCByZXR1cm5lZC5cbiAgICogQHJldHVybnMge0FycmF5fSBzb3J0ZWQgc3VmZml4IHJhbmdlc1xuICAgKi9cbiAgSnVzdGlmaWVkR2FsbGVyeS5wcm90b3R5cGUucmV0cmlldmVTdWZmaXhSYW5nZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN1ZmZpeFJhbmdlcyA9IFtdO1xuICAgIGZvciAodmFyIHJhbmdlSWR4IGluIHRoaXMuc2V0dGluZ3Muc2l6ZVJhbmdlU3VmZml4ZXMpIHtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLnNpemVSYW5nZVN1ZmZpeGVzLmhhc093blByb3BlcnR5KHJhbmdlSWR4KSkgc3VmZml4UmFuZ2VzLnB1c2gocGFyc2VJbnQocmFuZ2VJZHgsIDEwKSk7XG4gICAgfVxuICAgIHN1ZmZpeFJhbmdlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID4gYiA/IDEgOiBhIDwgYiA/IC0xIDogMDsgfSk7XG4gICAgcmV0dXJuIHN1ZmZpeFJhbmdlcztcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGV4aXN0aW5nIHNldHRpbmdzIG9ubHkgY2hhbmdpbmcgc29tZSBvZiB0aGVtXG4gICAqXG4gICAqIEBwYXJhbSBuZXdTZXR0aW5ncyB0aGUgbmV3IHNldHRpbmdzIChvciBhIHN1Ymdyb3VwIG9mIHRoZW0pXG4gICAqL1xuICBKdXN0aWZpZWRHYWxsZXJ5LnByb3RvdHlwZS51cGRhdGVTZXR0aW5ncyA9IGZ1bmN0aW9uIChuZXdTZXR0aW5ncykge1xuICAgIC8vIEluIHRoaXMgY2FzZSBKdXN0aWZpZWQgR2FsbGVyeSBoYXMgYmVlbiBjYWxsZWQgYWdhaW4gY2hhbmdpbmcgb25seSBzb21lIG9wdGlvbnNcbiAgICB0aGlzLnNldHRpbmdzID0gJC5leHRlbmQoe30sIHRoaXMuc2V0dGluZ3MsIG5ld1NldHRpbmdzKTtcbiAgICB0aGlzLmNoZWNrU2V0dGluZ3MoKTtcbiAgXG4gICAgLy8gQXMgcmVwb3J0ZWQgaW4gdGhlIHNldHRpbmdzOiBuZWdhdGl2ZSB2YWx1ZSA9IHNhbWUgYXMgbWFyZ2lucywgMCA9IGRpc2FibGVkXG4gICAgdGhpcy5ib3JkZXIgPSB0aGlzLnNldHRpbmdzLmJvcmRlciA+PSAwID8gdGhpcy5zZXR0aW5ncy5ib3JkZXIgOiB0aGlzLnNldHRpbmdzLm1hcmdpbnM7XG4gIFxuICAgIHRoaXMubWF4Um93SGVpZ2h0ID0gdGhpcy5yZXRyaWV2ZU1heFJvd0hlaWdodCgpO1xuICAgIHRoaXMuc3VmZml4UmFuZ2VzID0gdGhpcy5yZXRyaWV2ZVN1ZmZpeFJhbmdlcygpO1xuICB9O1xuICBcbiAgSnVzdGlmaWVkR2FsbGVyeS5wcm90b3R5cGUuZGVmYXVsdHMgPSB7XG4gICAgc2l6ZVJhbmdlU3VmZml4ZXM6IHsgfSwgLyogZS5nLiBGbGlja3IgY29uZmlndXJhdGlvblxuICAgICAgICB7XG4gICAgICAgICAgMTAwOiAnX3QnLCAgLy8gdXNlZCB3aGVuIGxvbmdlc3QgaXMgbGVzcyB0aGFuIDEwMHB4XG4gICAgICAgICAgMjQwOiAnX20nLCAgLy8gdXNlZCB3aGVuIGxvbmdlc3QgaXMgYmV0d2VlbiAxMDFweCBhbmQgMjQwcHhcbiAgICAgICAgICAzMjA6ICdfbicsICAvLyAuLi5cbiAgICAgICAgICA1MDA6ICcnLFxuICAgICAgICAgIDY0MDogJ196JyxcbiAgICAgICAgICAxMDI0OiAnX2InICAvLyB1c2VkIGFzIGVsc2UgY2FzZSBiZWNhdXNlIGl0IGlzIHRoZSBsYXN0XG4gICAgICAgIH1cbiAgICAqL1xuICAgIHRodW1ibmFpbFBhdGg6IHVuZGVmaW5lZCwgLyogSWYgZGVmaW5lZCwgc2l6ZVJhbmdlU3VmZml4ZXMgaXMgbm90IHVzZWQsIGFuZCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZVxuICAgIHBhdGggcmVsYXRpdmUgdG8gYSBzcGVjaWZpYyB0aHVtYm5haWwgc2l6ZS4gVGhlIGZ1bmN0aW9uIHNob3VsZCBhY2NlcHQgcmVzcGVjdGl2ZWx5IHRocmVlIGFyZ3VtZW50czpcbiAgICBjdXJyZW50IHBhdGgsIHdpZHRoIGFuZCBoZWlnaHQgKi9cbiAgICByb3dIZWlnaHQ6IDEyMCwgLy8gcmVxdWlyZWQ/IHJlcXVpcmVkIHRvIGJlID4gMD9cbiAgICBtYXhSb3dIZWlnaHQ6IGZhbHNlLCAvLyBmYWxzZSBvciBuZWdhdGl2ZSB2YWx1ZSB0byBkZWFjdGl2YXRlLiBQb3NpdGl2ZSBudW1iZXIgdG8gZXhwcmVzcyB0aGUgdmFsdWUgaW4gcGl4ZWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RyaW5nICdbMC05XSslJyB0byBleHByZXNzIGluIHBlcmNlbnRhZ2UgKGUuZy4gMzAwJSBtZWFucyB0aGF0IHRoZSByb3cgaGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuJ3QgZXhjZWVkIDMgKiByb3dIZWlnaHQpXG4gICAgbWFyZ2luczogMSxcbiAgICBib3JkZXI6IC0xLCAvLyBuZWdhdGl2ZSB2YWx1ZSA9IHNhbWUgYXMgbWFyZ2lucywgMCA9IGRpc2FibGVkLCBhbnkgb3RoZXIgdmFsdWUgdG8gc2V0IHRoZSBib3JkZXJcbiAgXG4gICAgbGFzdFJvdzogJ25vanVzdGlmeScsIC8vIOKApiB3aGljaCBpcyB0aGUgc2FtZSBhcyAnbGVmdCcsIG9yIGNhbiBiZSAnanVzdGlmeScsICdjZW50ZXInLCAncmlnaHQnIG9yICdoaWRlJ1xuICBcbiAgICBqdXN0aWZ5VGhyZXNob2xkOiAwLjkwLCAvKiBpZiByb3cgd2lkdGggLyBhdmFpbGFibGUgc3BhY2UgPiAwLjkwIGl0IHdpbGwgYmUgYWx3YXlzIGp1c3RpZmllZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChpLmUuIGxhc3RSb3cgc2V0dGluZyBpcyBub3QgY29uc2lkZXJlZCkgKi9cbiAgICB3YWl0VGh1bWJuYWlsc0xvYWQ6IHRydWUsXG4gICAgY2FwdGlvbnM6IHRydWUsXG4gICAgY3NzQW5pbWF0aW9uOiB0cnVlLFxuICAgIGltYWdlc0FuaW1hdGlvbkR1cmF0aW9uOiA1MDAsIC8vIGlnbm9yZWQgd2l0aCBjc3MgYW5pbWF0aW9uc1xuICAgIGNhcHRpb25TZXR0aW5nczogeyAvLyBpZ25vcmVkIHdpdGggY3NzIGFuaW1hdGlvbnNcbiAgICAgIGFuaW1hdGlvbkR1cmF0aW9uOiA1MDAsXG4gICAgICB2aXNpYmxlT3BhY2l0eTogMC43LFxuICAgICAgbm9uVmlzaWJsZU9wYWNpdHk6IDAuMFxuICAgIH0sXG4gICAgcmVsOiBudWxsLCAvLyByZXdyaXRlIHRoZSByZWwgb2YgZWFjaCBhbmFseXplZCBsaW5rc1xuICAgIHRhcmdldDogbnVsbCwgLy8gcmV3cml0ZSB0aGUgdGFyZ2V0IG9mIGFsbCBsaW5rc1xuICAgIGV4dGVuc2lvbjogL1xcLlteLlxcXFwvXSskLywgLy8gcmVnZXhwIHRvIGNhcHR1cmUgdGhlIGV4dGVuc2lvbiBvZiBhbiBpbWFnZVxuICAgIHJlZnJlc2hUaW1lOiAyMDAsIC8vIHRpbWUgaW50ZXJ2YWwgKGluIG1zKSB0byBjaGVjayBpZiB0aGUgcGFnZSBjaGFuZ2VzIGl0cyB3aWR0aFxuICAgIHJlZnJlc2hTZW5zaXRpdml0eTogMCwgLy8gY2hhbmdlIGluIHdpZHRoIGFsbG93ZWQgKGluIHB4KSB3aXRob3V0IHJlLWJ1aWxkaW5nIHRoZSBnYWxsZXJ5XG4gICAgcmFuZG9taXplOiBmYWxzZSxcbiAgICBydGw6IGZhbHNlLCAvLyByaWdodC10by1sZWZ0IG1vZGVcbiAgICBzb3J0OiBmYWxzZSwgLypcbiAgICAgIC0gZmFsc2U6IHRvIGRvIG5vdCBzb3J0XG4gICAgICAtIGZ1bmN0aW9uOiB0byBzb3J0IHRoZW0gdXNpbmcgdGhlIGZ1bmN0aW9uIGFzIGNvbXBhcmF0b3IgKHNlZSBBcnJheS5wcm90b3R5cGUuc29ydCgpKVxuICAgICovXG4gICAgZmlsdGVyOiBmYWxzZSwgLypcbiAgICAgIC0gZmFsc2UsIG51bGwgb3IgdW5kZWZpbmVkOiBmb3IgYSBkaXNhYmxlZCBmaWx0ZXJcbiAgICAgIC0gYSBzdHJpbmc6IGFuIGVudHJ5IGlzIGtlcHQgaWYgZW50cnkuaXMoZmlsdGVyIHN0cmluZykgcmV0dXJucyB0cnVlXG4gICAgICAgICAgICAgICAgICBzZWUgalF1ZXJ5J3MgLmlzKCkgZnVuY3Rpb24gZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb25cbiAgICAgIC0gYSBmdW5jdGlvbjogaW52b2tlZCB3aXRoIGFyZ3VtZW50cyAoZW50cnksIGluZGV4LCBhcnJheSkuIFJldHVybiB0cnVlIHRvIGtlZXAgdGhlIGVudHJ5LCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICAgICAgICAgICAgICAgIEl0IGZvbGxvd3MgdGhlIHNwZWNpZmljYXRpb25zIG9mIHRoZSBBcnJheS5wcm90b3R5cGUuZmlsdGVyKCkgZnVuY3Rpb24gb2YgSmF2YVNjcmlwdC5cbiAgICAqL1xuICAgIHNlbGVjdG9yOiAnYSwgZGl2Om5vdCguc3Bpbm5lciknLCAvLyBUaGUgc2VsZWN0b3IgdGhhdCBpcyB1c2VkIHRvIGtub3cgd2hhdCBhcmUgdGhlIGVudHJpZXMgb2YgdGhlIGdhbGxlcnlcbiAgICBpbWdTZWxlY3RvcjogJz4gaW1nLCA+IGEgPiBpbWcnLCAvLyBUaGUgc2VsZWN0b3IgdGhhdCBpcyB1c2VkIHRvIGtub3cgd2hhdCBhcmUgdGhlIGltYWdlcyBvZiBlYWNoIGVudHJ5XG4gICAgdHJpZ2dlckV2ZW50OiBmdW5jdGlvbiAoZXZlbnQpIHsgLy8gVGhpcyBpcyBjYWxsZWQgdG8gdHJpZ2dlciBldmVudHMsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGNhbGwgJC50cmlnZ2VyXG4gICAgICB0aGlzLiRnYWxsZXJ5LnRyaWdnZXIoZXZlbnQpOyAgLy8gQ29uc2lkZXIgdGhhdCAndGhpcycgaXMgdGhpcyBzZXQgdG8gdGhlIEp1c3RpZmllZEdhbGxlcnkgb2JqZWN0LCBzbyBpdCBjYW5cbiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2Nlc3MgdG8gZmllbGRzIHN1Y2ggYXMgJGdhbGxlcnksIHVzZWZ1bCB0byB0cmlnZ2VyIGV2ZW50cyB3aXRoIGpRdWVyeS5cbiAgfTtcblxuICAvKipcbiAgICogSnVzdGlmaWVkIEdhbGxlcnkgcGx1Z2luIGZvciBqUXVlcnlcbiAgICpcbiAgICogRXZlbnRzXG4gICAqICAtIGpnLmNvbXBsZXRlIDogY2FsbGVkIHdoZW4gYWxsIHRoZSBnYWxsZXJ5IGhhcyBiZWVuIGNyZWF0ZWRcbiAgICogIC0gamcucmVzaXplIDogY2FsbGVkIHdoZW4gdGhlIGdhbGxlcnkgaGFzIGJlZW4gcmVzaXplZFxuICAgKiAgLSBqZy5yb3dmbHVzaCA6IHdoZW4gYSBuZXcgcm93IGFwcGVhcnNcbiAgICpcbiAgICogQHBhcmFtIGFyZyB0aGUgYWN0aW9uIChvciB0aGUgc2V0dGluZ3MpIHBhc3NlZCB3aGVuIHRoZSBwbHVnaW4gaXMgY2FsbGVkXG4gICAqIEByZXR1cm5zIHsqfSB0aGUgb2JqZWN0IGl0c2VsZlxuICAgKi9cbiAgJC5mbi5qdXN0aWZpZWRHYWxsZXJ5ID0gZnVuY3Rpb24gKGFyZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGluZGV4LCBnYWxsZXJ5KSB7XG5cbiAgICAgIHZhciAkZ2FsbGVyeSA9ICQoZ2FsbGVyeSk7XG4gICAgICAkZ2FsbGVyeS5hZGRDbGFzcygnanVzdGlmaWVkLWdhbGxlcnknKTtcblxuICAgICAgdmFyIGNvbnRyb2xsZXIgPSAkZ2FsbGVyeS5kYXRhKCdqZy5jb250cm9sbGVyJyk7XG4gICAgICBpZiAodHlwZW9mIGNvbnRyb2xsZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIENyZWF0ZSBjb250cm9sbGVyIGFuZCBhc3NpZ24gaXQgdG8gdGhlIG9iamVjdCBkYXRhXG4gICAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAndW5kZWZpbmVkJyAmJiBhcmcgIT09IG51bGwgJiYgJC50eXBlKGFyZykgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgaWYgKGFyZyA9PT0gJ2Rlc3Ryb3knKSByZXR1cm47IC8vIEp1c3QgYSBjYWxsIHRvIGFuIHVuZXhpc3Rpbmcgb2JqZWN0XG4gICAgICAgICAgdGhyb3cgJ1RoZSBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdCc7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbGxlciA9IG5ldyBKdXN0aWZpZWRHYWxsZXJ5KCRnYWxsZXJ5LCAkLmV4dGVuZCh7fSwgSnVzdGlmaWVkR2FsbGVyeS5wcm90b3R5cGUuZGVmYXVsdHMsIGFyZykpO1xuICAgICAgICAkZ2FsbGVyeS5kYXRhKCdqZy5jb250cm9sbGVyJywgY29udHJvbGxlcik7XG4gICAgICB9IGVsc2UgaWYgKGFyZyA9PT0gJ25vcmV3aW5kJykge1xuICAgICAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgZG9uJ3QgcmV3aW5kOiB3ZSBhbmFseXplIG9ubHkgdGhlIGxhdGVzdCBpbWFnZXMgKGUuZy4gdG8gY29tcGxldGUgdGhlIGxhc3QgdW5maW5pc2hlZCByb3dcbiAgICAgICAgLy8gLi4uIGxlZnQgdG8gYmUgbW9yZSByZWFkYWJsZVxuICAgICAgfSBlbHNlIGlmIChhcmcgPT09ICdkZXN0cm95Jykge1xuICAgICAgICBjb250cm9sbGVyLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW4gdGhpcyBjYXNlIEp1c3RpZmllZCBHYWxsZXJ5IGhhcyBiZWVuIGNhbGxlZCBhZ2FpbiBjaGFuZ2luZyBvbmx5IHNvbWUgb3B0aW9uc1xuICAgICAgICBjb250cm9sbGVyLnVwZGF0ZVNldHRpbmdzKGFyZyk7XG4gICAgICAgIGNvbnRyb2xsZXIucmV3aW5kKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZW50cmllcyBsaXN0XG4gICAgICBpZiAoIWNvbnRyb2xsZXIudXBkYXRlRW50cmllcyhhcmcgPT09ICdub3Jld2luZCcpKSByZXR1cm47XG5cbiAgICAgIC8vIEluaXQganVzdGlmaWVkIGdhbGxlcnlcbiAgICAgIGNvbnRyb2xsZXIuaW5pdCgpO1xuXG4gICAgfSk7XG4gIH07XG5cbn0pKTsiLCIvLyBpbXBvcnQgJ2p1c3RpZmllZEdhbGxlcnkvZGlzdC9jc3MvanVzdGlmaWVkR2FsbGVyeS5jc3MnO1xuaW1wb3J0ICdqdXN0aWZpZWRHYWxsZXJ5L2Rpc3QvanMvanF1ZXJ5Lmp1c3RpZmllZEdhbGxlcnkuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKXtcbiAgY29uc3QgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xuICBpZiAoISQoJy5qdXN0aWZpZWRHYWxsZXJ5JykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgJCgnLmp1c3RpZmllZEdhbGxlcnknKS5qdXN0aWZpZWRHYWxsZXJ5KHtcbiAgICByb3dIZWlnaHQgOiAyMDAsXG4gICAgbGFzdFJvdyA6ICdub2p1c3RpZnknLFxuICAgIG1hcmdpbnMgOiA2XG4gIH0pO1xuICBjb25zdCBlbHMgPSBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmp1c3RpZmllZEdhbGxlcnkgYScpXVxuXG4gIGVscy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyBldmVudCA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgIGxldCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoJy4vanMvcGhvdG8uanMnKVxuXG4gICAgICBuZXcgbW9kdWxlLmRlZmF1bHQoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qdXN0aWZpZWRHYWxsZXJ5JyksIGV2ZW50LnRhcmdldCApXG4gICAgfSlcbiAgfSlcblxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmV3c0l0ZW0ge1xuXHRjb25zdHJ1Y3RvcigpIHtcblxuXHRcdGlmICggZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5ld3NDYXJkX192aWRlbycpICkge1xuXHRcdFx0aW1wb3J0KCcuL2pzL3ZpZGVvLmpzJylcblx0XHRcdFx0LnRoZW4oIG1vZHVsZSA9PiB7XG5cdFx0XHRcdFx0dGhpcy52aWRlb09wZW5CYWxsID0gbW9kdWxlLmRlZmF1bHQ7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGV2ZW50ID0+IHtcblx0XHRcdGNvbnN0IGNhcmQgPSBldmVudC50YXJnZXQuY2xvc2VzdCgnLm5ld3NDYXJkJyk7XG5cdFx0XHRjb25zdCB7IHRhcmdldCB9ID0gZXZlbnQ7XG5cdFx0XHRpZiAoICFjYXJkICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNsYXNzTGlzdCA9IGNhcmQuY2xhc3NMaXN0O1xuXHRcdFx0Y29uc3QgYWN0aW9uID0gY2FyZC5kYXRhc2V0LmFjdGlvbjtcblxuXHRcdFx0c3dpdGNoICh0cnVlKSB7XG5cdFx0XHRcdGNhc2UgKGFjdGlvbiAmJiBhY3Rpb24gPT0gJ3ZpZGVvJykvKmNsYXNzTGlzdC5jb250YWlucygnbmV3c0NhcmRfX3ZpZGVvJykqLzpcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdHRoaXMudmlkZW8oY2FyZCwgdGFyZ2V0LCBldmVudCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAoYWN0aW9uICYmIGFjdGlvbiA9PSAncGhvdG8nKS8qY2xhc3NMaXN0LmNvbnRhaW5zKCduZXdzQ2FyZF9fcGhvdG8nKSovOlxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0dGhpcy5waG90byhjYXJkLCB0YXJnZXQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIChhY3Rpb24gJiYgYWN0aW9uID09ICdwZGZ2aWV3ZXInKTpcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdHRoaXMucGRmdmlld2VyKGNhcmQsIHRhcmdldCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBjbGFzc0xpc3QuY29udGFpbnMoJ25ld3NDYXJkX19ldmVudCcpOiBicmVhaztcblx0XHRcdFx0Y2FzZSBjbGFzc0xpc3QuY29udGFpbnMoJ25ld3NDYXJkX19hdWRpbycpOiBicmVhaztcblx0XHRcdFx0Y2FzZSBjbGFzc0xpc3QuY29udGFpbnMoJ25ld3NDYXJkX19ib29rJyk6IGJyZWFrO1xuXG5cdFx0XHRcdC8qY2FzZSBjbGFzc0xpc3QuY29udGFpbnMoJ25ld3NDYXJkX19wcmVzZW50YXRpb24nKTpcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdHRoaXMucHJlc2VudGF0aW9uKGNhcmQsIHRhcmdldCk7XG5cdFx0XHRcdFx0YnJlYWs7Ki9cblx0XHRcdFx0LypjYXNlIGNsYXNzTGlzdC5jb250YWlucygnbmV3c0NhcmRfX2luZm9ncmFwaGljcycpOlxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0dGhpcy5pbmZvZ3JhcGhpY3MoY2FyZCwgdGFyZ2V0KTtcblx0XHRcdFx0XHRicmVhazsqL1xuXHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHR9XG5cblx0XHR9KTtcblx0fVxuXG5cblxuXHRhc3luYyBwaG90byhjYXJkLCB0YXJnZXQpIHtcblxuXHRcdGlmICggIXRoaXMuUGhvdG9zQ2Fyb3VzZWwgKSB7XG5cdFx0XHRsZXQgbW9kdWxlID0gIGF3YWl0IGltcG9ydCgnLi9qcy9waG90by5qcycpO1xuXHRcdFx0dGhpcy5QaG90b3NDYXJvdXNlbCA9IG1vZHVsZS5kZWZhdWx0O1xuXHRcdH1cblxuXHRcdG5ldyB0aGlzLlBob3Rvc0Nhcm91c2VsKGNhcmQsIHRhcmdldCk7XG5cdH1cblxuXHRhc3luYyB2aWRlbyhjYXJkLCB0YXJnZXQsIGV2ZW50KSB7XG5cdFx0aWYgKCF0aGlzLnZpZGVvT3BlbkJhbGwpIHJldHVybjtcblxuXHRcdG5ldyB0aGlzLnZpZGVvT3BlbkJhbGwoY2FyZCwgdGFyZ2V0LCBldmVudCk7XG5cblx0fVxuXG5cdGFzeW5jIHBkZnZpZXdlcihjYXJkLCB0YXJnZXQpIHtcblx0XHRpZiAoICF0aGlzLlBERlZpZXdlciApIHtcblx0XHRcdGxldCBtb2R1bGUgPSAgYXdhaXQgaW1wb3J0KCcuL2pzL1BERlZpZXdlci5qcycpO1xuXHRcdFx0dGhpcy5QREZWaWV3ZXIgPSBtb2R1bGUuZGVmYXVsdDtcblx0XHR9XG5cblx0XHRuZXcgdGhpcy5QREZWaWV3ZXIoY2FyZCwgdGFyZ2V0KTtcblx0fVxuXG5cdC8qXG5cdGFzeW5jIHByZXNlbnRhdGlvbihjYXJkLCB0YXJnZXQpIHtcblx0XHRpZiAoICF0aGlzLlBERlZpZXdlciApIHtcblx0XHRcdGxldCBtb2R1bGUgPSAgYXdhaXQgaW1wb3J0KCcuL2pzL1BERlZpZXdlci5qcycpO1xuXHRcdFx0dGhpcy5QREZWaWV3ZXIgPSBtb2R1bGUuZGVmYXVsdDtcblx0XHR9XG5cblx0XHRuZXcgdGhpcy5QREZWaWV3ZXIoY2FyZCwgdGFyZ2V0KTtcblx0fVxuXHRhc3luYyBpbmZvZ3JhcGhpY3MoY2FyZCwgdGFyZ2V0KSB7XG5cdFx0aWYgKCAhdGhpcy5QREZWaWV3ZXIgKSB7XG5cdFx0XHRsZXQgbW9kdWxlID0gIGF3YWl0IGltcG9ydCgnLi9qcy9QREZWaWV3ZXIuanMnKTtcblx0XHRcdHRoaXMuUERGVmlld2VyID0gbW9kdWxlLmRlZmF1bHQ7XG5cdFx0fVxuXG5cdFx0bmV3IHRoaXMuUERGVmlld2VyKGNhcmQsIHRhcmdldCk7XG5cdH1cblx0Ki9cblxuXHRib29rKCkge1xuXG5cdH1cblxuXG59XG4iLCJjb25zdCBzbGlkZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtc3R5bGU9XCJzbGlkZXJcIl0nKTtcblxuaW1wb3J0IFN3aXBlciBmcm9tICdzd2lwZXIvZGlzdC9qcy9zd2lwZXIuanMnO1xuLy8gaW1wb3J0ICdzd2lwZXIvZGlzdC9jc3Mvc3dpcGVyLmNzcyc7XG5cbmNsYXNzIFNsaWRlcntcbiAgY29uc3RydWN0b3IoIGVsZW1lbnQgKXtcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgbGV0IGludGVybGVhdmVPZmZzZXQgPSAwLjU7XG5cbiAgICB0aGlzLnNsaWRlciA9IG5ldyBTd2lwZXIoZWxlbWVudCx7XG4gICAgICBsb29wOiB0cnVlLFxuICAgICAgc3BlZWQ6NzAwLFxuICAgICAgYXV0b3BsYXk6e1xuICAgICAgICBkZWxheTo1NTAwXG4gICAgICB9LFxuICAgICAgcGFyYWxsYXg6IHRydWUsXG4gICAgICBncmFiQ3Vyc29yOiB0cnVlLFxuICAgICAgd2F0Y2hTbGlkZXNQcm9ncmVzczogdHJ1ZSxcbiAgICAgIG5hdmlnYXRpb246IHtcbiAgICAgICAgbmV4dEVsOiAnLnN3aXBlci1idXR0b24tbmV4dCcsXG4gICAgICAgIHByZXZFbDogJy5zd2lwZXItYnV0dG9uLXByZXYnLFxuICAgICAgfSxcbiAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgZWw6ICcuc3dpcGVyLXBhZ2luYXRpb24nLFxuICAgICAgICB0eXBlOiAnYnVsbGV0cycsXG4gICAgICAgIGNsaWNrYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHRoaXMuc2xpZGVyO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNsaWRlcnMge1xuICBjb25zdHJ1Y3Rvcigpe1xuICAgIHRoaXMuc2xpZGVycyA9IFtdO1xuXG4gICAgW10uZm9yRWFjaC5jYWxsKCBzbGlkZXJzLCAoaXRlbSkgPT4ge1xuICAgICAgdGhpcy5zbGlkZXJzLnB1c2goe1xuICAgICAgICBlbGVtZW50OiBpdGVtLFxuICAgICAgICBzbGlkZXJPYmplY3Q6ICggbmV3IFNsaWRlcihpdGVtKSlcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0U2xpZGVyT2JqZWN0KCBlbGVtZW50ICl7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2xpZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuc2xpZGVyc1tpXS5lbGVtZW50ID09PSBlbGVtZW50KXtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gcmV0dXJuIHt9XG4gICAgICAgIHJldHVybiB0aGlzLnNsaWRlcnNbaV0uc2xpZGVyT2JqZWN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUud2Fybign0J3QsCDRjdGC0L7QvCDRjdC70LXQvNC10L3RgtC1INC90LXRgiDQvtCx0YrQtdC60YLQsCDRgdC70LDQudC00LXRgNCwLicpO1xuICB9XG59XG4iLCJjbGFzcyBDYXJkUHJvZmlsZSB7XHJcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xyXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcclxuICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcclxuXHJcbiAgICBjb25zdCBhY3RpdmVDbGFzcyA9ICdjYXJkUHJvZmlsZV9faXRlbS0tYWN0aXZlJztcclxuICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUpIHtcclxuICAgICAgICBjYXNlICdjbG9zZWQnOiB7XHJcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3MpO1xyXG4gICAgICAgICAgdGhpcy5zdGF0ZSA9ICdvcGVuZWQnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgJ29wZW5lZCc6IHtcclxuICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5jYXJkUHJvZmlsZV9faG92ZXJDbG9zZScpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XHJcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzcyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xyXG4gIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNhcmRQcm9maWxlX19pdGVtLS1ob3ZlcicpO1xyXG4gIEFycmF5LmZyb20oZWxlbWVudHMpXHJcbiAgICAuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICBuZXcgQ2FyZFByb2ZpbGUoZWxlbWVudCk7XHJcbiAgICB9KTtcclxufTtcclxuIiwiLyoqXG4gKiBTaW1wbGUsIGxpZ2h0d2VpZ2h0LCB1c2FibGUgbG9jYWwgYXV0b2NvbXBsZXRlIGxpYnJhcnkgZm9yIG1vZGVybiBicm93c2Vyc1xuICogQmVjYXVzZSB0aGVyZSB3ZXJlbuKAmXQgZW5vdWdoIGF1dG9jb21wbGV0ZSBzY3JpcHRzIGluIHRoZSB3b3JsZD8gQmVjYXVzZSBJ4oCZbSBjb21wbGV0ZWx5IGluc2FuZSBhbmQgaGF2ZSBOSUggc3luZHJvbWU/IFByb2JhYmx5IGJvdGguIDpQXG4gKiBAYXV0aG9yIExlYSBWZXJvdSBodHRwOi8vbGVhdmVyb3UuZ2l0aHViLmlvL2F3ZXNvbXBsZXRlXG4gKiBNSVQgbGljZW5zZVxuICovXG5cbihmdW5jdGlvbiAoKSB7XG5cbnZhciBfID0gZnVuY3Rpb24gKGlucHV0LCBvKSB7XG5cdHZhciBtZSA9IHRoaXM7XG5cblx0Ly8gU2V0dXBcblxuXHR0aGlzLmlzT3BlbmVkID0gZmFsc2U7XG5cblx0dGhpcy5pbnB1dCA9ICQoaW5wdXQpO1xuXHR0aGlzLmlucHV0LnNldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiLCBcIm9mZlwiKTtcblx0dGhpcy5pbnB1dC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImxpc3RcIik7XG5cblx0byA9IG8gfHwge307XG5cblx0Y29uZmlndXJlKHRoaXMsIHtcblx0XHRtaW5DaGFyczogMixcblx0XHRtYXhJdGVtczogMTAsXG5cdFx0YXV0b0ZpcnN0OiBmYWxzZSxcblx0XHRkYXRhOiBfLkRBVEEsXG5cdFx0ZmlsdGVyOiBfLkZJTFRFUl9DT05UQUlOUyxcblx0XHRzb3J0OiBvLnNvcnQgPT09IGZhbHNlID8gZmFsc2UgOiBfLlNPUlRfQllMRU5HVEgsXG5cdFx0aXRlbTogXy5JVEVNLFxuXHRcdHJlcGxhY2U6IF8uUkVQTEFDRVxuXHR9LCBvKTtcblxuXHR0aGlzLmluZGV4ID0gLTE7XG5cblx0Ly8gQ3JlYXRlIG5lY2Vzc2FyeSBlbGVtZW50c1xuXG5cdHRoaXMuY29udGFpbmVyID0gJC5jcmVhdGUoXCJkaXZcIiwge1xuXHRcdGNsYXNzTmFtZTogXCJhd2Vzb21wbGV0ZVwiLFxuXHRcdGFyb3VuZDogaW5wdXRcblx0fSk7XG5cblx0dGhpcy51bCA9ICQuY3JlYXRlKFwidWxcIiwge1xuXHRcdGhpZGRlbjogXCJoaWRkZW5cIixcblx0XHRpbnNpZGU6IHRoaXMuY29udGFpbmVyXG5cdH0pO1xuXG5cdHRoaXMuc3RhdHVzID0gJC5jcmVhdGUoXCJzcGFuXCIsIHtcblx0XHRjbGFzc05hbWU6IFwidmlzdWFsbHktaGlkZGVuXCIsXG5cdFx0cm9sZTogXCJzdGF0dXNcIixcblx0XHRcImFyaWEtbGl2ZVwiOiBcImFzc2VydGl2ZVwiLFxuXHRcdFwiYXJpYS1yZWxldmFudFwiOiBcImFkZGl0aW9uc1wiLFxuXHRcdGluc2lkZTogdGhpcy5jb250YWluZXJcblx0fSk7XG5cblx0Ly8gQmluZCBldmVudHNcblxuXHR0aGlzLl9ldmVudHMgPSB7XG5cdFx0aW5wdXQ6IHtcblx0XHRcdFwiaW5wdXRcIjogdGhpcy5ldmFsdWF0ZS5iaW5kKHRoaXMpLFxuXHRcdFx0XCJibHVyXCI6IHRoaXMuY2xvc2UuYmluZCh0aGlzLCB7IHJlYXNvbjogXCJibHVyXCIgfSksXG5cdFx0XHRcImtleWRvd25cIjogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0XHRcdHZhciBjID0gZXZ0LmtleUNvZGU7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGRyb3Bkb3duIGB1bGAgaXMgaW4gdmlldywgdGhlbiBhY3Qgb24ga2V5ZG93biBmb3IgdGhlIGZvbGxvd2luZyBrZXlzOlxuXHRcdFx0XHQvLyBFbnRlciAvIEVzYyAvIFVwIC8gRG93blxuXHRcdFx0XHRpZihtZS5vcGVuZWQpIHtcblx0XHRcdFx0XHRpZiAoYyA9PT0gMTMgJiYgbWUuc2VsZWN0ZWQpIHsgLy8gRW50ZXJcblx0XHRcdFx0XHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0bWUuc2VsZWN0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgaWYgKGMgPT09IDI3KSB7IC8vIEVzY1xuXHRcdFx0XHRcdFx0bWUuY2xvc2UoeyByZWFzb246IFwiZXNjXCIgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgaWYgKGMgPT09IDM4IHx8IGMgPT09IDQwKSB7IC8vIERvd24vVXAgYXJyb3dcblx0XHRcdFx0XHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0bWVbYyA9PT0gMzg/IFwicHJldmlvdXNcIiA6IFwibmV4dFwiXSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Zm9ybToge1xuXHRcdFx0XCJzdWJtaXRcIjogdGhpcy5jbG9zZS5iaW5kKHRoaXMsIHsgcmVhc29uOiBcInN1Ym1pdFwiIH0pXG5cdFx0fSxcblx0XHR1bDoge1xuXHRcdFx0XCJtb3VzZWRvd25cIjogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0XHRcdHZhciBsaSA9IGV2dC50YXJnZXQ7XG5cblx0XHRcdFx0aWYgKGxpICE9PSB0aGlzKSB7XG5cblx0XHRcdFx0XHR3aGlsZSAobGkgJiYgIS9saS9pLnRlc3QobGkubm9kZU5hbWUpKSB7XG5cdFx0XHRcdFx0XHRsaSA9IGxpLnBhcmVudE5vZGU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGxpICYmIGV2dC5idXR0b24gPT09IDApIHsgIC8vIE9ubHkgc2VsZWN0IG9uIGxlZnQgY2xpY2tcblx0XHRcdFx0XHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0bWUuc2VsZWN0KGxpLCBldnQudGFyZ2V0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0JC5iaW5kKHRoaXMuaW5wdXQsIHRoaXMuX2V2ZW50cy5pbnB1dCk7XG5cdCQuYmluZCh0aGlzLmlucHV0LmZvcm0sIHRoaXMuX2V2ZW50cy5mb3JtKTtcblx0JC5iaW5kKHRoaXMudWwsIHRoaXMuX2V2ZW50cy51bCk7XG5cblx0aWYgKHRoaXMuaW5wdXQuaGFzQXR0cmlidXRlKFwibGlzdFwiKSkge1xuXHRcdHRoaXMubGlzdCA9IFwiI1wiICsgdGhpcy5pbnB1dC5nZXRBdHRyaWJ1dGUoXCJsaXN0XCIpO1xuXHRcdHRoaXMuaW5wdXQucmVtb3ZlQXR0cmlidXRlKFwibGlzdFwiKTtcblx0fVxuXHRlbHNlIHtcblx0XHR0aGlzLmxpc3QgPSB0aGlzLmlucHV0LmdldEF0dHJpYnV0ZShcImRhdGEtbGlzdFwiKSB8fCBvLmxpc3QgfHwgW107XG5cdH1cblxuXHRfLmFsbC5wdXNoKHRoaXMpO1xufTtcblxuXy5wcm90b3R5cGUgPSB7XG5cdHNldCBsaXN0KGxpc3QpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShsaXN0KSkge1xuXHRcdFx0dGhpcy5fbGlzdCA9IGxpc3Q7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHR5cGVvZiBsaXN0ID09PSBcInN0cmluZ1wiICYmIGxpc3QuaW5kZXhPZihcIixcIikgPiAtMSkge1xuXHRcdFx0XHR0aGlzLl9saXN0ID0gbGlzdC5zcGxpdCgvXFxzKixcXHMqLyk7XG5cdFx0fVxuXHRcdGVsc2UgeyAvLyBFbGVtZW50IG9yIENTUyBzZWxlY3RvclxuXHRcdFx0bGlzdCA9ICQobGlzdCk7XG5cblx0XHRcdGlmIChsaXN0ICYmIGxpc3QuY2hpbGRyZW4pIHtcblx0XHRcdFx0dmFyIGl0ZW1zID0gW107XG5cdFx0XHRcdHNsaWNlLmFwcGx5KGxpc3QuY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdFx0XHRcdFx0aWYgKCFlbC5kaXNhYmxlZCkge1xuXHRcdFx0XHRcdFx0dmFyIHRleHQgPSBlbC50ZXh0Q29udGVudC50cmltKCk7XG5cdFx0XHRcdFx0XHR2YXIgdmFsdWUgPSBlbC52YWx1ZSB8fCB0ZXh0O1xuXHRcdFx0XHRcdFx0dmFyIGxhYmVsID0gZWwubGFiZWwgfHwgdGV4dDtcblx0XHRcdFx0XHRcdGlmICh2YWx1ZSAhPT0gXCJcIikge1xuXHRcdFx0XHRcdFx0XHRpdGVtcy5wdXNoKHsgbGFiZWw6IGxhYmVsLCB2YWx1ZTogdmFsdWUgfSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5fbGlzdCA9IGl0ZW1zO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmlucHV0KSB7XG5cdFx0XHR0aGlzLmV2YWx1YXRlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdGdldCBzZWxlY3RlZCgpIHtcblx0XHRyZXR1cm4gdGhpcy5pbmRleCA+IC0xO1xuXHR9LFxuXG5cdGdldCBvcGVuZWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaXNPcGVuZWQ7XG5cdH0sXG5cblx0Y2xvc2U6IGZ1bmN0aW9uIChvKSB7XG5cdFx0aWYgKCF0aGlzLm9wZW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMudWwuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIFwiXCIpO1xuXHRcdHRoaXMuaXNPcGVuZWQgPSBmYWxzZTtcblx0XHR0aGlzLmluZGV4ID0gLTE7XG5cblx0XHQkLmZpcmUodGhpcy5pbnB1dCwgXCJhd2Vzb21wbGV0ZS1jbG9zZVwiLCBvIHx8IHt9KTtcblx0fSxcblxuXHRvcGVuOiBmdW5jdGlvbiAoKSB7XG5cdFx0dGhpcy51bC5yZW1vdmVBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG5cdFx0dGhpcy5pc09wZW5lZCA9IHRydWU7XG5cblx0XHRpZiAodGhpcy5hdXRvRmlyc3QgJiYgdGhpcy5pbmRleCA9PT0gLTEpIHtcblx0XHRcdHRoaXMuZ290bygwKTtcblx0XHR9XG5cblx0XHQkLmZpcmUodGhpcy5pbnB1dCwgXCJhd2Vzb21wbGV0ZS1vcGVuXCIpO1xuXHR9LFxuXG5cdGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdC8vcmVtb3ZlIGV2ZW50cyBmcm9tIHRoZSBpbnB1dCBhbmQgaXRzIGZvcm1cblx0XHQkLnVuYmluZCh0aGlzLmlucHV0LCB0aGlzLl9ldmVudHMuaW5wdXQpO1xuXHRcdCQudW5iaW5kKHRoaXMuaW5wdXQuZm9ybSwgdGhpcy5fZXZlbnRzLmZvcm0pO1xuXG5cdFx0Ly9tb3ZlIHRoZSBpbnB1dCBvdXQgb2YgdGhlIGF3ZXNvbXBsZXRlIGNvbnRhaW5lciBhbmQgcmVtb3ZlIHRoZSBjb250YWluZXIgYW5kIGl0cyBjaGlsZHJlblxuXHRcdHZhciBwYXJlbnROb2RlID0gdGhpcy5jb250YWluZXIucGFyZW50Tm9kZTtcblxuXHRcdHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuaW5wdXQsIHRoaXMuY29udGFpbmVyKTtcblx0XHRwYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY29udGFpbmVyKTtcblxuXHRcdC8vcmVtb3ZlIGF1dG9jb21wbGV0ZSBhbmQgYXJpYS1hdXRvY29tcGxldGUgYXR0cmlidXRlc1xuXHRcdHRoaXMuaW5wdXQucmVtb3ZlQXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIpO1xuXHRcdHRoaXMuaW5wdXQucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIik7XG5cblx0XHQvL3JlbW92ZSB0aGlzIGF3ZXNvbWVwbGV0ZSBpbnN0YW5jZSBmcm9tIHRoZSBnbG9iYWwgYXJyYXkgb2YgaW5zdGFuY2VzXG5cdFx0dmFyIGluZGV4T2ZBd2Vzb21wbGV0ZSA9IF8uYWxsLmluZGV4T2YodGhpcyk7XG5cblx0XHRpZiAoaW5kZXhPZkF3ZXNvbXBsZXRlICE9PSAtMSkge1xuXHRcdFx0Xy5hbGwuc3BsaWNlKGluZGV4T2ZBd2Vzb21wbGV0ZSwgMSk7XG5cdFx0fVxuXHR9LFxuXG5cdG5leHQ6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgY291bnQgPSB0aGlzLnVsLmNoaWxkcmVuLmxlbmd0aDtcblx0XHR0aGlzLmdvdG8odGhpcy5pbmRleCA8IGNvdW50IC0gMSA/IHRoaXMuaW5kZXggKyAxIDogKGNvdW50ID8gMCA6IC0xKSApO1xuXHR9LFxuXG5cdHByZXZpb3VzOiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIGNvdW50ID0gdGhpcy51bC5jaGlsZHJlbi5sZW5ndGg7XG5cdFx0dmFyIHBvcyA9IHRoaXMuaW5kZXggLSAxO1xuXG5cdFx0dGhpcy5nb3RvKHRoaXMuc2VsZWN0ZWQgJiYgcG9zICE9PSAtMSA/IHBvcyA6IGNvdW50IC0gMSk7XG5cdH0sXG5cblx0Ly8gU2hvdWxkIG5vdCBiZSB1c2VkLCBoaWdobGlnaHRzIHNwZWNpZmljIGl0ZW0gd2l0aG91dCBhbnkgY2hlY2tzIVxuXHRnb3RvOiBmdW5jdGlvbiAoaSkge1xuXHRcdHZhciBsaXMgPSB0aGlzLnVsLmNoaWxkcmVuO1xuXG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWQpIHtcblx0XHRcdGxpc1t0aGlzLmluZGV4XS5zZXRBdHRyaWJ1dGUoXCJhcmlhLXNlbGVjdGVkXCIsIFwiZmFsc2VcIik7XG5cdFx0fVxuXG5cdFx0dGhpcy5pbmRleCA9IGk7XG5cblx0XHRpZiAoaSA+IC0xICYmIGxpcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRsaXNbaV0uc2V0QXR0cmlidXRlKFwiYXJpYS1zZWxlY3RlZFwiLCBcInRydWVcIik7XG5cdFx0XHR0aGlzLnN0YXR1cy50ZXh0Q29udGVudCA9IGxpc1tpXS50ZXh0Q29udGVudDtcblxuXHRcdFx0Ly8gc2Nyb2xsIHRvIGhpZ2hsaWdodGVkIGVsZW1lbnQgaW4gY2FzZSBwYXJlbnQncyBoZWlnaHQgaXMgZml4ZWRcblx0XHRcdHRoaXMudWwuc2Nyb2xsVG9wID0gbGlzW2ldLm9mZnNldFRvcCAtIHRoaXMudWwuY2xpZW50SGVpZ2h0ICsgbGlzW2ldLmNsaWVudEhlaWdodDtcblxuXHRcdFx0JC5maXJlKHRoaXMuaW5wdXQsIFwiYXdlc29tcGxldGUtaGlnaGxpZ2h0XCIsIHtcblx0XHRcdFx0dGV4dDogdGhpcy5zdWdnZXN0aW9uc1t0aGlzLmluZGV4XVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdHNlbGVjdDogZnVuY3Rpb24gKHNlbGVjdGVkLCBvcmlnaW4pIHtcblx0XHRpZiAoc2VsZWN0ZWQpIHtcblx0XHRcdHRoaXMuaW5kZXggPSAkLnNpYmxpbmdJbmRleChzZWxlY3RlZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNlbGVjdGVkID0gdGhpcy51bC5jaGlsZHJlblt0aGlzLmluZGV4XTtcblx0XHR9XG5cblx0XHRpZiAoc2VsZWN0ZWQpIHtcblx0XHRcdHZhciBzdWdnZXN0aW9uID0gdGhpcy5zdWdnZXN0aW9uc1t0aGlzLmluZGV4XTtcblxuXHRcdFx0dmFyIGFsbG93ZWQgPSAkLmZpcmUodGhpcy5pbnB1dCwgXCJhd2Vzb21wbGV0ZS1zZWxlY3RcIiwge1xuXHRcdFx0XHR0ZXh0OiBzdWdnZXN0aW9uLFxuXHRcdFx0XHRvcmlnaW46IG9yaWdpbiB8fCBzZWxlY3RlZFxuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChhbGxvd2VkKSB7XG5cdFx0XHRcdHRoaXMucmVwbGFjZShzdWdnZXN0aW9uKTtcblx0XHRcdFx0dGhpcy5jbG9zZSh7IHJlYXNvbjogXCJzZWxlY3RcIiB9KTtcblx0XHRcdFx0JC5maXJlKHRoaXMuaW5wdXQsIFwiYXdlc29tcGxldGUtc2VsZWN0Y29tcGxldGVcIiwge1xuXHRcdFx0XHRcdHRleHQ6IHN1Z2dlc3Rpb25cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdGV2YWx1YXRlOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciB2YWx1ZSA9IHRoaXMuaW5wdXQudmFsdWU7XG5cblx0XHRpZiAodmFsdWUubGVuZ3RoID49IHRoaXMubWluQ2hhcnMgJiYgdGhpcy5fbGlzdC5sZW5ndGggPiAwKSB7XG5cdFx0XHR0aGlzLmluZGV4ID0gLTE7XG5cdFx0XHQvLyBQb3B1bGF0ZSBsaXN0IHdpdGggb3B0aW9ucyB0aGF0IG1hdGNoXG5cdFx0XHR0aGlzLnVsLmlubmVySFRNTCA9IFwiXCI7XG5cblx0XHRcdHRoaXMuc3VnZ2VzdGlvbnMgPSB0aGlzLl9saXN0XG5cdFx0XHRcdC5tYXAoZnVuY3Rpb24oaXRlbSkge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgU3VnZ2VzdGlvbihtZS5kYXRhKGl0ZW0sIHZhbHVlKSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24oaXRlbSkge1xuXHRcdFx0XHRcdHJldHVybiBtZS5maWx0ZXIoaXRlbSwgdmFsdWUpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0aWYgKHRoaXMuc29ydCAhPT0gZmFsc2UpIHtcblx0XHRcdFx0dGhpcy5zdWdnZXN0aW9ucyA9IHRoaXMuc3VnZ2VzdGlvbnMuc29ydCh0aGlzLnNvcnQpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnN1Z2dlc3Rpb25zID0gdGhpcy5zdWdnZXN0aW9ucy5zbGljZSgwLCB0aGlzLm1heEl0ZW1zKTtcblxuXHRcdFx0dGhpcy5zdWdnZXN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHRleHQpIHtcblx0XHRcdFx0XHRtZS51bC5hcHBlbmRDaGlsZChtZS5pdGVtKHRleHQsIHZhbHVlKSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRpZiAodGhpcy51bC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhpcy5jbG9zZSh7IHJlYXNvbjogXCJub21hdGNoZXNcIiB9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMub3BlbigpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuY2xvc2UoeyByZWFzb246IFwibm9tYXRjaGVzXCIgfSk7XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBTdGF0aWMgbWV0aG9kcy9wcm9wZXJ0aWVzXG5cbl8uYWxsID0gW107XG5cbl8uRklMVEVSX0NPTlRBSU5TID0gZnVuY3Rpb24gKHRleHQsIGlucHV0KSB7XG5cdHJldHVybiBSZWdFeHAoJC5yZWdFeHBFc2NhcGUoaW5wdXQudHJpbSgpKSwgXCJpXCIpLnRlc3QodGV4dCk7XG59O1xuXG5fLkZJTFRFUl9TVEFSVFNXSVRIID0gZnVuY3Rpb24gKHRleHQsIGlucHV0KSB7XG5cdHJldHVybiBSZWdFeHAoXCJeXCIgKyAkLnJlZ0V4cEVzY2FwZShpbnB1dC50cmltKCkpLCBcImlcIikudGVzdCh0ZXh0KTtcbn07XG5cbl8uU09SVF9CWUxFTkdUSCA9IGZ1bmN0aW9uIChhLCBiKSB7XG5cdGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcblx0XHRyZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aDtcblx0fVxuXG5cdHJldHVybiBhIDwgYj8gLTEgOiAxO1xufTtcblxuXy5JVEVNID0gZnVuY3Rpb24gKHRleHQsIGlucHV0KSB7XG5cdHZhciBodG1sID0gaW5wdXQudHJpbSgpID09PSBcIlwiID8gdGV4dCA6IHRleHQucmVwbGFjZShSZWdFeHAoJC5yZWdFeHBFc2NhcGUoaW5wdXQudHJpbSgpKSwgXCJnaVwiKSwgXCI8bWFyaz4kJjwvbWFyaz5cIik7XG5cdHJldHVybiAkLmNyZWF0ZShcImxpXCIsIHtcblx0XHRpbm5lckhUTUw6IGh0bWwsXG5cdFx0XCJhcmlhLXNlbGVjdGVkXCI6IFwiZmFsc2VcIlxuXHR9KTtcbn07XG5cbl8uUkVQTEFDRSA9IGZ1bmN0aW9uICh0ZXh0KSB7XG5cdHRoaXMuaW5wdXQudmFsdWUgPSB0ZXh0LnZhbHVlO1xufTtcblxuXy5EQVRBID0gZnVuY3Rpb24gKGl0ZW0vKiwgaW5wdXQqLykgeyByZXR1cm4gaXRlbTsgfTtcblxuLy8gUHJpdmF0ZSBmdW5jdGlvbnNcblxuZnVuY3Rpb24gU3VnZ2VzdGlvbihkYXRhKSB7XG5cdHZhciBvID0gQXJyYXkuaXNBcnJheShkYXRhKVxuXHQgID8geyBsYWJlbDogZGF0YVswXSwgdmFsdWU6IGRhdGFbMV0gfVxuXHQgIDogdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgXCJsYWJlbFwiIGluIGRhdGEgJiYgXCJ2YWx1ZVwiIGluIGRhdGEgPyBkYXRhIDogeyBsYWJlbDogZGF0YSwgdmFsdWU6IGRhdGEgfTtcblxuXHR0aGlzLmxhYmVsID0gby5sYWJlbCB8fCBvLnZhbHVlO1xuXHR0aGlzLnZhbHVlID0gby52YWx1ZTtcbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdWdnZXN0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RyaW5nLnByb3RvdHlwZSksIFwibGVuZ3RoXCIsIHtcblx0Z2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMubGFiZWwubGVuZ3RoOyB9XG59KTtcblN1Z2dlc3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gU3VnZ2VzdGlvbi5wcm90b3R5cGUudmFsdWVPZiA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIFwiXCIgKyB0aGlzLmxhYmVsO1xufTtcblxuZnVuY3Rpb24gY29uZmlndXJlKGluc3RhbmNlLCBwcm9wZXJ0aWVzLCBvKSB7XG5cdGZvciAodmFyIGkgaW4gcHJvcGVydGllcykge1xuXHRcdHZhciBpbml0aWFsID0gcHJvcGVydGllc1tpXSxcblx0XHQgICAgYXR0clZhbHVlID0gaW5zdGFuY2UuaW5wdXQuZ2V0QXR0cmlidXRlKFwiZGF0YS1cIiArIGkudG9Mb3dlckNhc2UoKSk7XG5cblx0XHRpZiAodHlwZW9mIGluaXRpYWwgPT09IFwibnVtYmVyXCIpIHtcblx0XHRcdGluc3RhbmNlW2ldID0gcGFyc2VJbnQoYXR0clZhbHVlKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoaW5pdGlhbCA9PT0gZmFsc2UpIHsgLy8gQm9vbGVhbiBvcHRpb25zIG11c3QgYmUgZmFsc2UgYnkgZGVmYXVsdCBhbnl3YXlcblx0XHRcdGluc3RhbmNlW2ldID0gYXR0clZhbHVlICE9PSBudWxsO1xuXHRcdH1cblx0XHRlbHNlIGlmIChpbml0aWFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0XHRcdGluc3RhbmNlW2ldID0gbnVsbDtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRpbnN0YW5jZVtpXSA9IGF0dHJWYWx1ZTtcblx0XHR9XG5cblx0XHRpZiAoIWluc3RhbmNlW2ldICYmIGluc3RhbmNlW2ldICE9PSAwKSB7XG5cdFx0XHRpbnN0YW5jZVtpXSA9IChpIGluIG8pPyBvW2ldIDogaW5pdGlhbDtcblx0XHR9XG5cdH1cbn1cblxuLy8gSGVscGVyc1xuXG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbmZ1bmN0aW9uICQoZXhwciwgY29uKSB7XG5cdHJldHVybiB0eXBlb2YgZXhwciA9PT0gXCJzdHJpbmdcIj8gKGNvbiB8fCBkb2N1bWVudCkucXVlcnlTZWxlY3RvcihleHByKSA6IGV4cHIgfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gJCQoZXhwciwgY29uKSB7XG5cdHJldHVybiBzbGljZS5jYWxsKChjb24gfHwgZG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoZXhwcikpO1xufVxuXG4kLmNyZWF0ZSA9IGZ1bmN0aW9uKHRhZywgbykge1xuXHR2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuXHRmb3IgKHZhciBpIGluIG8pIHtcblx0XHR2YXIgdmFsID0gb1tpXTtcblxuXHRcdGlmIChpID09PSBcImluc2lkZVwiKSB7XG5cdFx0XHQkKHZhbCkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGkgPT09IFwiYXJvdW5kXCIpIHtcblx0XHRcdHZhciByZWYgPSAkKHZhbCk7XG5cdFx0XHRyZWYucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudCwgcmVmKTtcblx0XHRcdGVsZW1lbnQuYXBwZW5kQ2hpbGQocmVmKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoaSBpbiBlbGVtZW50KSB7XG5cdFx0XHRlbGVtZW50W2ldID0gdmFsO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGVsZW1lbnQuc2V0QXR0cmlidXRlKGksIHZhbCk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnQ7XG59O1xuXG4kLmJpbmQgPSBmdW5jdGlvbihlbGVtZW50LCBvKSB7XG5cdGlmIChlbGVtZW50KSB7XG5cdFx0Zm9yICh2YXIgZXZlbnQgaW4gbykge1xuXHRcdFx0dmFyIGNhbGxiYWNrID0gb1tldmVudF07XG5cblx0XHRcdGV2ZW50LnNwbGl0KC9cXHMrLykuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBjYWxsYmFjayk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn07XG5cbiQudW5iaW5kID0gZnVuY3Rpb24oZWxlbWVudCwgbykge1xuXHRpZiAoZWxlbWVudCkge1xuXHRcdGZvciAodmFyIGV2ZW50IGluIG8pIHtcblx0XHRcdHZhciBjYWxsYmFjayA9IG9bZXZlbnRdO1xuXG5cdFx0XHRldmVudC5zcGxpdCgvXFxzKy8pLmZvckVhY2goZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRcdFx0ZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBjYWxsYmFjayk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn07XG5cbiQuZmlyZSA9IGZ1bmN0aW9uKHRhcmdldCwgdHlwZSwgcHJvcGVydGllcykge1xuXHR2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJIVE1MRXZlbnRzXCIpO1xuXG5cdGV2dC5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdGZvciAodmFyIGogaW4gcHJvcGVydGllcykge1xuXHRcdGV2dFtqXSA9IHByb3BlcnRpZXNbal07XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZ0KTtcbn07XG5cbiQucmVnRXhwRXNjYXBlID0gZnVuY3Rpb24gKHMpIHtcblx0cmV0dXJuIHMucmVwbGFjZSgvWy1cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCBcIlxcXFwkJlwiKTtcbn07XG5cbiQuc2libGluZ0luZGV4ID0gZnVuY3Rpb24gKGVsKSB7XG5cdC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovXG5cdGZvciAodmFyIGkgPSAwOyBlbCA9IGVsLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7IGkrKyk7XG5cdHJldHVybiBpO1xufTtcblxuLy8gSW5pdGlhbGl6YXRpb25cblxuZnVuY3Rpb24gaW5pdCgpIHtcblx0JCQoXCJpbnB1dC5hd2Vzb21wbGV0ZVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChpbnB1dCkge1xuXHRcdG5ldyBfKGlucHV0KTtcblx0fSk7XG59XG5cbi8vIEFyZSB3ZSBpbiBhIGJyb3dzZXI/IENoZWNrIGZvciBEb2N1bWVudCBjb25zdHJ1Y3RvclxuaWYgKHR5cGVvZiBEb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuXHQvLyBET00gYWxyZWFkeSBsb2FkZWQ/XG5cdGlmIChkb2N1bWVudC5yZWFkeVN0YXRlICE9PSBcImxvYWRpbmdcIikge1xuXHRcdGluaXQoKTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBXYWl0IGZvciBpdFxuXHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGluaXQpO1xuXHR9XG59XG5cbl8uJCA9ICQ7XG5fLiQkID0gJCQ7XG5cbi8vIE1ha2Ugc3VyZSB0byBleHBvcnQgQXdlc29tcGxldGUgb24gc2VsZiB3aGVuIGluIGEgYnJvd3NlclxuaWYgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdHNlbGYuQXdlc29tcGxldGUgPSBfO1xufVxuXG4vLyBFeHBvc2UgQXdlc29tcGxldGUgYXMgYSBDSlMgbW9kdWxlXG5pZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiBtb2R1bGUuZXhwb3J0cykge1xuXHRtb2R1bGUuZXhwb3J0cyA9IF87XG59XG5cbnJldHVybiBfO1xuXG59KCkpO1xuIiwiaW1wb3J0IEF3ZXNvbXBsZXRlIGZyb20gXCJhd2Vzb21wbGV0ZVwiO1xyXG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcnVuKCkge1xyXG4gIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWF3ZXNvbXBsZXRlJyk7XHJcbiAgY29uc3QgYXdlc29tZXBsZXRlID0gbmV3IEF3ZXNvbXBsZXRlKGlucHV0KTtcclxuXHJcbiAgLy8g0YPQsdGA0LDRgtGMIGFzeW5jINGDINGELdGG0LjQuCDQtdGB0LvQuCDQuNGB0L/QvtC70YzQt9GD0LXRgtGB0Y8geGhyXHJcbiAgY29uc3QgYXV0b2NvbXBsZXRlID0gYXN5bmMgKHRlcm0pID0+IHtcclxuICAgIGlmICh0ZXJtLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qINChINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC10LwgYXhpb3MgKiovXHJcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGF4aW9zLmdldCgnL3NlYXJjaCcsIHtcclxuICAgICAgcGFyYW1zOiB7IHRlcm0gfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLyog0KEg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LXQvCBmZXRjaFxyXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTCgnL3NlYXJjaCcsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xyXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3Rlcm0nLCB0ZXJtKTtcclxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaCh1cmwpLnRoZW4ocmVzID0+IHJlcy5qc29uKCkpO1xyXG4gICAgKiovXHJcblxyXG4gICAgLyog0KEg0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LXQvCB4aHJcclxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoJy9zZWFyY2gnLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcclxuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCd0ZXJtJywgdGVybSk7XHJcbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgIHhoci5vcGVuKCdHRVQnLCB1cmwuaHJlZiwgdHJ1ZSk7XHJcblxyXG4gICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IDQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh4aHIuc3RhdHVzICE9PSAyMDApIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7eGhyLnN0YXR1c306JHt4aHIuc3RhdHVzVGV4dH1gKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xyXG4gICAgICBhd2Vzb21lcGxldGUubGlzdCA9IGRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgeGhyLnNlbmQoKTtcclxuICAgICoqL1xyXG5cclxuICAgIGF3ZXNvbWVwbGV0ZS5saXN0ID0gZGF0YTsgLy8g0LfQsNC60L7QvNC80LXQvdGC0LjRgNC+0LLQsNGC0Ywg0LXRgdC70Lgg0LjRgdC/0L7Qu9GM0LfRg9C10YLRgdGPIHhoclxyXG4gIH07XHJcblxyXG4gIGxldCB0aW1lcklkID0gbnVsbDtcclxuICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICh7IHRhcmdldCB9KSA9PiB7XHJcbiAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XHJcbiAgICB0aW1lcklkID0gc2V0VGltZW91dChhdXRvY29tcGxldGUsIDUwMCwgdGFyZ2V0LnZhbHVlKTtcclxuICB9KTtcclxufSIsImltcG9ydCBTd2l0Y2hTZWxlY3QsIHtcblx0U2VsZWN0b3IsXG5cdENsYXNzTmFtZVxufSBmcm9tICcuLi9zd2l0Y2hTZWxlY3Qvc3dpdGNoU2VsZWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsdGVycyB7XG5cdGNvbnN0cnVjdG9yKHBhbmVsKSB7XG5cdFx0dGhpcy5wYW5lbCA9IHBhbmVsIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uZXdzRmlsdGVyJyk7XG5cblx0XHRpZiAoICF0aGlzLnBhbmVsICkgcmV0dXJuO1xuXG5cdFx0dGhpcy5jb250ZW50QmxvY2sgPSB0aGlzLnBhbmVsLmNsb3Nlc3QoJy5uZXdzRmlsdGVyX19jb250ZW50JykgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5ld3NGaWx0ZXJfX2NvbnRlbnQnKTtcblxuXHRcdHRoaXMubGFiZWxzID0gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uZXdzRmlsdGVyX19sYWJlbCcpXTtcblx0XHR0aGlzLmlucHV0cyA9IFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwiZmlsdGVyXCJdJyldO1xuXG5cdFx0dGhpcy5jbGlja0xvZ2ljKCk7XG5cblx0XHR0aGlzLmZpbHRlckxvZ2ljKCk7XG5cdH1cblxuXHRjbGlja0xvZ2ljKCkge1xuXHRcdGNvbnN0IGNsZWFyID0gdGhpcy5wYW5lbC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt2YWx1ZT1cImNsZWFyXCJdJyk7XG5cblx0XHRsZXQgcHJldkZpbHRlcjtcblxuXHRcdHRoaXMuaW5wdXRzLmZvckVhY2goIChpdGVtLCBpbmRleCkgPT4ge1xuXG5cdFx0XHRpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuXHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0aWYgKCBpdGVtLnZhbHVlID09IHByZXZGaWx0ZXIpIHtcblx0XHRcdFx0XHRpdGVtLmNoZWNrZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRjbGVhci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJykpO1xuXHRcdFx0XHRcdHByZXZGaWx0ZXIgPSBudWxsO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHByZXZGaWx0ZXIgPSBpdGVtLnZhbHVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0ZmlsdGVyTG9naWMoKSB7XG5cdFx0Y29uc3QgRmlsdGVyRWxlbWVudHMgPSBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZmlsdGVyLXR5cGVdJyldO1xuXG5cdFx0dGhpcy5pbnB1dHMuZm9yRWFjaCggKGl0ZW0sIGluZGV4KSA9PiB7XG5cdFx0XHRpdGVtLmFkZEV2ZW50TGlzdGVuZXIoICdjaGFuZ2UnLCBldmVudCA9PiB7XG5cdFx0XHRcdGNvbnN0IGZpbHRlclR5cGUgPSBpdGVtLnZhbHVlO1xuXG5cdFx0XHRcdEZpbHRlckVsZW1lbnRzLmZvckVhY2goIChpdGVtLGluZGV4KSA9PiB7XG5cblx0XHRcdFx0XHRpZiAoaXRlbS5kYXRhc2V0LmZpbHRlclR5cGUgPT09IGZpbHRlclR5cGUgfHxcblx0XHRcdFx0XHRcdFx0ZmlsdGVyVHlwZSA9PT0gJ2NsZWFyJyApIHtcblx0XHRcdFx0XHRcdGl0ZW0uc3R5bGUuZGlzcGxheSA9IGl0ZW0uZGF0YXNldC5maWx0ZXJEaXNwbGF5IHx8ICdibG9jayc7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGl0ZW0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cbn1cblxuY2xhc3MgTmV3c0ZpbHRlclNlbGVjdCBleHRlbmRzIFN3aXRjaFNlbGVjdCB7XG5cdGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcblx0XHRzdXBlcihlbGVtZW50KTtcblx0fVxuXG5cdHNlbGVjdEl0ZW0oaXRlbSkge1xuXHRcdGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuZWxlbWVudFxuXHRcdFx0LnF1ZXJ5U2VsZWN0b3IoU2VsZWN0b3IuU0VMRUNURURfSVRFTSk7XG5cblx0XHRpZiAoIXNlbGVjdGVkSXRlbSkge1xuXHRcdFx0aXRlbS5jbGFzc0xpc3QuYWRkKENsYXNzTmFtZS5TRUxFQ1RFRF9JVEVNKTtcblx0XHRcdHRoaXMudHJpZ2dlckNvbnRlbnRFbC5pbm5lckhUTUwgPSBpdGVtLmlubmVySFRNTDtcblx0XHRcdHRoaXMuY2xvc2UoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoc2VsZWN0ZWRJdGVtID09PSBpdGVtKSB7XG5cdFx0XHRpdGVtLmNsYXNzTGlzdC5yZW1vdmUoQ2xhc3NOYW1lLlNFTEVDVEVEX0lURU0pO1xuXHRcdFx0dGhpcy50cmlnZ2VyQ29udGVudEVsLmlubmVySFRNTCA9ICfQktGL0LHQtdGA0LjRgtC1INGE0LjQu9GM0YLRgCc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNlbGVjdGVkSXRlbS5jbGFzc0xpc3QucmVtb3ZlKENsYXNzTmFtZS5TRUxFQ1RFRF9JVEVNKTtcblx0XHRcdGl0ZW0uY2xhc3NMaXN0LmFkZChDbGFzc05hbWUuU0VMRUNURURfSVRFTSk7XG5cdFx0XHR0aGlzLnRyaWdnZXJDb250ZW50RWwuaW5uZXJIVE1MID0gaXRlbS5pbm5lckhUTUw7XG5cdFx0fVxuXG5cdFx0dGhpcy5jbG9zZSgpO1xuXHR9XG59XG5cbmV4cG9ydCBjb25zdCBpbml0TmV3c0ZpbHRlclNlbGVjdCA9ICgpID0+IHtcblx0Wy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uZXdzRmlsdGVyU2VsZWN0JyldLmZvckVhY2goKGl0ZW0pID0+IHtcblx0XHRuZXcgTmV3c0ZpbHRlclNlbGVjdChpdGVtKTtcblx0fSk7XG59XG4iLCJleHBvcnQgY29uc3QgU2VsZWN0b3IgPSB7XHJcbiAgSVRFTSAgICAgICAgICAgIDogJy5zd2l0Y2hTZWxlY3RfX2l0ZW0nLFxyXG4gIFNFTEVDVEVEX0lURU0gICA6ICcuc3dpdGNoU2VsZWN0X19pdGVtLS1pc1NlbGVjdGVkJyxcclxuICBJVEVNU19XUkFQICAgICAgOiAnLnN3aXRjaFNlbGVjdF9fZHJvcGRvd25Jbm5lcicsXHJcbiAgRFJPUERPV04gICAgICAgIDogJy5zd2l0Y2hTZWxlY3RfX2Ryb3Bkb3duJyxcclxuICBUUklHR0VSICAgICAgICAgOiAnLnN3aXRjaFNlbGVjdF9fdHJpZ2dlcicsXHJcbiAgVFJJR0dFUl9DT05URU5UIDogJy5zd2l0Y2hTZWxlY3RfX3RyaWdnZXIgLmNvbnRlbnQnLFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IENsYXNzTmFtZSA9IHtcclxuICBPUEVORUQgICAgICAgIDogJ3N3aXRjaFNlbGVjdC0taXNPcGVuZWQnLFxyXG4gIFNFTEVDVEVEX0lURU0gOiAnc3dpdGNoU2VsZWN0X19pdGVtLS1pc1NlbGVjdGVkJyxcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaFNlbGVjdCB7XHJcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xyXG4gICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICB0aGlzLmRyb3Bkb3duICAgICAgICAgPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcihTZWxlY3Rvci5EUk9QRE9XTik7XHJcbiAgICB0aGlzLnRyaWdnZXIgICAgICAgICAgPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcihTZWxlY3Rvci5UUklHR0VSKTtcclxuICAgIHRoaXMudHJpZ2dlckNvbnRlbnRFbCA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKFNlbGVjdG9yLlRSSUdHRVJfQ09OVEVOVCk7XHJcbiAgICB0aGlzLml0ZW1zICAgICAgICAgICAgPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChTZWxlY3Rvci5JVEVNKTtcclxuICAgIHRoaXMuaXRlbXNXcmFwICAgICAgICA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKFNlbGVjdG9yLklURU1TX1dSQVApO1xyXG5cclxuICAgIHRoaXMuZHJvcGRvd25QYWRkaW5nVG9wID0gMzU7XHJcbiAgICB0aGlzLmRyb3Bkb3duUGFkZGluZ0JvdHRvbSA9IDIwO1xyXG5cclxuICAgIHRoaXMuaXNPcGVuZWQgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBpc011bHRpc2VsZWN0ICAgPSAhIXRoaXMuZWxlbWVudC5kYXRhc2V0Lm11bHRpc2VsZWN0O1xyXG5cclxuICAgIGlmIChpc011bHRpc2VsZWN0KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0TWV0aG9kICAgPSAnbXVsdGlzZWxlY3RJdGVtJztcclxuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlcyA9IG5ldyBTZXQoW10pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RNZXRob2QgICA9ICdzZWxlY3RJdGVtJztcclxuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlICA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXREZWZhdWx0U2VsZWN0ZWRJdGVtKCk7XHJcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICBhZGRFdmVudExpc3RlbmVycygpIHtcclxuICAgIHRoaXMuZHJvcGRvd24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoeyB0YXJnZXQgfSkgPT4ge1xyXG4gICAgICBjb25zdCBpdGVtID0gdGFyZ2V0LmNsb3Nlc3QoU2VsZWN0b3IuSVRFTSk7XHJcbiAgICAgIGlmKCFpdGVtKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXNbdGhpcy5zZWxlY3RNZXRob2RdKGl0ZW0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMudG9nZ2xlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZURvY3VtZW50Q2xpY2soeyB0YXJnZXQgfSkge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBUT0RPOiDRgtGA0LXQsdGD0LXRgtGB0Y8g0YDQtdGE0LDQutGC0L7RgNC40L3Qs1xyXG4gIHNlbGVjdEl0ZW0oaXRlbSkge1xyXG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gaXRlbS5kYXRhc2V0O1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkVmFsdWUgJiYgdGhpcy5zZWxlY3RlZFZhbHVlICE9PSB2YWx1ZSkge1xyXG4gICAgICBjb25zdCBwcmV2U2VsZWN0ZWRJdGVtID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoU2VsZWN0b3IuU0VMRUNURURfSVRFTSk7XHJcbiAgICAgIHByZXZTZWxlY3RlZEl0ZW0uY2xhc3NMaXN0LnJlbW92ZShDbGFzc05hbWUuU0VMRUNURURfSVRFTSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSAhPT0gdmFsdWUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gdmFsdWU7XHJcbiAgICAgIHRoaXMudHJpZ2dlckNvbnRlbnRFbC5pbm5lckhUTUwgPSBpdGVtLmlubmVySFRNTDtcclxuICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKENsYXNzTmFtZS5TRUxFQ1RFRF9JVEVNKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBUT0RPOiDRgtGA0LXQsdGD0LXRgtGB0Y8g0YDQtdGE0LDQutGC0L7RgNC40L3Qs1xyXG4gIG11bHRpc2VsZWN0SXRlbShpdGVtKSB7XHJcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBpdGVtLmRhdGFzZXQ7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZXMuaGFzKHZhbHVlKSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzLmRlbGV0ZSh2YWx1ZSk7XHJcbiAgICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShDbGFzc05hbWUuU0VMRUNURURfSVRFTSk7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkVmFsdWVzLnNpemUgPT09IDApIHtcclxuICAgICAgICB0aGlzLnRyaWdnZXJDb250ZW50RWwuaW5uZXJIVE1MID0gJ9CS0YvQsdC10YDQuNGC0LUg0YLQtdCz0LgnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudHJpZ2dlckNvbnRlbnRFbC5pbm5lckhUTUwgPSBg0JLRi9Cx0YDQsNC90L4gJHt0aGlzLnNlbGVjdGVkVmFsdWVzLnNpemV9YDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlcy5hZGQodmFsdWUpO1xyXG4gICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoQ2xhc3NOYW1lLlNFTEVDVEVEX0lURU0pO1xyXG4gICAgICB0aGlzLnRyaWdnZXJDb250ZW50RWwuaW5uZXJIVE1MID0gYNCS0YvQsdGA0LDQvdC+ICR7dGhpcy5zZWxlY3RlZFZhbHVlcy5zaXplfWA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNPcGVuZWQpIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcGVuKCkge1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZURvY3VtZW50Q2xpY2suYmluZCh0aGlzKSk7XHJcbiAgICB0aGlzLnNldFNjcm9sbCgpO1xyXG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ2xhc3NOYW1lLk9QRU5FRCk7XHJcbiAgICB0aGlzLnNldFBhZGRpbmdPbkRyb3Bkb3duKCk7XHJcbiAgICB0aGlzLmRyb3Bkb3duLnN0eWxlLmhlaWdodCA9IHRoaXMuZ2V0T3BlbkhlaWdodCgpO1xyXG4gICAgdGhpcy5pc09wZW5lZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpIHtcclxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVEb2N1bWVudENsaWNrLmJpbmQodGhpcykpO1xyXG4gICAgdGhpcy5yZW1vdmVTY3JvbGwoKTtcclxuICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENsYXNzTmFtZS5PUEVORUQpO1xyXG4gICAgdGhpcy5yZW1vdmVQYWRkaW5nT25Ecm9wZG93bigpO1xyXG4gICAgdGhpcy5kcm9wZG93bi5zdHlsZS5oZWlnaHQgPSAwO1xyXG4gICAgdGhpcy5pc09wZW5lZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3BlbkhlaWdodCgpIHtcclxuICAgIHJldHVybiB0aGlzLml0ZW1zV3JhcC5zY3JvbGxIZWlnaHQgKyB0aGlzLmRyb3Bkb3duUGFkZGluZ1RvcCArIHRoaXMuZHJvcGRvd25QYWRkaW5nQm90dG9tO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFkZGluZ09uRHJvcGRvd24oKSB7XHJcbiAgICB0aGlzLmRyb3Bkb3duLnN0eWxlLnBhZGRpbmdUb3AgICAgPSB0aGlzLmRyb3Bkb3duUGFkZGluZ1RvcDtcclxuICAgIHRoaXMuZHJvcGRvd24uc3R5bGUucGFkZGluZ0JvdHRvbSA9IHRoaXMuZHJvcGRvd25QYWRkaW5nQm90dG9tO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUGFkZGluZ09uRHJvcGRvd24oKSB7XHJcbiAgICB0aGlzLmRyb3Bkb3duLnN0eWxlLnBhZGRpbmdUb3AgICAgPSAnJztcclxuICAgIHRoaXMuZHJvcGRvd24uc3R5bGUucGFkZGluZ0JvdHRvbSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgc2V0U2Nyb2xsKCkge1xyXG4gICAgY29uc3QgaGFuZGxlID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLml0ZW1zV3JhcC5zdHlsZS5vdmVyZmxvd1kgPSAnYXV0byc7XHJcbiAgICAgIHRoaXMuZHJvcGRvd24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGhhbmRsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kcm9wZG93bi5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgaGFuZGxlKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVNjcm9sbCgpIHtcclxuICAgIHRoaXMuaXRlbXNXcmFwLnN0eWxlLm92ZXJmbG93WSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgc2V0SW5kZXgoaW5kZXhWYWx1ZSkge1xyXG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLnpJbmRleCA9IGluZGV4VmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZXREZWZhdWx0U2VsZWN0ZWRJdGVtKCkge1xyXG4gICAgY29uc3QgZGVmYXVsdFNlbGVjdGVkSXRlbUVsID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRlZmF1bHRdJyk7XHJcblxyXG4gICAgaWYgKCFkZWZhdWx0U2VsZWN0ZWRJdGVtRWwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0SXRlbShkZWZhdWx0U2VsZWN0ZWRJdGVtRWwpO1xyXG4gIH1cclxufSIsIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFnZURyYXcge1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcblx0XHR0aGlzLmlkID0gRGF0ZS5ub3coKSAqIE1hdGgucmFuZG9tKCk7XG5cblx0XHR0aGlzLl9fZGF0YSA9IHt9O1xuXHRcdGlmIChvcHRpb25zLmRhdGEpIHtcblx0XHRcdHRoaXMuZGF0YSA9IG9wdGlvbnMuZGF0YTtcblx0XHRcdC8vINC40YHQv9C+0LvRjNC30L7QstCw0YLRjCDQu9C4INC60Y3RiCDQsiBqc1xuXHRcdFx0dGhpcy5jYWNoZSA9IG9wdGlvbnMuY2FjaGUgfHwgMTtcblx0XHR9XG5cdFx0aWYgKG9wdGlvbnMubG9jYWxEYXRhKXtcblx0XHRcdHRoaXMubG9jYWxEYXRhID0gb3B0aW9ucy5sb2NhbERhdGE7XG5cdFx0fVxuXHRcdC8vINC/0L7Qt9C40YbQuNGPLCDQutGD0LTQsCDQstGB0LUg0Y3RgtC+INCy0YHRgtCw0LLQu9GP0LXRgtGB0Y9cblx0XHR0aGlzLnBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiB8fCBudWxsO1xuXHRcdC8vINCa0L7QvdGE0LjQs9GD0YDQsNGG0LjRjyDRgNC+0LTQuNGC0LXQu9GM0YHQutC+0LPQviDRjdC70LXQvNC10L3RgtCwLCDQsiDQutC+0YLQvtGA0L7QvCDQsdGD0LTQtdGCINC60L7QvdGC0LXQvdGCXG5cdFx0dGhpcy5fX2VsZW1lbnQgPSAob3B0aW9ucy5lbGVtZW50IHx8ICdkaXYnKTtcblx0XHR0aGlzLl9fY2xhc3NOYW1lID0gb3B0aW9ucy5jbGFzcztcblxuXHRcdC8vINC70L7Qs9C40YDQvtCy0LDQvdC40LUg0LTQtdC50YHRgtCy0LjQuSDRgdC60YDQuNC/0YLQsFxuXHRcdHRoaXMuX19pbmRpY2F0aW9uID0gb3B0aW9ucy5pbmRpY2F0aW9uIHx8IG51bGw7XG5cblx0XHQvLyDQutC+0L3RgtC10L3Rgiwg0LrQvtGC0L7RgNGL0Lkg0LzQvtC20L3QviDRg9C60LDQt9Cw0YLRjCDQv9GA0Lgg0LjQvdC40YbQuNCw0LvQuNC30LDRhtC40LguXG5cdFx0dGhpcy5fX2NvbnQgPSBvcHRpb25zLmNvbnRlbnQgfHwgbnVsbDtcblxuXG5cdFx0Ly8g0YTRg9C90LrRhtC40Y8g0LfQsNC/0YPRgdC60LDQtdGC0YHRjyDQv9C+0YHQu9C1INC+0YLRgNC40YHQvtCy0LrQuCDQuCDQsiDQvdC10Lkg0LTQvtC70LbQtdC9INCx0YvRgtGMINC60L7QtCwg0LrQsNC6INC/0L7QutCw0LfQsNGC0Ywg0LrQvtC90YLQtdC90YIuXG5cdFx0Ly8g0LDQvdC40LzQsNGG0LjRjyDQv9C+0Y/QstC70LXQvdC40Y9cblx0XHR0aGlzLnNob3cgPSBvcHRpb25zLnNob3cgfHwgbnVsbDtcblx0XHR0aGlzLmhpZGUgPSBvcHRpb25zLmhpZGUgfHwgbnVsbDtcblxuXHRcdC8vINGE0YPQvdC60YbQuNGPINC/0L7RgdC70LUg0LDQvdC40LzQsNGG0LjQuCDQv9C+0Y/QstC70LXQvdC40Y9cblx0XHR0aGlzLl9fY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8IG51bGw7XG5cblx0XHRpZiAob3B0aW9ucy5jb250YWluZXIpIHtcblx0XHRcdHRoaXMuX19wcmVyZW5kZXIgPSB0cnVlO1xuXHRcdFx0dGhpcy5fX2RyYXdlZCA9IHRydWU7XG5cdFx0fVxuXHRcdC8vINGN0LvQtdC80LXQvdGCLCDQsiDQutC+0YLQvtGA0YvQuSDQt9Cw0LPRgNGD0LfQuNGC0YHRjyDQutC+0L3RgtC10L3Rgi5cblx0XHR0aGlzLmJsb2NrID0gb3B0aW9ucy5jb250YWluZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLl9fZWxlbWVudCk7XG5cblxuXHRcdGlmICh0aGlzLl9fY2xhc3NOYW1lKSB7XG5cdFx0XHR0aGlzLmJsb2NrLmNsYXNzTmFtZSA9IHRoaXMuX19jbGFzc05hbWU7XG5cdFx0fVxuXHRcdGlmIChvcHRpb25zLmlkKSB7XG5cdFx0XHR0aGlzLmJsb2NrLmlkID0gb3B0aW9ucy5pZDtcblx0XHR9XG5cdFx0Ly8g0LzQsNGB0YHQuNCyINC00LXRgtC10LksINC00LvRjyDRg9GB0YLQsNC90L7QstC60Lgg0LfQsNCy0LjRgdC40LzQvtGB0YLQtdC5XG5cdFx0dGhpcy5jaGlsZHJlbkFycmF5ID0gW107XG5cdFx0dGhpcy5fX2NoYW5nZWRDYWNoZSA9IGZhbHNlO1xuXHRcdHRoaXMuY2hpbGRyZW5IaWRlTW9kdWxlcyA9IFtdO1xuXHR9XG5cblx0c2V0IGNvbnRlbnQoY29kZSkge1xuXHRcdGlmICh3aW5kb3cuZGV2ZWxvcG1lbnQgfHwgdGhpcy5fX2luZGljYXRpb24pe1xuXHRcdFx0Y29uc29sZS5sb2codGhpcy5pZCwn0JjQt9C80LXQvdC10L0g0LrQvtC90YLQtdC90YIsINC80L7QttC90L4g0L/QtdGA0LXRgNC40YHQvtCy0LDRgtGMLicpO1xuXG5cdFx0XHRpZiAoIGNvZGUgaW5zdGFuY2VvZiBGdW5jdGlvbiApIHtcblx0XHRcdFx0Y29uc29sZS5sb2codGhpcy5pZCwn0JrQvtC90YLQtdC90YIgLSDRhNGD0L3QutGG0LjRjycpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc29sZS5sb2codGhpcy5pZCwn0JrQvtC90YLQtdC90YIgLSDRgdGC0YDQvtC60LAnKTtcblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuX19jb250ID0gY29kZTtcblx0XHR0aGlzLl9fZHJhd2VkID0gZmFsc2U7XG5cdH1cblxuXHRnZXQgY29udGVudCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fX2NvbnQ7XG5cdH1cblxuXHRzZXQgY2hpbGQob2JqZWN0KSB7XG5cblx0XHRpZiAodGhpcy5pc0NoaWxkcmVuKG9iamVjdCkpIHJldHVybiBudWxsO1xuXG5cdFx0dGhpcy5jaGlsZHJlbkFycmF5LnB1c2gob2JqZWN0KTtcblx0XHRvYmplY3QuZmF0aGVyID0gdGhpcztcblx0fVxuXG5cdGdldCBjaGlsZHJlbigpIHtcblx0XHRyZXR1cm4gdGhpcy5jaGlsZHJlbkFycmF5O1xuXHR9XG5cblxuXHRpc0NoaWxkcmVuKG9iamVjdCkge1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuQXJyYXkubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5BcnJheVtpXTtcblx0XHRcdGlmIChjaGlsZCA9PSAgb2JqZWN0KVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRzZXQgcmVtb3ZlQ2hpbGQob2JqZWN0KSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuQXJyYXkubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5BcnJheVtpXTtcblx0XHRcdGlmIChjaGlsZCA9PT0gb2JqZWN0KSB7XG5cblx0XHRcdFx0Y2hpbGQgPSBudWxsO1xuXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGdldCByZW1vdmVDaGlsZHJlbigpIHtcblx0XHR0aGlzLmNoaWxkcmVuQXJyYXkgPSBbXTtcblx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKSB7XG5cdFx0XHRjb25zb2xlLmxvZyh0aGlzLmlkLCfQlNC10YLQuCjQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4KSDRg9C00LDQu9C10L3RiycpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5jaGlsZHJlbkFycmF5O1xuXHR9XG5cblxuXHRzZXQgcG9zaXRpb24oY29kZSkge1xuXHRcdGlmICghY29kZSkgcmV0dXJuO1xuXHRcdGlmICh3aW5kb3cuZGV2ZWxvcG1lbnQgfHwgdGhpcy5fX2luZGljYXRpb24pe1xuXHRcdFx0Y29uc29sZS5sb2codGhpcy5pZCwn0JjQt9C80LXQvdC10L3QsC/QtNC+0LHQsNCy0LvQtdC90LAg0L/QvtC30LjRhtC40Y8sINC90YPQttC90L4g0L7RgtGA0LjRgdC+0LLQsNGC0YwnKTtcblx0XHR9XG5cdFx0dGhpcy5fX2RyYXdlZCA9IGZhbHNlO1xuXHRcdC8vIHRoaXMuY2hhbmdlUG9zaXRpb24gPSB0cnVlOyAqKiAxXG5cblx0XHRpZiAoY29kZSBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdFx0XHR0aGlzLl9fcG9zID0gY29kZTtcblx0XHRcdHJldHVyblxuXHRcdH0gZWxzZSBpZiAoY29kZSBpbnN0YW5jZW9mIE9iamVjdCkge1xuXHRcdFx0dGhpcy5fX3BvcyA9IFtjb2RlXTtcblx0XHRcdHJldHVyblxuXHRcdH0gLy8gJ2FmdGVyZW5kIC5oZWFkZXInIHx8IFsnYWZ0ZXJlbmQnLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkZXInKV1cblx0XHRlbHNlIGlmICh0eXBlb2YgY29kZSA9PSAnc3RyaW5nJyApIHtcblx0XHRcdHZhciBhcnIgPSBjb2RlLnNwbGl0KCcgJyk7XG5cdFx0XHR0aGlzLl9fcG9zID0gW3tcblx0XHRcdFx0cGxhY2U6IGFyclswXSxcblx0XHRcdFx0ZWxlbWVudDogYXJyWzFdLFxuXHRcdFx0XHRmYXRoZXI6IGFyclsyXVxuXHRcdFx0fV07XG5cdFx0XHRyZXR1cm5cblx0XHR9XG5cblx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdGlmICghKGNvZGUgaW5zdGFuY2VvZiBPYmplY3QpKVxuXHRcdFx0Y29uc29sZS5lcnJvcih0aGlzLmlkLGDQn9C+0LfQuNGG0LjRjyAtINGN0YLQviDRgdGC0YDQvtC60LAsINC+0LHRitC10LrRgih7cGxhY2U6J2JlZm9yZWVuZCcsZWxlbWVudDonLmFwcCdbLGZhdGhlcjogKHRoaXMuZmF0aGVyLmNsYXNzKV19KSDQuNC70Lgg0LzQsNGB0YHQuNCyINC40Lcg0L7QsdGK0LXQutGC0L7QsmApO1xuXHRcdH1cblx0fVxuXG5cdGdldCBwb3NpdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5fX3Bvcztcblx0fVxuXG5cdGdldCBkcmF3KCkge1xuXG5cdFx0aWYgKHRoaXMuX19kcmF3U3RhcnQpIHtcblxuXHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbil7XG5cdFx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9Cj0LbQtSDQuNC00LXRgiDQvtGC0YDQuNGB0L7QstC60LAsINCy0YLQvtGA0LDRjyDQv9Cw0YDQsNC70LvQtdC70YzQvdC+INC+0YLQutC70L7QvdC10L3QsC4nKVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fX2RyYXdlZCAmJiB0aGlzLmNoYW5nZWRDaGlsZHJlbnMpIHtcblx0XHRcdGlmICh0aGlzLmNoaWxkcmVuQXJyYXkubGVuZ3RoKSB7XG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbkFycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0bGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbkFycmF5W2ldO1xuXHRcdFx0XHRcdGNoaWxkLmRyYXdlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdGNoaWxkLmRyYXc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5fX2RyYXdlZCAmJiAhdGhpcy5fX2NoYW5nZWRDYWNoZSkge1xuXG5cdFx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdFx0Y29uc29sZS5sb2codGhpcy5pZCwn0J3QtSDQvtGC0YDQuNGB0L7QstCw0L3Qviwg0LjQt9C80LXQvdC10L3QuNC5INC90LUg0LfQsNC80LXRh9C10L3Qvi4nKVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdC8vIGRyYXdTdGFydCAtPiDQn9C+0YjQu9CwINC+0YLRgNC40YHQvtCy0LrQsFxuXHRcdHRoaXMuX19kcmF3U3RhcnQgPSB0cnVlO1xuXG5cdFx0cmV0dXJuIHRoaXMuX19kcmF3TG9naWMoKS50aGVuKCgpPT57XG5cblx0XHRcdGlmICh0aGlzLmNoaWxkcmVuQXJyYXkubGVuZ3RoKSB7XG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbkFycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0bGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbkFycmF5W2ldO1xuXHRcdFx0XHRcdGNoaWxkLmRyYXc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX19jYWxsYmFjaykgdGhpcy5fX2NhbGxiYWNrKCk7XG5cblx0XHR9KVxuXHRcdC5jYXRjaCgoZSk9Pntcblx0XHRcdGlmICh3aW5kb3cuZGV2ZWxvcG1lbnQgfHwgdGhpcy5fX2luZGljYXRpb24pe1xuXHRcdFx0XHRjb25zb2xlLmxvZyh0aGlzLmlkLCfQn9C+INC60LDQutC+0Lkt0YLQviDQv9GA0LjRh9C40L3QtSwg0L7RgtGA0LjRgdC+0LLQutCwINC30LDQstC10YDRiNC10L3QsC4nLGUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0X19kcmF3TG9naWMoKSB7XG5cblx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdGlmICghdGhpcy5fX2NvbnQpIHtcblx0XHRcdFx0dGhpcy5fX2RyYXdTdGFydCA9IGZhbHNlO1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ9Cd0LXRgtGDINC60L7QvdGC0LXQvdGC0LAg0LTQu9GPINC+0YLRgNC40YHQvtCy0LrQuC4nKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuX19jb250IGluc3RhbmNlb2YgRnVuY3Rpb24gKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fX2RyYXdGb3JGdW5jdGlvbigpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX19jb250ID09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fX2RyYXdGb3JTdHJpbmcoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fX2RyYXdTdGFydCA9IGZhbHNlO1xuXHRcdFx0bGV0IGVycm9yID0gbmV3IEVycm9yKCfQmtC+0L3QtdGC0LXQvdGCINC90LUg0YTRg9C90LrRhtC40Y8g0Lgg0L3QtSDRgdGC0YDQvtC60LAsINCwINC80LDRgdGB0LjQsiDQuCDQvtCx0YrQtdC60YIg0L3QtSDQtNC+0L/Rg9GB0YLQuNC80YsuJyk7XG5cdFx0XHRjb25zb2xlLmVycm9yKHRoaXMuaWQsZXJyb3IpO1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9XG5cblx0X19kcmF3Rm9yRnVuY3Rpb24oKSB7XG5cblx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9CX0LDRiNC70L4g0LIg0L7RgtGA0LjRgdC+0LLQutGDINGE0YPQvdC60YbQuNC4Jyk7XG5cdFx0fVxuXHRcdGxldCBkYXRhO1xuXHRcdGlmICh0aGlzLnVybCkge1xuXHRcdFx0ZGF0YSA9IHRoaXMuY2FjaGVDb250cm9sKHRoaXMudXJsKVxuXHRcdH0gZWxzZSBpZiAodGhpcy5sb2NhbERhdGEpIHtcblx0XHRcdGRhdGEgPSBQcm9taXNlLnJlc29sdmUodGhpcy5sb2NhbERhdGEpO1xuXHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbil7XG5cdFx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9CS0LfRj9C70L4g0LvQvtC60LDQu9GM0L3Ri9C1INC00LDQvdC90YvQtScpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhXG5cdFx0LnRoZW4oKHJlc3VsdCkgPT4ge1xuXHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbil7XG5cdFx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9Ce0YLRgNC40YHQvtCy0LrQsCDQuNC3INC00LDQvdC90YvRhScpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKSB7XG5cdFx0XHRcdGlmICghcmVzdWx0KSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKHRoaXMuaWQsJ9Cf0YDQvtC80LjRgSDQvdC1INC+0YLQtNCw0Lsg0YDQtdC30YPQu9GM0YLQsNGCINC40LvQuCDQvtGC0LLQtdGCINGB0LXRgNCy0LXRgNCwINC/0YPRgdGC0L7QuS4nKTtcblx0XHRcdFx0XHRyZXN1bHQgPSAnJztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbikge1xuXHRcdFx0XHRpZiAoIXRoaXMuX19jb250KHJlc3VsdCkpIHtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4odGhpcy5pZCwn0KTRg9C90LrRhtC40Y8g0LrQvtC90YLQtdC90YLQsCDQvdC40YfQtdCz0L4g0L3QtSDQstC+0LfQstGA0LDRidCw0LXRgicpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmhpZGUgJiYgdGhpcy5fX2RyYXdlZCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5oaWRlKClcblx0XHRcdFx0XHQudGhlbigoKT0+e1xuXHRcdFx0XHRcdFx0dGhpcy5ibG9jay5pbm5lckhUTUwgPSB0aGlzLl9fY29udChyZXN1bHQpO1xuXHRcdFx0XHRcdFx0dGhpcy5fX2NoYW5nZWRDYWNoZSA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0XHR0aGlzLmluc2VydENvbnQoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuYmxvY2suaW5uZXJIVE1MID0gdGhpcy5fX2NvbnQocmVzdWx0KTtcblx0XHRcdFx0dGhpcy5fX2NoYW5nZWRDYWNoZSA9IGZhbHNlO1xuXG5cdFx0XHRcdGlmICghdGhpcy5ibG9jay5vZmZzZXRXaWR0aCkge1xuXHRcdFx0XHRcdHRoaXMuaW5zZXJ0Q29udCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmICh0aGlzLnNob3cpIHtcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoKCk9Pntcblx0XHRcdFx0XHRcdFx0dGhpcy5zaG93KClcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbil7XG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9CQ0L3QuNC80LjRgNC+0LLQsNC90L4nLHRoaXMuYmxvY2spO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLl9fZHJhd2VkID0gdHJ1ZTtcblx0XHRcdFx0XHR0aGlzLl9fZHJhd1N0YXJ0ID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0pXG5cdFx0LmNhdGNoKChlcnIpPT57XG5cdFx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdFx0Y29uc29sZS53YXJuKHRoaXMuaWQsJ9Ce0YjQuNCx0LrQsCDQsiDQv9GA0L7QvNC40YHQtSDQv9C+0LvRg9GH0LXQvdC40Y8g0LTQsNC90L3Ri9GFLCDQstC+0LfQvNC+0LbQvdC+IDQwNCcpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9fZHJhd1N0YXJ0ID0gZmFsc2U7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSk7XG5cdH1cblxuXHRfX2RyYXdGb3JTdHJpbmcoKXtcblx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9CX0LDRiNC70L4g0LIg0L7RgtGA0LjRgdC+0LLQutGDINGB0YLRgNC+0LrQuCcpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9fY2hhbmdlZENhY2hlICYmIHRoaXMuX19kcmF3ZWQpe1xuXG5cdFx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdFx0Y29uc29sZS5sb2codGhpcy5pZCxcItCe0YHRgtCw0L3QvtCy0LvQtdC90L4sINGB0LzQtdC90LAg0LrRjdGI0LAg0L3QtSDQuNC30LzQtdC90LjRgiDRgdGC0YDQvtC60YMuXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9fZHJhd1N0YXJ0ID0gZmFsc2U7XG5cdFx0XHR0aGlzLl9fZHJhd2VkID0gdHJ1ZTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG5cdFx0fVxuXG5cdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbil7XG5cdFx0XHRpZiAoIXRoaXMuX19jb250KSB7XG5cdFx0XHRcdGNvbnNvbGUud2Fybih0aGlzLmlkLCfQodGC0YDQvtC60LAg0LrQvtC90YLQtdC90YLQsCDQv9GD0YHRgtCwJyk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICh0aGlzLmhpZGUgJiYgdGhpcy5fX2RyYXdlZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaGlkZSgpXG5cdFx0XHRcdC50aGVuKCgpPT57XG5cdFx0XHRcdFx0dGhpcy5ibG9jay5pbm5lckhUTUwgPSB0aGlzLl9fY29udDtcblx0XHRcdFx0XHR0aGlzLmluc2VydENvbnQoKTtcblx0XHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuYmxvY2suaW5uZXJIVE1MID0gdGhpcy5fX2NvbnQ7XG5cdFx0XHRpZiAoIXRoaXMuYmxvY2sub2Zmc2V0V2lkdGgpIHtcblx0XHRcdFx0dGhpcy5pbnNlcnRDb250KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodGhpcy5zaG93KSB7XG5cdFx0XHRcdFx0c2V0VGltZW91dCgoKT0+e1xuXHRcdFx0XHRcdFx0dGhpcy5zaG93KClcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKXtcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9CQ0L3QuNC80LjRgNC+0LLQsNC90L4nLHRoaXMuYmxvY2spO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9fZHJhd2VkID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5fX2RyYXdTdGFydCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdGluc2VydENvbnQoKSB7XG5cdFx0bGV0IGFycmF5ID0gdGhpcy5wb3NpdGlvbjtcblx0XHRpZiAodGhpcy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbikge1xuXHRcdFx0aWYgKCFhcnJheSkgY29uc29sZS5sb2coJ9Cd0LXRgiDQv9C+0LfQuNGG0LjQuCcpO1xuXHRcdH1cblxuXHRcdGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBhcnJheS5sZW5ndGg7IGluZGV4KyspIHtcblx0XHRcdHZhciB7cGxhY2UsIGVsZW1lbnQsIGZhdGhlcn0gPSBhcnJheVtpbmRleF07XG5cblx0XHRcdGlmIChmYXRoZXIgJiYgZmF0aGVyICE9IHRoaXMuZmF0aGVyLl9fY2xhc3NOYW1lKSBjb250aW51ZTtcblxuXHRcdFx0dmFyIHNlYXJjaEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuXHRcdFx0aWYgKHNlYXJjaEVsZW1lbnQpIHtcblx0XHRcdFx0c2VhcmNoRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQocGxhY2UgLHRoaXMuYmxvY2spO1xuXHRcdFx0XHR0aGlzLl9fZHJhd2VkID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuX19kcmF3ZWQgJiYgIXNlYXJjaEVsZW1lbnQgJiYgKHRoaXMuX19pbmRpY2F0aW9uIHx8IHdpbmRvdy5kZXZlbG9wbWVudCkgKSB7XG5cdFx0XHRjb25zb2xlLmxvZygnJWMg0J3QtSDQvtGC0YDQuNGB0L7QstCw0L3Qviwg0L3QtSDQvdCw0LnQtNC10L0g0Y3Qu9C10LzQtdC90YInLCAnYmFja2dyb3VuZDogI2ZmMDAzNzsgY29sb3I6ICNmZmYnKTtcblx0XHR9XG5cblxuXHRcdGlmICh0aGlzLmNoaWxkcmVuQXJyYXkubGVuZ3RoKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW5BcnJheS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuQXJyYXlbaV07XG5cdFx0XHRcdGNoaWxkLmRyYXdlZCA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghdGhpcy5fX2RyYXdlZCAmJiBzZWFyY2hFbGVtZW50ICYmICh3aW5kb3cuZGV2ZWxvcG1lbnQgfHwgdGhpcy5fX2luZGljYXRpb24pKXtcblx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9Ce0YLRgNC40YHQvtCy0LDQvdC+Jyx0aGlzLmJsb2NrKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5zaG93KSB7XG5cdFx0XHRzZXRUaW1lb3V0KCgpPT57XG5cdFx0XHRcdHRoaXMuc2hvdygpXG5cdFx0XHR9KTtcblx0XHRcdGlmICh3aW5kb3cuZGV2ZWxvcG1lbnQgfHwgdGhpcy5fX2luZGljYXRpb24pe1xuXHRcdFx0XHRjb25zb2xlLmxvZyh0aGlzLmlkLCfQkNC90LjQvNC40YDQvtCy0LDQvdC+Jyx0aGlzLmJsb2NrKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly9kcmF3U3RhcnQgLT4g0LrQvtC90LXRhiDQvtGC0YDQuNGB0L7QstC60Lhcblx0XHR0aGlzLl9fZHJhd1N0YXJ0ID0gZmFsc2U7XG5cblx0fVxuXG5cdGdldCBkZWxldGUoKSB7XG5cdFx0aWYgKHRoaXMuY2hpbGRyZW5BcnJheS5sZW5ndGgpIHtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IHRoaXMuY2hpbGRyZW5BcnJheS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuXHRcdFx0XHR0aGlzLmNoaWxkcmVuW2ldLmRlbGV0ZTtcblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmhpZGUpIHtcblx0XHRcdGxldCBhID0gdGhpcy5oaWRlKCkudGhlbigoKT0+e1xuXG5cdFx0XHRcdGlmICh0aGlzLmNoaWxkcmVuSGlkZU1vZHVsZXMgJiYgdGhpcy5jaGlsZHJlbkhpZGVNb2R1bGVzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFByb21pc2UuYWxsKHRoaXMuY2hpbGRyZW5IaWRlTW9kdWxlcykudGhlbih2YWx1ZSA9PiB7XG5cblx0XHRcdFx0XHRcdHRoaXMuX19kcmF3ZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdHRoaXMuYmxvY2sucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHRpZiAod2luZG93LmRldmVsb3BtZW50IHx8IHRoaXMuX19pbmRpY2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9Ct0LvQtdC80LXQvdGCINGD0LTQsNC70LXQvScpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0scmVhc29uID0+IHtcblx0XHRcdFx0XHRcdGNvbnNvbGUud2Fybign0J/RgNC+0LHQu9C10LzRiyDQstGL0L/QvtC70L3QtdC90LjRjyDQv9GA0L7RgdC40LzQsCDQsNC90LjQvNCw0YbQuNC4Jyx0aGlzLmlkKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRoaXMuX19kcmF3ZWQgPSBmYWxzZTtcblx0XHRcdFx0XHR0aGlzLmJsb2NrLnJlbW92ZSgpO1xuXG5cdFx0XHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbikge1xuXHRcdFx0XHRcdFx0Y29uc29sZS5sb2codGhpcy5pZCwn0K3Qu9C10LzQtdC90YIg0YPQtNCw0LvQtdC9Jyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5jaGlsZHJlbkhpZGVNb2R1bGVzID0gW107XG5cdFx0XHRcdC8vIGVuZCB0aGVuXG5cdFx0XHR9KTtcblxuXHQgICAgLy8g0L/QvtGB0LzQvtGC0YDQtdGC0Ywg0LPQtNC1INC40YHQv9C+0LvRjNC30YPQtdGC0YHRjyDQuCDRg9Cx0YDQsNGC0Ywg0LXRgdGC0Ywg0L3QtSDQvdGD0LbQvdC+XG5cdFx0XHQvLyB3aW5kb3cuaGlkZU1vZHVsZXMucHVzaChhKTtcblx0XHRcdGlmICh0aGlzLmZhdGhlcikge1xuXHRcdFx0XHR0aGlzLmZhdGhlci5jaGlsZHJlbkhpZGVNb2R1bGVzLnB1c2goYSk7XG5cblx0XHRcdFx0aWYgKHRoaXMuY2hpbGRyZW5IaWRlTW9kdWxlcyAmJiB0aGlzLmNoaWxkcmVuSGlkZU1vZHVsZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dGhpcy5mYXRoZXIuY2hpbGRyZW5IaWRlTW9kdWxlcy5wdXNoKFByb21pc2UuYWxsKHRoaXMuY2hpbGRyZW5IaWRlTW9kdWxlcykpO1xuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fX2RyYXdlZCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5ibG9jay5yZW1vdmUoKTtcblxuXHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbikge1xuXHRcdFx0XHRjb25zb2xlLmxvZyh0aGlzLmlkLCfQrdC70LXQvNC10L3RgiDRg9C00LDQu9C10L0nKTtcblx0XHRcdH1cblx0XHR9XG5cblx0fVxuXG5cdHNldCBkYXRhKHVybCkge1xuXHRcdGlmICh0aGlzLnVybCA9PSB1cmwpIHtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9fY2hhbmdlZENhY2hlID0gdHJ1ZTtcblx0XHRcdHRoaXMudXJsID0gdXJsO1xuXHRcdFx0dGhpcy5jYWNoZUNvbnRyb2wodGhpcy51cmwpXG5cdFx0fVxuXHR9XG5cblx0Z2V0IGRhdGEoKSB7XG5cdFx0aWYgKHRoaXMudXJsKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5jYWNoZUNvbnRyb2wodGhpcy51cmwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgZXJyb3IgPSAgbmV3IEVycm9yKCfQl9Cw0L/RgNC+0YjQtdC90Ysg0LTQsNC90L3Ri9C1LCDQutC+0YLQvtGA0YvRhSDQvdC10YIuJyk7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IodGhpcy5pZCwn0JIgdGhpcy51cmwg0L3QtdGCINC00LDQvdC90YvRhSDQviDRgdGB0YvQu9C60LUsINC/0L4g0LrQvtGC0L7RgNC+0Lkg0LTQvtC70LbQvdGLINCx0YvQu9C4INC30LDQs9GA0YPQt9C40YLRjNGB0Y8g0LTQsNC90L3Ri9C1LicsZXJyb3Iuc3RhY2spO1xuXG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblxuXHRzZXQgbG9jYWxEYXRhKGRhdGEpIHtcblx0XHQvLyBkZWJ1Z2dlclxuXHRcdGlmICh0aGlzLl9fbG9jYWxEYXRhICE9PSBkYXRhKSB7XG5cdFx0XHR0aGlzLl9fbG9jYWxEYXRhID0gZGF0YTtcblx0XHRcdHRoaXMuX19jaGFuZ2VkQ2FjaGUgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdGdldCBsb2NhbERhdGEoKSB7XG5cdFx0aWYgKHRoaXMuX19sb2NhbERhdGEpIHtcblx0XHRcdHJldHVybiB0aGlzLl9fbG9jYWxEYXRhO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgZXJyb3IgPSAgbmV3IEVycm9yKCfQl9Cw0L/RgNC+0YjQtdC90Ysg0LTQsNC90L3Ri9C1LCDQutC+0YLQvtGA0YvRhSDQvdC10YIuJyk7XG5cdFx0XHRjb25zb2xlLmVycm9yKHRoaXMuaWQsJ9Cd0LXRgtGDINC70L7QutCw0LvRjNC90YvRhSDQtNCw0L3QvdGL0YUnLGVycm9yLnN0YWNrKTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXG5cdGNhY2hlQ29udHJvbCh1cmwsb3B0aW9ucyxwcmVsb2FkKSB7XG5cdFx0Ly/Qt9Cw0YnQuNGC0LAg0L7RgiDQtNCy0L7QudC90L7Qs9C+INC60LvQuNC60LBcblx0XHQvLyBwcmVsb2FkID09IHRydWUg0LTQsNC10YIg0L/QvtC00LPRgNGD0LfQuNGC0Ywg0LTQsNC90L3Ri9C1INC90LXQt9Cw0LLQuNGB0LjQvNC+INC+0YIg0LfQsNCz0YDRg9C30LrQuCDQvtGB0L3QvtCy0L3Ri9GFINC00LDQvdC90YvRhS5cblx0XHRpZiAodGhpcy5sb2FkaW5nICYmICFwcmVsb2FkKSByZXR1cm4gdGhpc1t1cmxdO1xuXHRcdC8vXG5cdFx0aWYgKCF0aGlzLmNhY2hlKSB7XG5cdFx0XHR0aGlzLmxvYWREYXRhKHVybCwgb3B0aW9ucyk7XG5cdFx0XHRyZXR1cm4gdGhpc1t1cmxdO1xuXHRcdH1cblxuXHRcdGlmICghdGhpc1t1cmxdIHx8ICF0aGlzLl9fZGF0YVt1cmxdKXtcblx0XHRcdHRoaXMubG9hZERhdGEodXJsLCBvcHRpb25zKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHdpbmRvdy5kZXZlbG9wbWVudCB8fCB0aGlzLl9faW5kaWNhdGlvbil7XG5cdFx0XHRcdGNvbnNvbGUubG9nKHRoaXMuaWQsJ9CS0LfRj9GC0L4g0LjQtyDQutGN0YjQsCcsdXJsKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuICh0aGlzLl9fZGF0YVt1cmxdICYmIFByb21pc2UucmVzb2x2ZSh0aGlzLl9fZGF0YVt1cmxdKSkgfHwgdGhpc1t1cmxdO1xuXHR9XG5cblx0bG9hZERhdGEodXJsLCBvcHRpb25zID0ge30pIHtcblxuXHRcdGlmICh3aW5kb3cuZGV2ZWxvcG1lbnQgfHwgdGhpcy5fX2luZGljYXRpb24pIHtcblx0XHRcdGlmICghdXJsKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ9Cd0LXRgtGDINGB0YHRi9C70LrQuCDQvdCwINC00LDQvdC90YvQtScpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcmVxdWVzdCgpIHtcblx0XHRcdHRoaXMubG9hZGluZyA9IHRydWU7XG5cblx0XHRcdGxldCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblx0XHRcdGxldCBtZXRob2QgPSBvcHRpb25zLm1ldGhvZCB8fCAnR0VUJztcblxuXHRcdFx0eGhyLm9wZW4obWV0aG9kLHVybCwgdHJ1ZSk7XG5cblx0XHRcdGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoICggcmVzb2x2ZSwgcmVqZWN0ICkgPT4ge1xuXHRcdFx0XHR4aHIub25sb2FkID0gKCkgPT4ge1xuXHRcdFx0XHRcdGlmICh4aHIuc3RhdHVzICE9PSAyMDApIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGlmICh3aW5kb3cuZGV2ZWxvcG1lbnQgfHwgdGhpcy5fX2luZGljYXRpb24pe1xuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyh0aGlzLmlkLHRoaXNbdXJsXSwgdXJsLCfRgdC60LDRh9Cw0L3QvicpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsZXQgZGF0YTtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGRhdGEgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0XHRkYXRhID0geGhyLnJlc3BvbnNlVGV4dDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cmVzb2x2ZShkYXRhKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5fX2RhdGFbdXJsXSA9IGRhdGE7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0eGhyLm9uZXJyb3IgPSAoZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXHRcdFx0XHRcdGxldCBlcnJvciA9IG5ldyBFcnJvcih4aHIuc3RhdHVzICsgJzogJyArIHhoci5zdGF0dXNUZXh0KTtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IodGhpcy5pZCwnQWpheCBlcnJvcicsIGVycm9yLCB1cmwpO1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzW3VybF07XG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvL9Cy0YHQtdCz0LTQsCDQsdC10Lcg0LrRjdGI0LAsINC10LPQviDQtNC10LvQsNC10YIg0L/RgNC40LvQvtC20LXQvdC40LVcblx0XHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NhY2hlLUNvbnRyb2wnLCAnbm8tY2FjaGUnKTtcblxuXHRcdFx0XHRtZXRob2QgPT0gJ1BPU1QnID8geGhyLnNlbmQob3B0aW9ucy5ib2R5KTogeGhyLnNlbmQoKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzW3VybF0gPSBwcm9taXNlO1xuXHRcdFx0cmV0dXJuIHByb21pc2U7XG5cdFx0fVxuXHRcdGxldCBwcm9taXNlID0gcmVxdWVzdC5jYWxsKHRoaXMpO1xuXG5cdFx0cmV0dXJuIHByb21pc2Vcblx0XHRcdFx0LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gcmVxdWVzdC5jYWxsKHRoaXMpO1xuXHRcdFx0XHR9KTtcblx0fVxufVxuXG5cbmV4cG9ydCBjbGFzcyBSb3V0ZXIge1xuXHRjb25zdHJ1Y3RvcihzdHJ1Y3R1cmUsIG9wdGlvbnMgPSB7fSkge1xuXHRcdHRoaXMuX19pbmRpY2F0aW9uID0gb3B0aW9ucy5pbmRpY2F0aW9uIHx8IG51bGw7XG5cblx0XHRpZiAoc3RydWN0dXJlKSB7XG5cdFx0XHR0aGlzLnJvdXRlKHN0cnVjdHVyZSlcblx0XHR9XG5cdH1cblxuXG5cdHN0cnVjdHVyZShvYmplY3QpIHtcblx0XHRmdW5jdGlvbiBfX3BhcnNlKGVsZW1lbnQsY2hpbGRyZW4pIHtcblx0XHRcdGVsZW1lbnQucmVtb3ZlQ2hpbGRyZW47XG5cblx0XHRcdGVsZW1lbnQuY2hhbmdlZENoaWxkcmVucyA9IHRydWU7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0bGV0IGNoaWxkID0gY2hpbGRyZW5baV07XG5cdFx0XHRcdGlmIChjaGlsZC5lbGVtZW50KSB7XG5cdFx0XHRcdFx0X19wYXJzZShjaGlsZC5lbGVtZW50LGNoaWxkLnN1YmplY3RzKTtcblx0XHRcdFx0XHRlbGVtZW50LmNoaWxkID0gY2hpbGQuZWxlbWVudDtcblx0XHRcdFx0XHRjaGlsZC5lbGVtZW50LmZhdGhlciA9IGVsZW1lbnQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWxlbWVudC5jaGlsZCA9IGNoaWxkO1xuXHRcdFx0XHRcdGNoaWxkLmZhdGhlciA9IGVsZW1lbnQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuYWN0aXZlU3RydWN0dXJlKSB7XG5cdFx0XHQvLyB0aGlzLmFjdGl2ZVN0cnVjdHVyZS5lbGVtZW50LmRlbGV0ZTtcblxuXHRcdFx0aWYgKHRoaXMuYWN0aXZlU3RydWN0dXJlID09IG9iamVjdCkgcmV0dXJuO1xuXG5cdFx0XHRsZXQgYWN0aXZlRWxlbWVudHMgPSBbXTtcblx0XHRcdGxldCBuZXdFbGVtZW50cyA9IFtdO1xuXG5cdFx0XHRfX3BhcnNlRm9yRGVsZXRlKHRoaXMuYWN0aXZlU3RydWN0dXJlLGFjdGl2ZUVsZW1lbnRzKTtcblx0XHRcdF9fcGFyc2VGb3JEZWxldGUob2JqZWN0LG5ld0VsZW1lbnRzKTtcblxuXHRcdFx0Ly8gYWN0aXZlRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihhY3RpdmVJdGVtKXtcblx0XHRcdC8vIFx0bmV3RWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihuZXdJdGVtLG5ld0l0ZW1JbmRleCl7XG5cdFx0XHQvLyBcdFx0aWYgKGFjdGl2ZUl0ZW0gIT0gbmV3SXRlbSAmJiBuZXdJdGVtSW5kZXggPT0gbmV3SXRlbXNDb3VudCkge1xuXHRcdFx0Ly8gXHRcdFx0YWN0aXZlSXRlbS5kZWxldGU7XG5cdFx0XHQvLyBcdFx0fVxuXHRcdFx0Ly8gXHR9KTtcblx0XHRcdC8vIH0pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IGFjdGl2ZUVsZW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdFx0XHRcdGFjdGl2ZUVsZW1lbnRzW2ldLnJlbW92ZUNoaWxkcmVuO1xuXHRcdFx0XHRmb3IgKHZhciBxID0gbmV3RWxlbWVudHMubGVuZ3RoIC0gMTsgcSA+PSAwOyBxLS0pIHtcblxuXHRcdFx0XHRcdGlmIChhY3RpdmVFbGVtZW50c1tpXSA9PSBuZXdFbGVtZW50c1txXSkgYnJlYWs7XG5cblx0XHRcdFx0XHRpZiAocSA9PSAwKSB7XG5cdFx0XHRcdFx0XHRhY3RpdmVFbGVtZW50c1tpXS5kZWxldGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblxuXHRcdH1cblx0XHR0aGlzLmFjdGl2ZVN0cnVjdHVyZSA9IG9iamVjdDtcblx0XHRfX3BhcnNlKG9iamVjdC5lbGVtZW50LG9iamVjdC5zdWJqZWN0cyk7XG5cblx0XHQvLyBhc2RzZC5zdHJ1Y3R1cmUoe1xuXHRcdC8vIFx0ZWxlbWVudDogbmF2LFxuXHRcdC8vIFx0Y2hpbGRyZW46IFtcblx0XHQvLyBcdFx0cGFnZTEsXG5cdFx0Ly8gXHRcdHtcblx0XHQvLyBcdFx0XHRlbGVtZW50OnBhZ2UyLFxuXHRcdC8vIFx0XHRcdGNoaWxkcmVuOiBbXG5cdFx0Ly8gXHRcdFx0XHRuYXZCdXR0b24sXG5cdFx0Ly8gXHRcdFx0XHRjbG9zZUJ1dHRvblxuXHRcdC8vIFx0XHRcdF1cblx0XHQvLyBcdFx0fVxuXHRcdC8vIFx0XVxuXHRcdC8vIH0pO1xuXG5cdFx0ZnVuY3Rpb24gX19wYXJzZUZvckRlbGV0ZShvYmplY3QsYXJyYXkpe1xuXHRcdFx0YXJyYXkucHVzaChvYmplY3QuZWxlbWVudCk7XG5cdFx0XHRvYmplY3Quc3ViamVjdHMuZm9yRWFjaChmdW5jdGlvbihpdGVtLGluZGV4KXtcblx0XHRcdFx0aWYgKGl0ZW0uc3ViamVjdHMpIHtcblx0XHRcdFx0XHRfX3BhcnNlRm9yRGVsZXRlKGl0ZW0sYXJyYXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFycmF5LnB1c2goaXRlbSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0cm91dGUocGFnZXMpe1xuXHRcdGxldCBocmVmID0gbG9jYXRpb24ucGF0aG5hbWU7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHBhZ2VzW2ldLmxpbmsgPT0gaHJlZikge1xuXHRcdFx0XHR0aGlzLnN0cnVjdHVyZShwYWdlc1tpXS5zdHJ1Y3R1cmUpO1xuXHRcdFx0XHRwYWdlc1tpXS5zdHJ1Y3R1cmUuZWxlbWVudC5kcmF3O1xuXHRcdFx0XHRzY3JvbGxUbygwLDApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH0gZWxzZSBpZiAoaSA9PT0gcGFnZXMubGVuZ3RoIC0gMSl7XG5cdFx0XHRcdGNvbnNvbGUud2Fybign0J/QvtC00YXQvtC00Y/RidCw0Y8g0YHRgdGL0LvQutCwINC90LUg0L3QsNC50LTQtdC90LAnKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gcGFnZXMg0Y3RgtC+INC80LDRgdGB0LjQsiDQuNC3INGB0YLRgNGD0LrRgtGD0YAo0L7QsdGK0LXQutGC0L7Qsilcblx0XHRhZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBldmVudCA9PiB7XG5cdFx0XHRjb25zdCBlbCA9IChldmVudC50YXJnZXQudGFnTmFtZSA9PSAnQScgJiYgZXZlbnQudGFyZ2V0KSB8fCBldmVudC50YXJnZXQuY2xvc2VzdCgnYScpO1xuXHRcdFx0aWYgKGVsKSB7XG5cblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGxldCBocmVmID0gZWwuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG5cdFx0XHRcdFx0aWYgKHBhZ2VzW2ldLmxpbmsgPT0gaHJlZikge1xuXHRcdFx0XHRcdFx0dGhpcy5zdHJ1Y3R1cmUocGFnZXNbaV0uc3RydWN0dXJlKTtcblx0XHRcdFx0XHRcdHBhZ2VzW2ldLnN0cnVjdHVyZS5lbGVtZW50LmRyYXc7XG5cdFx0XHRcdFx0XHRzY3JvbGxUbygwLDApO1xuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdGhpc3RvcnkucHVzaFN0YXRlKHtocmVmfSwnJyxocmVmKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaSA9PT0gcGFnZXMubGVuZ3RoIC0gMSl7XG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oJ9Cf0L7QtNGF0L7QtNGP0YnQsNGPINGB0YHRi9C70LrQsCDQvdC1INC90LDQudC00LXQvdCwJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0pO1xuXG5cdFx0YWRkRXZlbnRMaXN0ZW5lciggJ3BvcHN0YXRlJywgZXZlbnQgPT4ge1xuXG5cdFx0XHRjb25zdCBocmVmID0gZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHJlZiB8fCBsb2NhdGlvbi5wYXRobmFtZTtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocGFnZXNbaV0ubGluayA9PSBocmVmKSB7XG5cdFx0XHRcdFx0dGhpcy5zdHJ1Y3R1cmUocGFnZXNbaV0uc3RydWN0dXJlKTtcblx0XHRcdFx0XHRwYWdlc1tpXS5zdHJ1Y3R1cmUuZWxlbWVudC5kcmF3O1xuXHRcdFx0XHRcdHNjcm9sbFRvKDAsMCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaSA9PT0gcGFnZXMubGVuZ3RoIC0gMSl7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCfQn9C+0LTRhdC+0LTRj9GJ0LDRjyDRgdGB0YvQu9C60LAg0L3QtSDQvdCw0LnQtNC10L3QsCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRzZXRQYWdlKCl7XG5cblx0fVxufVxuIiwiaW1wb3J0IFBhZ2VEcmF3IGZyb20gJ2RyYXctbW9kdWxlJztcbmltcG9ydCBUcmFuc2l0aW9uRW5kIGZyb20gJy4uLy4uL2xheW91dC9qcy90cmFuc2l0aW9uRW5kJztcbmltcG9ydCBTY3JvbGwgZnJvbSAnLi4vLi4vbGF5b3V0L2pzL3Njcm9sbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIHtcblx0Y29uc3RydWN0b3IoKXtcblx0XHR0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb250YWluZXJfX21hcCcpO1xuXG5cdFx0aWYgKCF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xuXG5cdFx0Y29uc3QgX3RoaXMgPSB0aGlzO1xuXG5cdFx0dGhpcy5wYWdlRHJhdyA9IG5ldyBQYWdlRHJhdyh7XG5cdFx0XHRwb3NpdGlvbjogJ2JlZm9yZWVuZCAubWFwX19jb250ZW50Jyxcblx0XHRcdGNsYXNzOidtYXBfX2NvbnRlbnQtcG9wdXAnLFxuXHRcdFx0Y29udGVudDooZGF0YSkgPT4ge1xuXHRcdFx0XHRjb25zdCB7bmFtZSA9ICcnLCBhZHZhbnRhZ2VzfSA9IGRhdGE7XG5cdFx0XHRcdGxldCBsaSA9ICcnO1xuXG5cdFx0XHRcdGFkdmFudGFnZXMuZm9yRWFjaCgoaXRlbSk9Pntcblx0XHRcdFx0XHRsZXQge0FuYW1lLEF0ZXh0fSA9IGl0ZW07XG5cdFx0XHRcdFx0bGkgKz0gYFxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYXBfX2NvbnRlbnQtcG9wdXBJdGVtXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2PiR7QW5hbWV9PC9kaXY+PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIj4ke0F0ZXh0fTwvYT5cblx0XHRcdFx0XHQ8L2Rpdj5gO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZXR1cm4gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXBfX2NvbnRlbnQtcG9wdXBOYW1lXCI+JHtuYW1lfTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXBfX2NvbnRlbnQtcG9wdXBDbG9zZVwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXBfX2NvbnRlbnQtcG9wdXBDb250ZW50XCI+XG4gICAgICAgICAgICAke2xpfVxuICAgICAgICAgIDwvZGl2PlxuXHRcdFx0XHRgO1xuXHRcdFx0fSxcblx0XHRcdHNob3coKXtcblx0XHRcdFx0dGhpcy5ibG9jay5xdWVyeVNlbGVjdG9yKCcubWFwX19jb250ZW50LXBvcHVwQ2xvc2UnKS5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBldmVudCA9PiB7XG5cdFx0XHRcdFx0X3RoaXMucGFnZURyYXcuZGVsZXRlO1xuXG5cdFx0XHRcdFx0aWYgKF90aGlzLmRhdGEpIHtcblx0XHRcdFx0XHRcdF90aGlzLnJpZ2h0SW5mby5kZWxldGU7XG5cdFx0XHRcdFx0XHRfdGhpcy5yaWdodEluZm8ubG9jYWxEYXRhID0gX3RoaXMuZGF0YS5kZWZhdWx0O1xuXHRcdFx0XHRcdFx0X3RoaXMucmlnaHRJbmZvLmRyYXc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5ibG9jay5jbG9zZXN0KCcubWFwX19jb250ZW50JykuY2xhc3NMaXN0LmFkZCgndzEwMCcpO1xuXHRcdFx0XHR0aGlzLmJsb2NrLmNsYXNzTGlzdC5hZGQoJ21hcF9fY29udGVudC1wb3B1cC0tYW5pbWF0ZWQnKTtcblx0XHRcdH0sXG5cdFx0XHRoaWRlKCl7XG5cdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5ibG9jay5jbGFzc0xpc3QucmVtb3ZlKCdtYXBfX2NvbnRlbnQtcG9wdXAtLWFuaW1hdGVkJyk7XG5cdFx0XHRcdFx0bGV0IGEgPSBuZXcgVHJhbnNpdGlvbkVuZCh7XG5cdFx0XHRcdFx0XHRlbGVtZW50OiB0aGlzLmJsb2NrLFxuXHRcdFx0XHRcdFx0Y2FsbGJhY2s6KCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmJsb2NrLmNsb3Nlc3QoJy5tYXBfX2NvbnRlbnQnKS5jbGFzc0xpc3QucmVtb3ZlKCd3MTAwJyk7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0YS5lbmQoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMucmlnaHRJbmZvID0gbmV3IFBhZ2VEcmF3KHtcblx0XHRcdHBvc2l0aW9uOiAnYWZ0ZXJiZWdpbiAubWFwX19jb250ZW50Jyxcblx0XHRcdGNsYXNzOidtYXBfX2Rlc2NyaXB0aW9uJyxcblx0XHRcdGNvbnRlbnQ6KGRhdGEpPT57XG5cdFx0XHRcdGNvbnN0IHt0ZXh0fSA9IGRhdGE7XG5cblx0XHRcdFx0cmV0dXJuIGBcblx0XHRcdFx0PGRpdiBzdHlsZT1cInBvc2l0aW9uOnJlbGF0aXZlO21hcmdpbi1yaWdodDotMzVweDtwYWRkaW5nLXJpZ2h0OjM1cHg7b3ZlcmZsb3c6aGlkZGVuO1wiPlxuXHRcdFx0XHRcdDxkaXYgZGF0YS1zY3JvbGwgc3R5bGU9XCJtYXgtaGVpZ2h0OiA1NTBweDsgb3ZlcmZsb3cteTphdXRvO292ZXJmbG93LXg6aGlkZGVuO2hlaWdodDogNTUwcHg7XCI+XG5cdFx0XHRcdFx0PHA+JHt0ZXh0fTwvcD5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdGA7XG5cdFx0XHR9LFxuXHRcdFx0Y2FsbGJhY2soKXtcblx0XHRcdFx0bmV3IFNjcm9sbCh0aGlzLmJsb2NrLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNjcm9sbF0nKSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR2YXIgZGF0YSA9IGZldGNoKCcvYXBpL2RhdGFGb3JNYXAnKVxuXHRcdFx0LnRoZW4oIGRhdGEgPT4gZGF0YS5qc29uKCkgKVxuXHRcdFx0LnRoZW4oIGRhdGEgPT4ge1xuXG5cdFx0XHRcdF90aGlzLmRhdGEgPSBkYXRhO1xuXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKGRhdGEpO1xuXG5cdFx0XHRcdHRoaXMucmlnaHRJbmZvLmxvY2FsRGF0YSA9IGRhdGEuZGVmYXVsdDtcblx0XHRcdFx0dGhpcy5yaWdodEluZm8uZHJhdztcblxuXHRcdFx0XHRsZXQgZGF0YUNvdW50ID0gMDtcblx0XHRcdFx0Wy4uLnRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5va3J1ZycpXS5mb3JFYWNoKGl0ZW0gPT4ge1xuXHRcdFx0XHRcdGl0ZW0uYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgZXZlbnQgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coaXRlbS5pZCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkYXRhRm9yT2tydWcgPSBPYmplY3QuYXNzaWduKHt9LCBkYXRhLmRlZmF1bHQsIGRhdGFbaXRlbS5pZF0pO1xuXG5cdFx0XHRcdFx0XHR0aGlzLnBhZ2VEcmF3LmxvY2FsRGF0YSA9IGRhdGFGb3JPa3J1Zztcblx0XHRcdFx0XHRcdHRoaXMucGFnZURyYXcuZHJhdztcblxuXHRcdFx0XHRcdFx0dGhpcy5yaWdodEluZm8uZGVsZXRlO1xuXHRcdFx0XHRcdFx0dGhpcy5yaWdodEluZm8ubG9jYWxEYXRhID0gZGF0YUZvck9rcnVnO1xuXHRcdFx0XHRcdFx0dGhpcy5yaWdodEluZm8uZHJhdztcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKCBlID0+IHtcblx0XHRcdFx0Y29uc29sZS53YXJuKCfQndC10YIganNvbiDQtNCw0L3QvdGL0YUg0LTQu9GPINC60LDRgNGC0YssINGB0LrRgNC40L/RgiDQvdC1INC+0YLRgNCw0LHQsNGC0YvQstCw0LXRgicsZSk7XG5cdFx0XHR9KTtcblx0fVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgZ29vZ2xlTWFwIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dmFyIGNvbnRhY3RzTWFwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLWdvb2dsZU1hcCcpO1xuXHRcdHZhciBtYXJrZXJJY29uID0gY29udGFjdHNNYXAuZGF0YXNldC5tYXBNYXJrZXI7XG5cdFx0dmFyIGNlbnRlciA9IHsgbGF0OiBjb250YWN0c01hcC5kYXRhc2V0LmNlbnRlckxhdCoxLCBsbmc6IGNvbnRhY3RzTWFwLmRhdGFzZXQuY2VudGVyTG5nKjEgfTtcblxuXHRcdHZhciBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKGNvbnRhY3RzTWFwLCB7XG5cdFx0XHR6b29tOiAxNyxcblx0XHRcdGNlbnRlcjogY2VudGVyLFxuXHRcdFx0c2Nyb2xsd2hlZWw6IGZhbHNlLFxuXHRcdFx0em9vbUNvbnRyb2w6IGZhbHNlLFxuXHRcdFx0bWFwVHlwZUNvbnRyb2w6IGZhbHNlLFxuXHRcdFx0c2NhbGVDb250cm9sOiB0cnVlLFxuXHRcdFx0c3RyZWV0Vmlld0NvbnRyb2w6IGZhbHNlLFxuXHRcdFx0cm90YXRlQ29udHJvbDogZmFsc2UsXG5cdFx0XHRmdWxsc2NyZWVuQ29udHJvbDogZmFsc2UsXG5cdFx0XHRzdHlsZXM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwiZmVhdHVyZVR5cGVcIjogXCJhZG1pbmlzdHJhdGl2ZVwiLFxuXHRcdFx0XHRcdFwiZWxlbWVudFR5cGVcIjogXCJhbGxcIixcblx0XHRcdFx0XHRcInN0eWxlcnNcIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcInNhdHVyYXRpb25cIjogXCItMTAwXCJcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcImZlYXR1cmVUeXBlXCI6IFwiYWRtaW5pc3RyYXRpdmUucHJvdmluY2VcIixcblx0XHRcdFx0XHRcImVsZW1lbnRUeXBlXCI6IFwiYWxsXCIsXG5cdFx0XHRcdFx0XCJzdHlsZXJzXCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJ2aXNpYmlsaXR5XCI6IFwib2ZmXCJcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIHtcblx0XHRcdFx0Ly8gICAgIFwiZmVhdHVyZVR5cGVcIjogXCJsYW5kc2NhcGVcIixcblx0XHRcdFx0Ly8gICAgIFwiZWxlbWVudFR5cGVcIjogXCJhbGxcIixcblx0XHRcdFx0Ly8gICAgIFwic3R5bGVyc1wiOiBbXG5cdFx0XHRcdC8vICAgICAgICAge1xuXHRcdFx0XHQvLyAgICAgICAgICAgICBcInNhdHVyYXRpb25cIjogLTEwMFxuXHRcdFx0XHQvLyAgICAgICAgIH0sXG5cdFx0XHRcdC8vICAgICAgICAge1xuXHRcdFx0XHQvLyAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiA2NVxuXHRcdFx0XHQvLyAgICAgICAgIH0sXG5cdFx0XHRcdC8vICAgICAgICAge1xuXHRcdFx0XHQvLyAgICAgICAgICAgICBcInZpc2liaWxpdHlcIjogXCJvblwiXG5cdFx0XHRcdC8vICAgICAgICAgfVxuXHRcdFx0XHQvLyAgICAgXVxuXHRcdFx0XHQvLyB9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJmZWF0dXJlVHlwZVwiOiBcImxhbmRzY2FwZVwiLFxuXHRcdFx0XHRcdFwiZWxlbWVudFR5cGVcIjogXCJsYWJlbHNcIixcblx0XHRcdFx0XHRcInN0eWxlcnNcIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcInNhdHVyYXRpb25cIjogLTEwMFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJsaWdodG5lc3NcIjogNjVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwidmlzaWJpbGl0eVwiOiBcIm9uXCJcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcImZlYXR1cmVUeXBlXCI6IFwicG9pLnNwb3J0c19jb21wbGV4XCIsXG5cdFx0XHRcdFx0XCJlbGVtZW50VHlwZVwiOiBcImFsbFwiLFxuXHRcdFx0XHRcdFwic3R5bGVyc1wiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwidmlzaWJpbGl0eVwiOiBcIm9mZlwiXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJmZWF0dXJlVHlwZVwiOiBcInBvaS5nb3Zlcm5tZW50XCIsXG5cdFx0XHRcdFx0XCJlbGVtZW50VHlwZVwiOiBcImFsbFwiLFxuXHRcdFx0XHRcdFwic3R5bGVyc1wiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwidmlzaWJpbGl0eVwiOiBcIm9mZlwiXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJmZWF0dXJlVHlwZVwiOiBcInBvaS5zY2hvb2xcIixcblx0XHRcdFx0XHRcImVsZW1lbnRUeXBlXCI6IFwiYWxsXCIsXG5cdFx0XHRcdFx0XCJzdHlsZXJzXCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJ2aXNpYmlsaXR5XCI6IFwib2ZmXCJcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcImZlYXR1cmVUeXBlXCI6IFwicG9pLmF0dHJhY3Rpb25cIixcblx0XHRcdFx0XHRcImVsZW1lbnRUeXBlXCI6IFwiYWxsXCIsXG5cdFx0XHRcdFx0XCJzdHlsZXJzXCI6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJzYXR1cmF0aW9uXCI6IC0xMDBcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwibGlnaHRuZXNzXCI6IFwiNTBcIlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJ2aXNpYmlsaXR5XCI6IFwib2ZmXCJcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIHtcblx0XHRcdFx0Ly8gICAgIFwiZmVhdHVyZVR5cGVcIjogXCJwb2lcIixcblx0XHRcdFx0Ly8gICAgIFwiZWxlbWVudFR5cGVcIjogXCJhbGxcIixcblx0XHRcdFx0Ly8gICAgIFwic3R5bGVyc1wiOiBbXG5cdFx0XHRcdC8vICAgICAgICAge1xuXHRcdFx0XHQvLyAgICAgICAgICAgICBcInNhdHVyYXRpb25cIjogLTEwMFxuXHRcdFx0XHQvLyAgICAgICAgIH0sXG5cdFx0XHRcdC8vICAgICAgICAge1xuXHRcdFx0XHQvLyAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiBcIjUwXCJcblx0XHRcdFx0Ly8gICAgICAgICB9LFxuXHRcdFx0XHQvLyAgICAgICAgIHtcblx0XHRcdFx0Ly8gICAgICAgICAgICAgXCJ2aXNpYmlsaXR5XCI6IFwib2ZmXCJcblx0XHRcdFx0Ly8gICAgICAgICB9XG5cdFx0XHRcdC8vICAgICBdXG5cdFx0XHRcdC8vIH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcImZlYXR1cmVUeXBlXCI6IFwicm9hZFwiLFxuXHRcdFx0XHRcdFwiZWxlbWVudFR5cGVcIjogXCJhbGxcIixcblx0XHRcdFx0XHRcInN0eWxlcnNcIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcInNhdHVyYXRpb25cIjogXCItMTAwXCJcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcImZlYXR1cmVUeXBlXCI6IFwicm9hZC5oaWdod2F5XCIsXG5cdFx0XHRcdFx0XCJlbGVtZW50VHlwZVwiOiBcImFsbFwiLFxuXHRcdFx0XHRcdFwic3R5bGVyc1wiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwidmlzaWJpbGl0eVwiOiBcInNpbXBsaWZpZWRcIlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmFydGVyaWFsXCIsXG5cdFx0XHRcdFx0XCJlbGVtZW50VHlwZVwiOiBcImFsbFwiLFxuXHRcdFx0XHRcdFwic3R5bGVyc1wiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwibGlnaHRuZXNzXCI6IFwiMzBcIlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmxvY2FsXCIsXG5cdFx0XHRcdFx0XCJlbGVtZW50VHlwZVwiOiBcImFsbFwiLFxuXHRcdFx0XHRcdFwic3R5bGVyc1wiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwibGlnaHRuZXNzXCI6IFwiNDBcIlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdFwiZmVhdHVyZVR5cGVcIjogXCJ0cmFuc2l0XCIsXG5cdFx0XHRcdFx0XCJlbGVtZW50VHlwZVwiOiBcImFsbFwiLFxuXHRcdFx0XHRcdFwic3R5bGVyc1wiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwic2F0dXJhdGlvblwiOiAtMTAwXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcInZpc2liaWxpdHlcIjogXCJzaW1wbGlmaWVkXCJcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRcImZlYXR1cmVUeXBlXCI6IFwid2F0ZXJcIixcblx0XHRcdFx0XHRcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnlcIixcblx0XHRcdFx0XHRcInN0eWxlcnNcIjogW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcImh1ZVwiOiBcIiNmZmZmMDBcIlxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJsaWdodG5lc3NcIjogLTI1XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcInNhdHVyYXRpb25cIjogLTk3XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0XCJmZWF0dXJlVHlwZVwiOiBcIndhdGVyXCIsXG5cdFx0XHRcdFx0XCJlbGVtZW50VHlwZVwiOiBcImxhYmVsc1wiLFxuXHRcdFx0XHRcdFwic3R5bGVyc1wiOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFwibGlnaHRuZXNzXCI6IC0yNVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XCJzYXR1cmF0aW9uXCI6IC0xMDBcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9KTtcblxuXHRcdC8vINC80LDRgNC60LXRgFxuXHRcdHZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHtcblx0XHRcdHBvc2l0aW9uOiB7bGF0OiBjb250YWN0c01hcC5kYXRhc2V0Lm1hcmtlckxhdCoxLCBsbmc6IGNvbnRhY3RzTWFwLmRhdGFzZXQubWFya2VyTG5nKjF9LFxuXHRcdFx0aWNvbjogbWFya2VySWNvbixcblx0XHRcdG1hcDogbWFwXG5cdFx0fSk7XG5cblx0XHQvLyDRhtC10L3RgtGA0LjRgNC+0LLQsNC90LjQtSDQutCw0YDRgtGLINC/0YDQuCDRgNC10YHQsNC50LfQtVxuXHRcdGdvb2dsZS5tYXBzLmV2ZW50LmFkZERvbUxpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGNlbnRlciA9IG1hcC5nZXRDZW50ZXIoKVxuXHRcdFx0Z29vZ2xlLm1hcHMuZXZlbnQudHJpZ2dlcihtYXAsIFwicmVzaXplXCIpXG5cdFx0XHRtYXAuc2V0Q2VudGVyKGNlbnRlcilcblx0XHR9KTtcblx0fVxufVxuIiwiLy8gaW1wb3J0IFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3dvd2pzL2Nzcy9saWJzL2FuaW1hdGUuY3NzXCI7XG5pbXBvcnQgTWFzb25yeSBmcm9tICdtYXNvbnJ5LWxheW91dC9kaXN0L21hc29ucnkucGtnZC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGluZm9DYXJkIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ21vYmlsZScpKSB7XG4gICAgLy8gICByZXR1cm4gdHJ1ZTtcbiAgICAvLyB9XG4gICAgbGV0IGluZm9DYXJkSFRNTCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbmZvQ2FyZCcpWzBdLm91dGVySFRNTDtcbiAgICBpbmZvQ2FyZEhUTUwgKz0gaW5mb0NhcmRIVE1MO1xuICAgIC8vIGxldCBpbmZvQ2FyZEhUTUwyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmluZm9DYXJkJylbMV0ub3V0ZXJIVE1MO1xuICAgIHdpbmRvdy5xd2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbmZvX19hcnJheScpWzBdLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJyxpbmZvQ2FyZEhUTUwpO1xuICAgICAgLy8gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmluZm9fX2FycmF5JylbMF0uaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLGluZm9DYXJkSFRNTDIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmluZm9fX2FycmF5Om5vdCguaW5mb19fYXJyYXktLXdpdGhvdXRNYXNvbnJ5KScpXS5mb3JFYWNoKCAoaXRlbSkgPT4ge1xuICAgICAgdmFyIG1zbnJ5ID0gbmV3IE1hc29ucnkoIGl0ZW0sIHtcbiAgICAgICAgLy8gb3B0aW9uc1xuICAgICAgICAvLyBjb2x1bW5XaWR0aDogMjUlLFxuICAgICAgICBpdGVtU2VsZWN0b3I6ICcuaW5mb0NhcmQnLFxuICAgICAgICBwZXJjZW50UG9zaXRpb246IHRydWUsXG4gICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbjogMCxcbiAgICAgICAgLy8gaG9yaXpvbnRhbE9yZGVyOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHRoaXMub2JzZXJ2ZXIobXNucnksIGl0ZW0pO1xuICAgIH0pO1xuICB9XG4gIG9ic2VydmVyKG1zbnJ5LCBwYXJlbnRJdGVtKSB7XG4gICAgbGV0IG11dCA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgIG11dGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKG11dGF0aW9uKSB7XG4gICAgICAgIFsuLi5tdXRhdGlvbi5hZGRlZE5vZGVzXS5mb3JFYWNoKCAoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbmZvQ2FyZCcpLmxlbmd0aCkge1xuICAgICAgICAgICAgWy4uLml0ZW0ucXVlcnlTZWxlY3RvckFsbCgnLmluZm9DYXJkJyldLmZvckVhY2goIChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgIG1zbnJ5LmFwcGVuZGVkKGl0ZW0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpdGVtLmNsYXNzTGlzdC5jb250YWlucygnaW5mb0NhcmQnKSkge1xuICAgICAgICAgICAgICBtc25yeS5hcHBlbmRlZChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdmFyIGNvbmZpZyA9IHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH07XG4gICAgbXV0Lm9ic2VydmUocGFyZW50SXRlbSwgY29uZmlnKTtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgYXVkaW9GaWxlIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCkge1xuICAgIHRoaXMuZWwgPSBlbGVtZW50O1xuXG4gICAgdGhpcy5hdWRpb1RyYWNrID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYXVkaW8nKTtcbiAgICB0aGlzLnBsYXlCdXR0b24gPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5Q29udHJvbHNfX2NvbnRyb2wnKTtcbiAgICB0aGlzLnByb2dyZXNzQmFyID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudGltZWxpbmVfX3Byb2dyZXNzQmFyJyk7XG4gICAgdGhpcy5wcm9ncmVzc0JhckhhbmRsZSA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnRpbWVsaW5lX19wcm9ncmVzc0hhbmRsZScpO1xuXG4gICAgdGhpcy52b2x1bWVCdXR0b24gPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wbGF5Q29udHJvbHNfX3ZvbHVtZScpO1xuICAgIHRoaXMudm9sdW1lVmFsdWUgPSB0aGlzLmF1ZGlvVHJhY2tbMF0udm9sdW1lO1xuICAgIHRoaXMudm9sdW1lQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4gdGhpcy5tdXRlVHJpZ2dlcigpKTtcblxuICAgIHRoaXMudGltZUR1cmF0aW9uID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucGxheUNvbnRyb2xzX19kdXJhdGlvbicpO1xuXG4gICAgdGhpcy50aW1lUGFzc2VkID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucGxheUNvbnRyb2xzX190aW1lUGFzc2VkJyk7XG4gICAgdGhpcy5zZXRTdGFydFRpbWUoKTtcbiAgICB0aGlzLmF1ZGlvVHJhY2tbMF0uYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGV2ZW50ID0+IHRoaXMudGltZVVwZGF0ZSgpKTtcbiAgICB0aGlzLmF1ZGlvVHJhY2tbMF0uYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBldmVudCA9PiB0aGlzLmVuZFBsYXkoKSk7XG4gICAgdGhpcy5hdWRpb1RyYWNrWzBdLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgZXZlbnQgPT4gdGhpcy5zZXREdXJhdGlvbigpKTtcbiAgICB0aGlzLmF1ZGlvVHJhY2tbMF0uYWRkRXZlbnRMaXN0ZW5lcigncGxheWluZycsIGV2ZW50ID0+IHRoaXMuc2V0RHVyYXRpb24oKSk7XG5cbiAgICB0aGlzLnBsYXlCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB0aGlzLnBsYXlUcmlnZ2VyKCkpO1xuICB9XG5cbiAgc2V0U3RhcnRUaW1lKCkge1xuICAgIHRoaXMudGltZVBhc3NlZC5pbm5lckhUTUwgPSAnMDA6MDAnO1xuICB9XG5cbiAgZ2V0RHVyYXRpb24oKSB7XG4gICAgdmFyIHNlY3MgPSB0aGlzLmF1ZGlvVHJhY2tbMF0uZHVyYXRpb247XG4gICAgdmFyIHNlY19udW0gPSBwYXJzZUludChzZWNzLCAxMClcbiAgICB2YXIgaG91cnMgICA9IE1hdGguZmxvb3Ioc2VjX251bSAvIDM2MDApICUgMjRcbiAgICB2YXIgbWludXRlcyA9IE1hdGguZmxvb3Ioc2VjX251bSAvIDYwKSAlIDYwXG4gICAgdmFyIHNlY29uZHMgPSBzZWNfbnVtICUgNjBcbiAgICByZXR1cm4gW2hvdXJzLG1pbnV0ZXMsc2Vjb25kc11cbiAgICAgICAgLm1hcCh2ID0+IHYgPCAxMCA/IFwiMFwiICsgdiA6IHYpXG4gICAgICAgIC5maWx0ZXIoKHYsaSkgPT4gdiAhPT0gXCIwMFwiIHx8IGkgPiAwKVxuICAgICAgICAuam9pbihcIjpcIilcbiAgfVxuXG4gIHNldER1cmF0aW9uKCkge1xuICAgIHRoaXMudGltZUR1cmF0aW9uLmlubmVySFRNTCA9IHRoaXMuZ2V0RHVyYXRpb24oKTtcbiAgfVxuXG4gIHBsYXlUcmlnZ2VyKCkge1xuICAgIGlmICh0aGlzLmF1ZGlvVHJhY2tbMF0ucGF1c2VkKSB7XG5cbiAgICAgIC8vINCS0YvQutC70Y7Rh9C10L3QuNC1INCy0YHQtdGFINC40LPRgNCw0Y7RidC40YUg0LDRg9C00LjQvlxuICAgICAgWy4uLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhdWRpbycpXS5mb3JFYWNoKCAoaXRlbSkgPT4ge1xuICAgICAgICBpdGVtLnBhdXNlKCk7XG4gICAgICB9KTtcbiAgICAgIFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGxheUNvbnRyb2xzX19jb250cm9sJyldLmZvckVhY2goIChpdGVtKSA9PiB7XG4gICAgICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgncGxheUNvbnRyb2xzX19jb250cm9sLS1wYXVzZScpO1xuICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoJ3BsYXlDb250cm9sc19fY29udHJvbC0tcGxheScpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYXVkaW9UcmFja1swXS5wbGF5KClcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGxheUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdwbGF5Q29udHJvbHNfX2NvbnRyb2wtLXBsYXknKTtcbiAgICAgICAgICB0aGlzLnBsYXlCdXR0b24uY2xhc3NMaXN0LmFkZCgncGxheUNvbnRyb2xzX19jb250cm9sLS1wYXVzZScpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbGF5QnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ3BsYXlDb250cm9sc19fY29udHJvbC0tcGF1c2UnKTtcbiAgICAgIHRoaXMucGxheUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdwbGF5Q29udHJvbHNfX2NvbnRyb2wtLXBsYXknKTtcbiAgICAgIHRoaXMuYXVkaW9UcmFja1swXS5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIGVuZFBsYXkoKSB7XG4gICAgdGhpcy5wbGF5QnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ3BsYXlDb250cm9sc19fY29udHJvbC0tcGF1c2UnKTtcbiAgICB0aGlzLnBsYXlCdXR0b24uY2xhc3NMaXN0LmFkZCgncGxheUNvbnRyb2xzX19jb250cm9sLS1wbGF5Jyk7XG4gIH1cblxuICB0aW1lVXBkYXRlKCkge1xuICAgIC8vINCe0LHQvdC+0LLQu9C10L3QuNC1INCy0YDQtdC80LXQvdC4XG4gICAgdmFyIHMgPSBwYXJzZUludCh0aGlzLmF1ZGlvVHJhY2tbMF0uY3VycmVudFRpbWUgJSA2MCk7XG4gICAgdmFyIG0gPSBwYXJzZUludCgodGhpcy5hdWRpb1RyYWNrWzBdLmN1cnJlbnRUaW1lIC8gNjApICUgNjApO1xuICAgICAgcyA9IChzID49IDEwKSA/IHMgOiBcIjBcIiArIHM7XG4gICAgICBtID0gKG0gPj0gMTApID8gbSA6IFwiMFwiICsgbTtcbiAgICAgIHRoaXMudGltZVBhc3NlZC5pbm5lckhUTUwgPSBtICsgJzonICsgcyA7XG5cbiAgICAvLyDQvtCx0L3QvtCy0LvQtdC90LjQtSDQv9GA0L7Qs9GA0LXRgdGBINCx0LDRgNCwXG4gICAgdGhpcy5wcm9ncmVzc0JhclVwZGF0ZSgpO1xuICB9XG5cbiAgbXV0ZVRyaWdnZXIoKSB7XG4gICAgaWYgKHRoaXMuYXVkaW9UcmFja1swXS52b2x1bWUgPT0gMCkge1xuICAgICAgdGhpcy52b2x1bWVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgncGxheUNvbnRyb2xzX192b2x1bWUtLW11dGUnKTtcbiAgICAgIHRoaXMuYXVkaW9UcmFja1swXS52b2x1bWUgPSB0aGlzLnZvbHVtZVZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZvbHVtZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdwbGF5Q29udHJvbHNfX3ZvbHVtZS0tbXV0ZScpO1xuICAgICAgdGhpcy5hdWRpb1RyYWNrWzBdLnZvbHVtZSA9IDA7XG4gICAgfVxuICB9XG5cbiAgcHJvZ3Jlc3NCYXJVcGRhdGUoKSB7XG4gICAgdmFyIHByb2dyZXNzSW5QZXJjZW50ID0gKHRoaXMuYXVkaW9UcmFja1swXS5jdXJyZW50VGltZSAvIHRoaXMuYXVkaW9UcmFja1swXS5kdXJhdGlvbiAqIDEwMCkudG9GaXhlZCgyKTtcbiAgICB0aGlzLnByb2dyZXNzQmFyLnN0eWxlLndpZHRoID0gcHJvZ3Jlc3NJblBlcmNlbnQgKyBcIiVcIjtcbiAgICB0aGlzLnByb2dyZXNzQmFySGFuZGxlLnN0eWxlLm1hcmdpbkxlZnQgPSBwcm9ncmVzc0luUGVyY2VudCArIFwiJVwiO1xuICB9XG59IiwibGV0IE1vZGFsO1xuaW1wb3J0IHtpbml0IGFzIEluaXRJbnB1dFRleHR9IGZyb20gJy4uL2lucHV0VGV4dC9pbnB1dFRleHQuanMnO1xuaW1wb3J0IHtpbml0IGFzIEluaXRJbnB1dFNlbGVjdH0gZnJvbSAnLi4vaW5wdXRTZWxlY3QvaW5wdXRTZWxlY3QuanMnO1xuaW1wb3J0IHtpbml0IGFzIEluaXRUZXh0YXJlYX0gZnJvbSAnLi4vdGV4dGFyZWEvdGV4dGFyZWEuanMnO1xuaW1wb3J0IHtpbml0IGFzIEluaXRMb2FkRmlsZURydWdORHJvcH0gZnJvbSAnLi4vbG9hZEZpbGVEcnVnTkRyb3AvbG9hZEZpbGVEcnVnTkRyb3AuanMnO1xuaW1wb3J0IHZhbGlkYXRpb24gZnJvbSAnLi4vLi4vbGF5b3V0L2pzL3ZhbGlkYXRpb24uanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtIHtcbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICB0aGlzLmZvcm0gPSBlbDtcbiAgICB0aGlzLmFncmVlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2FncmVlJyk7XG5cbiAgICBJbml0SW5wdXRUZXh0KHRoaXMuZm9ybSk7XG4gICAgSW5pdElucHV0U2VsZWN0KHRoaXMuZm9ybSk7XG4gICAgSW5pdFRleHRhcmVhKHRoaXMuZm9ybSk7XG4gICAgSW5pdExvYWRGaWxlRHJ1Z05Ecm9wKHRoaXMuZm9ybSk7XG5cbiAgICB0aGlzLmluaXRBZ3JlZU1vZGFsKCk7XG5cbiAgICAvLyB0aGlzLnZhbGlkYXRpb24gPSBWYWxpZGF0aW9uKHRoaXMuZm9ybSk7XG4gICAgdGhpcy52YWxpZGF0aW9uID0gdmFsaWRhdGlvbih0aGlzLmZvcm0pO1xuXG4gICAgdGhpcy5mb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIGV2ZW50ID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnN1Ym1pdCgpO1xuICAgIH0pO1xuICB9XG4gIGFzeW5jIGluaXRBZ3JlZU1vZGFsKCkge1xuICAgIGlmICghTW9kYWwpIHtcbiAgICAgIE1vZGFsID0gYXdhaXQgaW1wb3J0KCdwb3B1cC13aW5kb3ctbW9kdWxlJyk7XG4gICAgICBNb2RhbCA9IE1vZGFsLmRlZmF1bHQ7XG4gICAgfVxuXG4gICAgdGhpcy5hZ3JlZU1vZGFsID0gbmV3IE1vZGFsKHtcbiAgICAgIGVsZW1lbnQ6IHRoaXMuYWdyZWUsXG4gICAgICBoYXNoOiAnI2FncmVlJ1xuICAgIH0pO1xuICB9XG4gIHN1Ym1pdCAoKSB7XG4gICAgbGV0IHtuYW1lLGNvbXBhbnkscGhvbmUsbWFpbCxtZXNzYWdlLGFncmVlfSA9IHRoaXMudmFsaWRhdGlvbjtcblxuICAgIGlmICh0aGlzLmZvcm0ucXVlcnlTZWxlY3RvcignLmpzLW5hbWUnKSkge1xuXHRcdFx0aWYgKCFuYW1lLnRlc3QoKSkge1xuXHRcdFx0XHRuYW1lLmVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LmFkZCgnaGFzRXJyb3InKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5hbWUuZWwucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKCdoYXNFcnJvcicpO1xuXHRcdFx0fVxuXHRcdH1cblxuICAgIGlmICh0aGlzLmZvcm0ucXVlcnlTZWxlY3RvcignLmpzLWNvbXBhbnknKSkge1xuXHRcdFx0aWYgKCFjb21wYW55LnRlc3QoKSkge1xuXHRcdFx0XHRjb21wYW55LmVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LmFkZCgnaGFzRXJyb3InKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbXBhbnkuZWwucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKCdoYXNFcnJvcicpO1xuXHRcdFx0fVxuXHRcdH1cblxuICAgIGlmICh0aGlzLmZvcm0ucXVlcnlTZWxlY3RvcignLmpzLXBob25lJykpIHtcblx0XHRcdGlmICghcGhvbmUudGVzdCgpKSB7XG5cdFx0XHRcdHBob25lLmVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LmFkZCgnaGFzRXJyb3InKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBob25lLmVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LnJlbW92ZSgnaGFzRXJyb3InKTtcblx0XHRcdH1cblx0XHR9XG5cbiAgICBpZiAodGhpcy5mb3JtLnF1ZXJ5U2VsZWN0b3IoJy5qcy1tYWlsJykpIHtcblx0XHRcdGlmICghbWFpbC50ZXN0KCkpIHtcblx0XHRcdFx0bWFpbC5lbC5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoJ2hhc0Vycm9yJyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYWlsLmVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LnJlbW92ZSgnaGFzRXJyb3InKTtcblx0XHRcdH1cblx0XHR9XG5cbiAgICBpZiAodGhpcy5mb3JtLnF1ZXJ5U2VsZWN0b3IoJy5qcy1tZXNzYWdlJykpIHtcblx0XHRcdGlmICghbWVzc2FnZS50ZXN0KCkpIHtcblx0XHRcdFx0bWVzc2FnZS5lbC5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoJ2hhc0Vycm9yJyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtZXNzYWdlLmVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LnJlbW92ZSgnaGFzRXJyb3InKTtcblx0XHRcdH1cblx0XHR9XG5cbiAgICBpZiAodGhpcy5mb3JtLnF1ZXJ5U2VsZWN0b3IoJy5qcy1hZ3JlZScpKSB7XG5cdFx0XHRpZiAoIWFncmVlLnRlc3QoKSkge1xuXHRcdFx0XHRhZ3JlZS5lbC5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoJ2hhc0Vycm9yJyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhZ3JlZS5lbC5wYXJlbnROb2RlLmNsYXNzTGlzdC5yZW1vdmUoJ2hhc0Vycm9yJyk7XG5cdFx0XHR9XG5cdFx0fVxuXG4gICAgdmFyIGZvcm1MYWJlbHMgPSBbLi4udGhpcy5mb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoJ2xhYmVsJyldO1xuXHRcdHZhciBmb3JtQ2hlY2tib3ggPSB0aGlzLmZvcm0ucXVlcnlTZWxlY3RvcignLmZvcm1fX2FncmVlJyk7XG5cdFx0dmFyIGZvcm1TdWJtaXQgPSAxO1xuICAgIC8vIGNvbnNvbGUubG9nKGZvcm1MYWJlbHMpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtTGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoZm9ybUxhYmVsc1tpXS5jbGFzc0xpc3QuY29udGFpbnMoJ2hhc0Vycm9yJykpIHtcblx0XHRcdFx0dmFyIGZvcm1TdWJtaXQgPSAwO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH0gZWxzZSBpZiAoZm9ybUNoZWNrYm94KSB7XG5cdFx0XHRcdGlmIChmb3JtQ2hlY2tib3guY2xhc3NMaXN0LmNvbnRhaW5zKCdoYXNFcnJvcicpKSB7XG5cdFx0XHRcdFx0dmFyIGZvcm1TdWJtaXQgPSAwO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgZm9ybVN1Ym1pdCA9IDE7XG5cdFx0XHR9XG5cdFx0fVxuXG4gICAgdmFyIGludmFsaWRGaWVsZEFsbCA9IFsuLi50aGlzLmZvcm0ucXVlcnlTZWxlY3RvckFsbCgnLmhhc0Vycm9yIGlucHV0JyldO1xuICAgIGludmFsaWRGaWVsZEFsbFswXS5mb2N1cygpO1xuXG4gICAgaWYgKGZvcm1TdWJtaXQgPT0gMSkge1xuXHRcdFx0bGV0IHNvdXJjZSA9IHRoaXMuZm9ybS5nZXRBdHRyaWJ1dGUoJ2FjdGlvbicpO1xuXHRcdFx0bGV0IGlucHV0cyA9IFsuLi50aGlzLmZvcm0ucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQ6bm90KFt0eXBlPVwiY2hlY2tib3hcIl0pJyldO1xuXHRcdFx0bGV0IHRleHRhcmVhID0gdGhpcy5mb3JtLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XG4gICAgICBsZXQgc2VsZWN0ID0gdGhpcy5mb3JtLnF1ZXJ5U2VsZWN0b3IoJy5pbnB1dFNlbGVjdCcpO1xuXHRcdFx0bGV0IGNoZWNrYm94ID0gdGhpcy5mb3JtLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScpO1xuXG5cdFx0XHQvLyDQvtGC0L/RgNCw0LLQutCwINC00LDQvdC90YvRhVxuXHRcdFx0ZmV0Y2goc291cmNlLCB7XG5cdFx0XHRcdG1ldGhvZDogJ1BPU1QnLFxuXHRcdFx0XHRib2R5OiBuZXcgRm9ybURhdGEodGhpcy5mb3JtKVxuXHRcdFx0fSlcblx0XHRcdC50aGVuKHJlcyA9PiB7XG5cdFx0XHRcdGlmIChyZXMuc3RhdHVzICE9IDIwMCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcign0J7RiNC40LHQutCwJylcblx0XHRcdFx0fVxuXHRcdFx0XHRuZXcgTm90eS5JbmZvKCfQntGC0L/RgNCw0LLQu9C10L3QvicsICfQpNC+0YDQvNCwINGD0YHQv9C10YjQvdC+INC+0YLQv9GA0LDQstC70LXQvdCwIScpO1xuXHRcdFx0XHRyZXR1cm4gcmVzXG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oKHJlcykgPT4ge1xuXHRcdFx0XHRyZXMuanNvbigpXG5cdFx0XHRcdFx0LnRoZW4oY29uc29sZS5sb2cpXG5cdFx0XHRcdFx0LmNhdGNoKGVyciA9PiB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oZXJyKVxuXHRcdFx0XHRcdH0pXG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGVyciA9PiB7XG5cdFx0XHRcdG5ldyBOb3R5LkVycm9yKCfQntGI0LjQsdC60LAnLCfQpNC+0YDQvNGDINC90LUg0YPQtNCw0LvQvtGB0Ywg0L7RgtC/0YDQsNCy0LjRgtGMJylcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyDQvtGH0LjRgdGC0LrQsCDRhNC+0YDQvNGLINC/0L7RgdC70LUg0L7RgtC/0YDQsNCy0LrQuFxuXHRcdFx0aWYgKGNoZWNrYm94KSB7XG5cdFx0XHRcdGNoZWNrYm94LmNoZWNrZWQgPSBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGlucHV0cy5mb3JFYWNoKGl0ZW0gPT4ge1xuXHRcdFx0XHRpZiAoaXRlbS5wYXJlbnROb2RlLmNsYXNzTGlzdC5jb250YWlucygnanMtcGhvbmUnKSkge1xuXHRcdFx0XHRcdGl0ZW0ucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKCctLWhhc1ZhbHVlJyk7XG5cdFx0XHRcdFx0cGhvbmUuY2xlYXIoKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0aXRlbS52YWx1ZSA9ICcnO1xuXHRcdFx0XHRpdGVtLnBhcmVudE5vZGUuY2xhc3NMaXN0LnJlbW92ZSgnLS1oYXNWYWx1ZScpO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAodGV4dGFyZWEpIHtcblx0XHRcdFx0dGV4dGFyZWEudmFsdWUgPSAnJztcblx0XHRcdFx0dGV4dGFyZWEucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKCctLWhhc1ZhbHVlJyk7XG5cdFx0XHR9XG4gICAgICBpZihzZWxlY3QpIHtcbiAgICAgICAgbGV0IGVsID0gc2VsZWN0LnF1ZXJ5U2VsZWN0b3IoJy5pbnB1dFNlbGVjdF9faW5wdXQnKTtcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJywgJycpO1xuICAgICAgICBlbC5pbm5lckhUTUwgPSAnJztcbiAgICAgIH1cblx0XHR9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGluaXQgPSAoKSA9PiB7XG4gIFtdLmZvckVhY2guY2FsbCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZm9ybTpub3QoLnNlYXJjaEZvcm1fX2Zvcm0pJyksIChpdGVtKSA9PiB7XG4gICAgbmV3IEZvcm0oaXRlbSk7XG4gIH0pO1xufTtcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIElucHV0VGV4dCB7XG5cdGNvbnN0cnVjdG9yKCBwbGFjZWhvbGRlciwgdmFsdWUgPSAnJywgY2xhc3NOYW1lID0gJycpIHtcblx0XHRpZiAoIXBsYWNlaG9sZGVyKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCfQndC1INGD0LrQsNC30LDQvSDQv9C70LXQudGB0YXQvtC70LTQtdGAINGDINC40L3Qv9GD0YLQsCcpO1xuXG5cdFx0dGhpcy5sYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG5cdFx0dGhpcy5zcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXHRcdHRoaXMuaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuXG5cdFx0dGhpcy5sYWJlbC5kYXRhc2V0LnN0eWxlID0gXCJpbnB1dFRleHRcIjtcblx0XHR0aGlzLnNwYW4uaW5uZXJUZXh0ID0gcGxhY2Vob2xkZXI7XG5cdFx0dmFsdWUgJiYgKHRoaXMuaW5wdXQudmFsdWUgPSB2YWx1ZSk7XG5cblx0XHR0aGlzLmxhYmVsLmFwcGVuZENoaWxkKHRoaXMuaW5wdXQpO1xuXHRcdHRoaXMubGFiZWwuYXBwZW5kQ2hpbGQodGhpcy5zcGFuKTtcblxuXHRcdHRoaXMubGFiZWwuY2xhc3NOYW1lID0gY2xhc3NOYW1lICsgJ2lucHV0VGV4dCc7XG5cdFx0dGhpcy5zcGFuLmNsYXNzTmFtZSA9ICdpbnB1dFRleHRfX3BsYWNlaG9sZGVyJztcblx0XHR0aGlzLmlucHV0LmNsYXNzTmFtZSA9ICdpbnB1dFRleHRfX2lucHV0JztcblxuXHRcdHRoaXMuX19saXN0ZW5lcnMoKTtcblxuXG5cdFx0cmV0dXJuIHRoaXMubGFiZWw7XG5cdH1cblxuXHRfX2xpc3RlbmVycygpIHtcblx0XHR0aGlzLmNoZWNrUGxhY2Vob2xkZXIoKTtcblxuXHRcdHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lciggJ2lucHV0JywgZXZlbnQgPT4ge1xuXHRcdFx0dGhpcy5jaGVja1BsYWNlaG9sZGVyKCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoICdjaGFuZ2UnLCBldmVudCA9PiB7XG5cdFx0XHR0aGlzLmNoZWNrUGxhY2Vob2xkZXIoKTtcblx0XHR9KTtcblxuXHR9XG5cblx0c3RhdGljIGxpc3RlbmVycyggbGFiZWwgKSB7XG5cdFx0aWYgKCAhbGFiZWwgKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCfQkiDQvNC10YLQvtC0INC90YPQttC90L4g0L/QtdGA0LXQtNCw0YLRjCDRjdC70LXQvNC10L3RgiBsYWJlbFtkYXRhLXN0eWxlPVwiaW5wdXRUZXh0XCJdJyk7XG5cdFx0Y29uc3QgaW5wdXQgPSBsYWJlbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuXHRcdHRoaXMuY2hlY2tQbGFjZWhvbGRlciggbGFiZWwsIGlucHV0ICk7XG5cblx0XHRpbnB1dC5hZGRFdmVudExpc3RlbmVyKCAnaW5wdXQnLCBldmVudCA9PiB7XG5cdFx0XHR0aGlzLmNoZWNrUGxhY2Vob2xkZXIoIGxhYmVsLCBpbnB1dCApO1xuXHRcdH0pO1xuXG5cdFx0aW5wdXQuYWRkRXZlbnRMaXN0ZW5lciggJ2NoYW5nZScsIGV2ZW50ID0+IHtcblx0XHRcdHRoaXMuY2hlY2tQbGFjZWhvbGRlciggbGFiZWwsIGlucHV0ICk7XG5cdFx0fSk7XG5cblx0fVxuXG5cdGNoZWNrUGxhY2Vob2xkZXIoKSB7XG5cdFx0aWYgKCB0aGlzLmhhc1ZhbHVlKCkgKVxuXHRcdFx0dGhpcy5sYWJlbC5jbGFzc0xpc3QuYWRkKCctLWhhc1ZhbHVlJyk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5sYWJlbC5jbGFzc0xpc3QucmVtb3ZlKCctLWhhc1ZhbHVlJyk7XG5cdH1cblxuXHRzdGF0aWMgY2hlY2tQbGFjZWhvbGRlciggbGFiZWwsIGlucHV0ICkge1xuXHRcdGlmICggdGhpcy5oYXNWYWx1ZSggaW5wdXQgKSApXG5cdFx0XHRsYWJlbC5jbGFzc0xpc3QuYWRkKCctLWhhc1ZhbHVlJyk7XG5cdFx0ZWxzZVxuXHRcdFx0bGFiZWwuY2xhc3NMaXN0LnJlbW92ZSgnLS1oYXNWYWx1ZScpO1xuXHR9XG5cblx0aGFzVmFsdWUoKSB7XG5cdFx0aWYgKCB0aGlzLmlucHV0LnZhbHVlIHx8IHRoaXMuaW5wdXQudmFsdWUgPT09IDAgKVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0c3RhdGljIGhhc1ZhbHVlKCBpbnB1dCApIHtcblx0XHRpZiAoIGlucHV0LnZhbHVlIHx8IGlucHV0LnZhbHVlID09PSAwIClcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5leHBvcnQgY29uc3QgaW5pdCA9IChmb3JtKSA9PiB7XG5cdC8vIGNvbnN0IGlucHV0ID0gbmV3IElucHV0VGV4dCgn0JTQu9GPINCz0LXQvdC10YDQsNGG0LjQuCcpO1xuXG5cdFsuLi5mb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXN0eWxlPVwiaW5wdXRUZXh0XCJdJyldLmZvckVhY2goIChpdGVtKSA9PiB7XG5cdFx0SW5wdXRUZXh0Lmxpc3RlbmVycyhpdGVtKTtcblx0fSk7XG5cbn1cblxud2luZG93LklucHV0VGV4dCA9IElucHV0VGV4dDtcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIElucHV0U2VsZWN0IHtcblx0Y29uc3RydWN0b3IoIHBsYWNlaG9sZGVyLCB2YWx1ZSAsIGNsYXNzTmFtZSA9ICcnLCBvcHRpb25zICkge1xuXHRcdGlmICghcGxhY2Vob2xkZXIpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ9Cd0LUg0YPQutCw0LfQsNC9INC/0LvQtdC50YHRhdC+0LvQtNC10YAg0YMg0LjQvdC/0YPRgtCwJyk7XG5cblx0XHRpZiAoIHBsYWNlaG9sZGVyIGluc3RhbmNlb2YgT2JqZWN0ICkge1xuXHRcdFx0Ly8g0JXQodCb0Jgg0JrQkNCaINCf0JDQoNCQ0JzQldCi0KAg0J/QldCg0JXQlNCQ0KLQrCDQodCT0JXQndCV0KDQmNCd0KvQmSDQntCR0KrQldCa0KIsINGN0YLQviDQv9GA0L7RgdGC0L4g0L/QvtCy0LXRgdC40YIg0L7QsdGA0LDQsdC+0YLRh9C40LrQuFxuXHRcdFx0dGhpcy5sYWJlbCA9IHBsYWNlaG9sZGVyO1xuXHRcdFx0dGhpcy5pbnB1dCA9IHRoaXMubGFiZWwucXVlcnlTZWxlY3RvcignLmlucHV0U2VsZWN0X19pbnB1dCcpO1xuXHRcdFx0dGhpcy5pbnB1dEhpZGRlbiA9IHRoaXMubGFiZWwucXVlcnlTZWxlY3RvcignLmlucHV0U2VsZWN0X19pbnB1dC0taGlkZGVuJyk7XG5cdFx0XHR0aGlzLnNwYW4gPSB0aGlzLmxhYmVsLnF1ZXJ5U2VsZWN0b3IoJy5pbnB1dFNlbGVjdF9fcGxhY2Vob2xkZXInKTtcblx0XHRcdHRoaXMubGlzdCA9IHRoaXMubGFiZWwucXVlcnlTZWxlY3RvcignLmlucHV0U2VsZWN0X19saXN0Jyk7XG5cblx0XHRcdHRoaXMuX19saXN0ZW5lcnMoKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMubGFiZWw7XG5cdFx0fVxuXG5cdFx0dGhpcy5sYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdHRoaXMubGFiZWwuY2xhc3NOYW1lID0gJ2lucHV0U2VsZWN0X19pbnB1dCc7XG5cdFx0dGhpcy5sYWJlbC5kYXRhc2V0LnN0eWxlID0gXCJpbnB1dFNlbGVjdFwiO1xuXG5cdFx0dGhpcy5pbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG5cdFx0aWYgKCB2YWx1ZSApIHtcblx0XHRcdHRoaXMuaW5wdXQuaW5uZXJUZXh0ID0gdmFsdWUubmFtZTtcblx0XHRcdHRoaXMuaW5wdXQuZGF0YXNldC52YWx1ZSA9IHZhbHVlLnZhbHVlO1xuXHRcdH1cblxuXHRcdHRoaXMuc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblx0XHR0aGlzLnNwYW4uaW5uZXJUZXh0ID0gcGxhY2Vob2xkZXI7XG5cblx0XHR0aGlzLmxhYmVsLmFwcGVuZENoaWxkKHRoaXMuaW5wdXQpO1xuXHRcdHRoaXMubGFiZWwuYXBwZW5kQ2hpbGQodGhpcy5zcGFuKTtcblxuXHRcdGlmICggb3B0aW9ucyBpbnN0YW5jZW9mIEFycmF5ICkge1xuXHRcdFx0Y29uc3QgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0dGhpcy5saXN0LmNsYXNzTmFtZSA9ICdpbnB1dFNlbGVjdF9fbGlzdCc7XG5cblx0XHRcdG9wdGlvbnMuZm9yRWFjaCggKGl0ZW0sIGluZGV4KSA9PiB7XG5cdFx0XHRcdGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0XHRvcHRpb24uY2xhc3NOYW1lID0gJ2lucHV0U2VsZWN0X19vcHRpb24nO1xuXHRcdFx0XHRvcHRpb24uZGF0YXNldC52YWx1ZSA9IGl0ZW0udmFsdWU7XG5cdFx0XHRcdG9wdGlvbi5pbm5lclRleHQgPSBpdGVtLm5hbWU7XG5cdFx0XHRcdHRoaXMubGlzdC5hcHBlbmRDaGlsZCggb3B0aW9uICk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMubGFiZWwuYXBwZW5kQ2hpbGQodGhpcy5saXN0KTtcblx0XHR9XG5cblx0XHR0aGlzLl9fbGlzdGVuZXJzKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5sYWJlbDtcblx0fVxuXG5cdF9fbGlzdGVuZXJzKCkge1xuXG5cdFx0dGhpcy5jaGVja1BsYWNlaG9sZGVyKCk7XG5cblx0XHR0aGlzLnNlbGVjdEl0ZW1MaXN0ZW5lcigpO1xuXG5cdFx0dGhpcy5sYWJlbC5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBldmVudCA9PiB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0dGhpcy5yb3V0ZUNsaWNrKCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoICdrZXlkb3duJywgZXZlbnQgPT4ge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdHRoaXMub3Blbkxpc3QoKTtcblx0XHR9KTtcblxuXHRcdHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lciggJ2NoYW5nZScsIGV2ZW50ID0+IHtcblx0XHRcdHRoaXMuY2hlY2tQbGFjZWhvbGRlcigpO1xuXHRcdH0pO1xuXG5cdH1cblxuXHRyb3V0ZUNsaWNrKCkge1xuXG5cdFx0aWYgKCB0aGlzLmxpc3QuY2xhc3NMaXN0LmNvbnRhaW5zKCctLW9wZW5lZCcpICkge1xuXHRcdFx0dGhpcy5jbG9zZUxpc3QoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5vcGVuTGlzdCgpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIG9wZW5MaXN0KCkge1xuXHRcdHRoaXMubGFiZWwuY2xhc3NMaXN0LmFkZCgnLS1vcGVuZWQnKTtcblx0XHR0aGlzLmxpc3QuY2xhc3NMaXN0LmFkZCgnLS1vcGVuZWQnKTtcblx0XHRjb25zdCBsaXN0SGVpZ2h0ID0gdGhpcy5saXN0Lm9mZnNldEhlaWdodCArIHRoaXMubGlzdC5zY3JvbGxIZWlnaHQ7XG5cblx0XHR0aGlzLmxpc3Quc3R5bGUudHJhbnNpdGlvbiA9ICdhbGwgLjJzIGVhc2UnO1xuXG5cdFx0YXdhaXQgbmV3IFByb21pc2UoIChyZXMscmVqKSA9PiB7XG5cdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICgpID0+IHtcblx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCAoKSA9PiB7XG5cdFx0XHRcdFx0cmVzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3Quc3R5bGUuaGVpZ2h0ID0gbGlzdEhlaWdodCArICdweCc7XG5cblx0fVxuXHRjbG9zZUxpc3QoKSB7XG5cdFx0dGhpcy5saXN0LnN0eWxlLmhlaWdodCA9IDA7XG5cdFx0dGhpcy5sYWJlbC5jbGFzc0xpc3QucmVtb3ZlKCctLW9wZW5lZCcpO1xuXHRcdHRoaXMubGlzdC5jbGFzc0xpc3QucmVtb3ZlKCctLW9wZW5lZCcpO1xuXG5cdFx0Ly8gbGlzdC5zdHlsZS50cmFuc2l0aW9uID0gJ2FsbCAuMnMgZWFzZSc7XG5cdH1cblxuXHRzZWxlY3RJdGVtTGlzdGVuZXIoKSB7XG5cdFx0dGhpcy5saXN0LmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGV2ZW50ID0+IHtcblx0XHRcdGNvbnN0IG9wdGlvbiA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KCcuaW5wdXRTZWxlY3RfX29wdGlvbicpXG5cdFx0XHRpZiAoICFvcHRpb24gKSByZXR1cm47XG5cblx0XHRcdHRoaXMudmFsdWUgPSBvcHRpb247XG5cdFx0fSk7XG5cblx0XHRhZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCBldmVudCA9PiB7XG5cdFx0XHRpZiAoICF0aGlzLmxhYmVsLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgKSB7XG5cdFx0XHRcdHRoaXMuY2xvc2VMaXN0KCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRjaGVja1BsYWNlaG9sZGVyKCkge1xuXHRcdGlmICggdGhpcy5oYXNWYWx1ZSgpIClcblx0XHRcdHRoaXMubGFiZWwuY2xhc3NMaXN0LmFkZCgnLS1oYXNWYWx1ZScpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMubGFiZWwuY2xhc3NMaXN0LnJlbW92ZSgnLS1oYXNWYWx1ZScpO1xuXHR9XG5cdGhhc1ZhbHVlKCkge1xuXHRcdGlmICggdGhpcy5pbnB1dC5kYXRhc2V0LnZhbHVlIHx8IHRoaXMuaW5wdXQuZGF0YXNldC52YWx1ZSA9PT0gMCApXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0Z2V0IHZhbHVlKCkge1xuXHRcdHJldHVybiB0aGlzLmlucHV0LmRhdGFzZXQudmFsdWU7XG5cdH1cblx0c2V0IHZhbHVlKHZhbHVlKSB7XG5cblx0XHRpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIClcblx0XHRcdHZhbHVlID0gdGhpcy5saXN0LnF1ZXJ5U2VsZWN0b3IoYGRhdGEtdmFsdWU9XCIke3ZhbHVlfVwiYCk7XG5cblx0XHRpZiAoIHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICkge1xuXHRcdFx0bGV0IGVsVmFsdWUgPSB2YWx1ZS5kYXRhc2V0LnZhbHVlO1xuXHRcdFx0dGhpcy5pbnB1dC5kYXRhc2V0LnZhbHVlID0gZWxWYWx1ZTtcblx0XHRcdHRoaXMuaW5wdXRIaWRkZW4udmFsdWUgPSBlbFZhbHVlO1xuXHRcdFx0dGhpcy5pbnB1dC5pbm5lclRleHQgPSB2YWx1ZS5pbm5lclRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYNCX0LDQv9C40YHRjCDQstCw0LvRg9C1INCyINC40L3Qv9GD0YIg0L3QtSDQtNCw0LvQsCDRgNC10LfRg9C70YzRgtCw0YLQsC4g0J3QtdGCINGC0LDQutC+0Lkg0L7Qv9GG0LjQuGAsdGhpcy5sYWJlbCApO1xuXHRcdH1cblx0XHR0aGlzLmlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnKSk7XG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IGluaXQgPSAoZm9ybSkgPT4ge1xuXHRbXS5mb3JFYWNoLmNhbGwoIGZvcm0ucXVlcnlTZWxlY3RvckFsbCgnLmlucHV0U2VsZWN0JyksIChpdGVtKSA9PiB7XG5cdFx0bmV3IElucHV0U2VsZWN0KGl0ZW0pO1xuXHR9KTtcbn07XG53aW5kb3cuSW5wdXRTZWxlY3QgPSBJbnB1dFNlbGVjdDtcbiIsIlxuY2xhc3MgVGV4dGFyZWEge1xuXHRjb25zdHJ1Y3RvciggcGxhY2Vob2xkZXIsIHZhbHVlICwgY2xhc3NOYW1lID0gJycgKSB7XG5cdFx0aWYgKCFwbGFjZWhvbGRlcilcblx0XHRcdHRocm93IG5ldyBFcnJvcign0J3QtSDRg9C60LDQt9Cw0L0g0L/Qu9C10LnRgdGF0L7Qu9C00LXRgCDRgyDQuNC90L/Rg9GC0LAnKTtcblxuXHRcdGlmICggcGxhY2Vob2xkZXIgaW5zdGFuY2VvZiBPYmplY3QgKSB7XG5cdFx0XHQvLyDQldCh0JvQmCDQmtCQ0Jog0J/QkNCg0JDQnNCV0KLQoCDQn9CV0KDQldCU0JDQotCsINCh0JPQldCd0JXQoNCY0J3Qq9CZINCe0JHQqtCV0JrQoiwg0Y3RgtC+INC/0YDQvtGB0YLQviDQv9C+0LLQtdGB0LjRgiDQvtCx0YDQsNCx0L7RgtGH0LjQutC4XG5cdFx0XHR0aGlzLmxhYmVsID0gcGxhY2Vob2xkZXI7XG5cdFx0XHR0aGlzLmlucHV0ID0gdGhpcy5sYWJlbC5xdWVyeVNlbGVjdG9yKCcudGV4dGFyZWFfX2lucHV0Jyk7XG5cdFx0XHR0aGlzLnNwYW4gPSB0aGlzLmxhYmVsLnF1ZXJ5U2VsZWN0b3IoJy50ZXh0YXJlYV9fcGxhY2Vob2xkZXInKTtcblxuXHRcdFx0dGhpcy5fX2xpc3RlbmVycygpO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5sYWJlbDtcblx0XHR9XG5cblx0XHR0aGlzLmxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcblx0XHR0aGlzLmxhYmVsLmNsYXNzTmFtZSA9ICd0ZXh0YXJlYSc7XG5cdFx0dGhpcy5sYWJlbC5kYXRhc2V0LnN0eWxlID0gXCJ0ZXh0YXJlYVwiO1xuXG5cdFx0dGhpcy5pbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG5cdFx0dGhpcy5pbnB1dC5jbGFzc05hbWUgPSAndGV4dGFyZWFfX2lucHV0Jztcblx0XHRpZiAoIHZhbHVlICkge1xuXHRcdFx0dGhpcy5pbnB1dC5pbm5lclRleHQgPSB2YWx1ZS5uYW1lO1xuXHRcdFx0dGhpcy5pbnB1dC5kYXRhc2V0LnZhbHVlID0gdmFsdWUudmFsdWU7XG5cdFx0fVxuXG5cdFx0dGhpcy5zcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXHRcdHRoaXMuc3Bhbi5jbGFzc05hbWUgPSAndGV4dGFyZWFfX3BsYWNlaG9sZGVyJztcblx0XHR0aGlzLnNwYW4uaW5uZXJUZXh0ID0gcGxhY2Vob2xkZXI7XG5cblx0XHR0aGlzLmxhYmVsLmFwcGVuZENoaWxkKHRoaXMuaW5wdXQpO1xuXHRcdHRoaXMubGFiZWwuYXBwZW5kQ2hpbGQodGhpcy5zcGFuKTtcblxuXHRcdHRoaXMuX19saXN0ZW5lcnMoKTtcblxuXHRcdHJldHVybiB0aGlzLmxhYmVsO1xuXHR9XG5cblx0X19saXN0ZW5lcnMoKSB7XG5cblx0XHR0aGlzLmNoZWNrUGxhY2Vob2xkZXIoKTtcblxuXHRcdHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lciggJ2tleXVwJywgZXZlbnQgPT4ge1xuXHRcdFx0dGhpcy5jaGVja1BsYWNlaG9sZGVyKCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoICdjaGFuZ2UnLCBldmVudCA9PiB7XG5cdFx0XHR0aGlzLmNoZWNrUGxhY2Vob2xkZXIoKTtcblx0XHR9KTtcblxuXHR9XG5cblx0Y2hlY2tQbGFjZWhvbGRlcigpIHtcblx0XHRpZiAoIHRoaXMuaGFzVmFsdWUoKSApXG5cdFx0XHR0aGlzLmxhYmVsLmNsYXNzTGlzdC5hZGQoJy0taGFzVmFsdWUnKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmxhYmVsLmNsYXNzTGlzdC5yZW1vdmUoJy0taGFzVmFsdWUnKTtcblx0fVxuXHRoYXNWYWx1ZSgpIHtcblx0XHRpZiAoIHRoaXMuaW5wdXQudmFsdWUgfHwgdGhpcy5pbnB1dC52YWx1ZSA9PT0gMCApXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IGluaXQgPSAoZm9ybSkgPT4ge1xuXG5cdFsuLi5mb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoJy50ZXh0YXJlYScpXS5mb3JFYWNoKCAoaXRlbSkgPT4ge1xuXHRcdG5ldyBUZXh0YXJlYShpdGVtKTtcblx0fSk7XG5cbn1cblxud2luZG93LlRleHRhcmVhID0gVGV4dGFyZWE7XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMb2FkRmlsZURydWdORHJvcCB7XG4gIGNvbnN0cnVjdG9yKGl0ZW0pIHtcbiAgICB0aGlzLmxhYmVsID0gaXRlbSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubG9hZEZpbGVEcnVnTkRyb3BfX2xhYmVsJyk7XG5cbiAgICB0aGlzLmlucHV0ID0gdGhpcy5sYWJlbC5xdWVyeVNlbGVjdG9yKCcubG9hZEZpbGVEcnVnTkRyb3BfX2lucHV0Jyk7XG5cbiAgICBpZiAoIXRoaXMubGFiZWwpIHJldHVybjtcblxuICAgIHRoaXMucGxhY2Vob2xkZXIgPSB0aGlzLmxhYmVsLnF1ZXJ5U2VsZWN0b3IoJy5sb2FkRmlsZURydWdORHJvcF9fcGxhY2Vob2xkZXInKTtcbiAgICB0aGlzLmFkZERyYWdMaXN0ZW5lcigpO1xuICAgIHRoaXMuX19maWxlc0luRm9ybSA9IDA7XG4gICAgdGhpcy5fX3BsYWNlaG9sZXJJbkxhYmVsID0gdHJ1ZTtcbiAgfVxuXG4gIGFkZERyYWdMaXN0ZW5lcigpIHtcbiAgICBjb25zdCBmb3JtID0gdGhpcy5sYWJlbC5jbG9zZXN0KCdmb3JtJyk7XG5cbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIGNvbnNvbGUud2Fybign0JzQvtC00YPQu9GMINC30LDQs9GA0YPQt9C60Lgg0YTQsNC50LvQvtCyINC00L7Qu9C20LXQvSDQsdGL0YLRjCDQstC90YPRgtGA0Lgg0YTQvtGA0LzRiycpO1xuICAgIH1cbiAgICBmb3JtLmNsYXNzTGlzdC5hZGQoJ2xvYWRGaWxlRHJ1Z05Ecm9wX19mb3JtU3R5bGUtdHJhbnNpdGlvbicpO1xuXG4gICAgKGZvcm0gfHwgd2luZG93KS5hZGRFdmVudExpc3RlbmVyKCAnZHJhZ292ZXInLCBldmVudCA9PiB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zb2xlLmxvZyhldmVudCk7XG5cbiAgICAgIHRoaXMubGFiZWwuY2xhc3NMaXN0LmFkZCgnLS1hY3RpdmUnKTtcbiAgICAgIGZvcm0uY2xhc3NMaXN0LmFkZCgnbG9hZEZpbGVEcnVnTkRyb3BfX2Zvcm1TdHlsZScpO1xuXG4gICAgfSk7XG4gICAgKGZvcm0gfHwgd2luZG93KS5hZGRFdmVudExpc3RlbmVyKCAnZHJhZ2VuZCcsIGV2ZW50ID0+IHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMubGFiZWwuY2xhc3NMaXN0LnJlbW92ZSgnLS1hY3RpdmUnKTtcbiAgICB9KTtcblxuXG5cbiAgICAoZm9ybSB8fCBkb2N1bWVudCkuYWRkRXZlbnRMaXN0ZW5lciggJ2Ryb3AnLCBldmVudCA9PiB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmxhYmVsLmNsYXNzTGlzdC5yZW1vdmUoJy0tYWN0aXZlJyk7XG4gICAgICBmb3JtLmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRGaWxlRHJ1Z05Ecm9wX19mb3JtU3R5bGUnKTtcblxuICAgICAgWy4uLmV2ZW50LmRhdGFUcmFuc2Zlci5maWxlc10uZm9yRWFjaCggKGZpbGUsIGluZGV4KSA9PiB7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZW5kVG9TZXJ2ZXJCdWZmZXIoZmlsZSlcbiAgICAgICAgICAuY2F0Y2goKGUpPT57XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGDQntGC0L/RgNCw0LLQutCwINGE0LDQudC70LAgJHtmaWxlLm5hbWV9INC90LUg0YPQtNCw0LvQsNGB0YxgKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB9LCAzMDAgKiBpbmRleCk7XG5cbiAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgICB0aGlzLmlucHV0LmFkZEV2ZW50TGlzdGVuZXIoICdjaGFuZ2UnLCBldmVudCA9PiB7XG4gICAgICBbLi4udGhpcy5pbnB1dC5maWxlc10uZm9yRWFjaCggKGZpbGUsIGluZGV4KSA9PiB7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZW5kVG9TZXJ2ZXJCdWZmZXIoZmlsZSlcbiAgICAgICAgICAuY2F0Y2goKGUpPT57XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGDQntGC0L/RgNCw0LLQutCwINGE0LDQudC70LAgJHtmaWxlLm5hbWV9INC90LUg0YPQtNCw0LvQsNGB0YxgKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB9LCAzMDAgKiBpbmRleCk7XG5cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIH1cblxuICBnZW5lcmF0ZUxpbmUoZmlsZU5hbWUsIHhocikge1xuICAgIGNvbnN0IGZpbGVCbG9jayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGZpbGVCbG9jay5jbGFzc0xpc3QuYWRkKCdsb2FkRmlsZURydWdORHJvcF9fZmlsZScpO1xuXG4gICAgY29uc3QgZmlsZUNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBmaWxlQ29udGVudC5jbGFzc0xpc3QuYWRkKCdsb2FkRmlsZURydWdORHJvcF9fZmlsZS1jb250ZW50Jyk7XG5cbiAgICBjb25zdCBmaWxlUmVtb3ZlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZmlsZVJlbW92ZS5jbGFzc0xpc3QuYWRkKCdsb2FkRmlsZURydWdORHJvcF9fZmlsZS1yZW1vdmUnKTtcblxuICAgIGNvbnN0IGZpbGVUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZmlsZVRleHQuY2xhc3NMaXN0LmFkZCgnbG9hZEZpbGVEcnVnTkRyb3BfX2ZpbGUtdGV4dCcpO1xuXG4gICAgY29uc3QgZmlsZVByb2dyZXNzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZmlsZVByb2dyZXNzLmNsYXNzTGlzdC5hZGQoJ2xvYWRGaWxlRHJ1Z05Ecm9wX19maWxlLXByb2dyZXNzJyk7XG5cbiAgICBjb25zdCBmaWxlVGV4dFByb2dyZXNzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZmlsZVRleHRQcm9ncmVzcy5jbGFzc0xpc3QuYWRkKCdsb2FkRmlsZURydWdORHJvcF9fZmlsZS10ZXh0UHJvZ3Jlc3MnKTtcblxuXG4gICAgZmlsZVRleHQuaW5uZXJUZXh0ID0gZmlsZU5hbWU7XG5cbiAgICBmaWxlQ29udGVudC5hcHBlbmRDaGlsZChmaWxlVGV4dCk7XG4gICAgZmlsZUNvbnRlbnQuYXBwZW5kQ2hpbGQoZmlsZVRleHRQcm9ncmVzcyk7XG4gICAgZmlsZUNvbnRlbnQuYXBwZW5kQ2hpbGQoZmlsZVJlbW92ZSk7XG4gICAgZmlsZUNvbnRlbnQuYXBwZW5kQ2hpbGQoZmlsZVByb2dyZXNzKTtcblxuICAgIGZpbGVCbG9jay5hcHBlbmRDaGlsZChmaWxlQ29udGVudCk7XG4gICAgZmlsZUJsb2NrLnN0eWxlLmhlaWdodCA9ICcwJztcblxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSggKCk9PntcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSggKCkgPT4ge1xuICAgICAgICBmaWxlQmxvY2suc3R5bGUuaGVpZ2h0ID0gZmlsZUJsb2NrLnNjcm9sbEhlaWdodCArICdweCc7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMubGFiZWwuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmViZWdpbicsIGZpbGVCbG9jayk7XG5cbiAgICBmaWxlUmVtb3ZlLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsIGFzeW5jIGV2ZW50ID0+IHtcbiAgICAgIHhoci5hYm9ydCgpO1xuXG4gICAgICBmaWxlQ29udGVudC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWSgwJSknO1xuICAgICAgZmlsZUJsb2NrLnN0eWxlLmhlaWdodCA9IGZpbGVCbG9jay5vZmZzZXRIZWlnaHQgKyAncHgnO1xuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSggKCByZXNvbHZlLCByZWplY3QgKSA9PiB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSggKCk9PntcbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGZpbGVCbG9jay5zdHlsZS5oZWlnaHQgPSAwO1xuICAgICAgZmlsZUNvbnRlbnQuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVkoLTEwJSknO1xuICAgICAgZmlsZUJsb2NrLnN0eWxlLm1hcmdpbiA9ICcwcHggJyArIGdldENvbXB1dGVkU3R5bGUoZmlsZUJsb2NrKS5tYXJnaW5MZWZ0O1xuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSggKCByZXNvbHZlLCByZWplY3QgKSA9PiB7XG4gICAgICAgICBmaWxlQ29udGVudC5hZGRFdmVudExpc3RlbmVyKCAndHJhbnNpdGlvbmVuZCcsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGZpbGVCbG9jay5yZW1vdmUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBmaWxlQmxvY2ssXG4gICAgICBmaWxlUmVtb3ZlLFxuICAgICAgZmlsZVRleHQsXG4gICAgICBmaWxlVGV4dFByb2dyZXNzLFxuICAgICAgZmlsZVByb2dyZXNzLFxuICAgICAgZmlsZUNvbnRlbnRcbiAgICB9XG4gIH1cblxuICAvLyDQstGA0LXQvNC10L3QvdC+0LUg0YXRgNCw0L3QuNC70LjRidC1INGE0LDQudC70L7QsiDQv9C10YDQtdC0INC+0YLQv9GA0LDQstC60L7QuSDRhNC+0YDQvNGLXG4gIGFzeW5jIHNlbmRUb1NlcnZlckJ1ZmZlcihmaWxlKSB7XG5cbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIGNvbnN0IHtcbiAgICAgICAgZmlsZUJsb2NrLFxuICAgICAgICBmaWxlUmVtb3ZlLFxuICAgICAgICBmaWxlVGV4dCxcbiAgICAgICAgZmlsZUNvbnRlbnQsXG4gICAgICAgIGZpbGVUZXh0UHJvZ3Jlc3MsXG4gICAgICAgIGZpbGVQcm9ncmVzcyB9ID0gdGhpcy5nZW5lcmF0ZUxpbmUoZmlsZS5uYW1lLCB4aHIpO1xuXG4gICAgeGhyLm9wZW4oJ1BPU1QnLCcvYXBpL3YxL3Bvc3RGaWxlJyk7XG5cbiAgICBsZXQgZmQgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmZC5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcblxuICAgIGZ1bmN0aW9uIGNvbnZlcnREYXRhU2l6ZShzaXplKXtcbiAgICAgIHNpemUgLz0gMTAyNDtcblxuICAgICAgaWYgKHNpemUgPCAxMDI0KVxuICAgICAgICByZXR1cm4gc2l6ZS50b0ZpeGVkKDApICsgJyDQutCxJztcblxuICAgICAgc2l6ZSAvPSAxMDI0O1xuICAgICAgaWYgKHNpemUgPCAxMDI0KVxuICAgICAgICByZXR1cm4gc2l6ZS50b0ZpeGVkKDIpICsgJyDQvNCxJztcblxuICAgICAgc2l6ZSAvPSAxMDI0O1xuICAgICAgaWYgKHNpemUgPCAxMDI0KVxuICAgICAgICByZXR1cm4gc2l6ZS50b0ZpeGVkKDIpICsgJyDQs9CxJztcbiAgICB9XG4gICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gKGV2ZW50KSA9PiB7XG4gICAgICBmaWxlUHJvZ3Jlc3Muc3R5bGUud2lkdGggPSBldmVudC5sb2FkZWQvZXZlbnQudG90YWwgKiAxMDAgKyAnJSc7XG4gICAgICBmaWxlVGV4dFByb2dyZXNzLmlubmVyVGV4dCA9IGAo0JfQsNCz0YDRg9C20LXQvdC+ICR7Y29udmVydERhdGFTaXplKGV2ZW50LmxvYWRlZCl9INC40LcgJHtjb252ZXJ0RGF0YVNpemUoZXZlbnQudG90YWwpfSlgO1xuICAgIH07XG5cbiAgICB4aHIuc2VuZChmZCk7XG5cblxuICAgIGxldCBzdGF0dXMgPSBhd2FpdCBuZXcgUHJvbWlzZSggKCByZXNvbHZlLCByZWplY3QgKSA9PiB7XG5cbiAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoJ2xvYWQnKTtcbiAgICAgICAgZmlsZVByb2dyZXNzLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgfTtcblxuICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIHJlamVjdChgJHt4aHIuc3RhdHVzfSwgJHt4aHIuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYCR7eGhyLnN0YXR1c30sICR7eGhyLnN0YXR1c1RleHR9YCk7XG4gICAgICB9O1xuXG4gICAgICB4aHIub25hYm9ydCA9ICgpID0+IHtcbiAgICAgICAgcmVtb3ZlRmlsZSgpO1xuICAgICAgICByZWplY3QoYGFib3J0YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBhYm9ydGApO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKHN0YXR1cyk7XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBpbml0ID0gKGZvcm0pID0+IHtcbiAgWyAuLi5mb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoJy5sb2FkRmlsZURydWdORHJvcF9fbGFiZWwnKSBdLmZvckVhY2goIChpdGVtKSA9PiB7XG4gICAgbmV3IExvYWRGaWxlRHJ1Z05Ecm9wKGl0ZW0pO1xuICB9KTtcbn07XG4iLCJpbXBvcnQgTWFzayBmcm9tICcuLi8uLi9sYXlvdXQvanMvbWFzayc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRGb3JtVmFsaWRhdGVTY3JpcHRzKGZvcm0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtJykpIHtcbiAgaWYgKCFmb3JtKSByZXR1cm47XG5cdC8vIE1hc2sg0LHQtdGA0LXRgtGB0Y8g0LjQtyDQtNGA0YPQs9C+0LPQviDRhNCw0LnQu9CwINC60L7RgtC+0YDRi9C5INC/0L7QtNC60LvRjtGH0LDQtdGC0YHRjyDRgNCw0L3RjNGI0LVcblx0dmFyIHBob25lRWwgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoJy5qcy1waG9uZSBpbnB1dCcpO1xuXHR2YXIgcGhvbmVNYXNrID0gbmV3IE1hc2socGhvbmVFbCk7XG5cdHZhciBwaG9uZSA9IHtcblx0XHRlbDogcGhvbmVFbCxcblx0XHR0ZXN0OiBmdW5jdGlvbiB0ZXN0KCkge1xuXHRcdFx0cmV0dXJuIHBob25lTWFzay50ZXN0KCk7XG5cdFx0fSxcblx0XHRmb2N1czogZnVuY3Rpb24gZm9jdXMoKSB7XG5cdFx0XHR0aGlzLmVsLmZvY3VzKCk7XG5cdFx0fSxcbiAgICBjbGVhcigpIHtcblx0XHRcdHBob25lTWFzay5jbGVhcigpXG5cdFx0fVxuXHR9O1xuXG5cdHZhciBtYWlsID0ge1xuXHRcdGVsOiBmb3JtLnF1ZXJ5U2VsZWN0b3IoJy5qcy1tYWlsIGlucHV0JyksXG5cdFx0dGVzdDogZnVuY3Rpb24gdGVzdCgpIHtcblx0XHRcdC8vINC/0YDQvtCy0LXRgNC60LAg0L3QsCDQvdCw0LvQuNGH0LjQtSDRgdC40LzQstC+0LvQsCDQtNC+INGB0L7QsdCw0YfQutC4LCDRgdC+0LHQsNGH0LrRgywg0YLQtdC60YHRgiDQvNC10LbQtNGDINGB0L7QsdCw0YfQutC+0Lkg0Lgg0YLQvtGH0LrQvtC5LCDRgtC+0YfQutGDINC4INGC0LXQutGB0YIg0L/QvtGB0LvQtSDRgtC+0YfQutC4XG5cdFx0XHR2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cCgnLkAuKz9cXFxcLlxcXFxEezJ9JywgJ2dpJyk7XG5cblx0XHRcdHJldHVybiByZWdleHAudGVzdCh0aGlzLmVsLnZhbHVlKTtcblx0XHR9LFxuXHRcdGZvY3VzOiBmdW5jdGlvbiBmb2N1cygpIHtcblx0XHRcdHRoaXMuZWwuZm9jdXMoKTtcblx0XHR9XG5cdH07XG5cblx0dmFyIG5hbWUgPSB7XG5cdFx0ZWw6IGZvcm0ucXVlcnlTZWxlY3RvcignLmpzLW5hbWUgaW5wdXQnKSxcblx0XHR0ZXN0OiBmdW5jdGlvbiB0ZXN0KCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWwudmFsdWUubGVuZ3RoID4gMSA/IDEgOiAwO1xuXHRcdH0sXG5cdFx0Zm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuXHRcdFx0dGhpcy5lbC5mb2N1cygpO1xuXHRcdH1cblx0fTtcblxuICB2YXIgY29tcGFueSA9IHtcbiAgICBlbDogZm9ybS5xdWVyeVNlbGVjdG9yKCcuanMtY29tcGFueSBpbnB1dCcpLFxuICAgIHRlc3Q6IGZ1bmN0aW9uIHRlc3QoKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbC52YWx1ZS5sZW5ndGggPiAxID8gMSA6IDA7XG4gICAgfSxcbiAgICBmb2N1czogZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgICB0aGlzLmVsLmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG5cdHZhciBhZ3JlZSA9IHtcblx0XHRlbDogZm9ybS5xdWVyeVNlbGVjdG9yKCcuanMtYWdyZWUgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyksXG5cdFx0dGVzdDogZnVuY3Rpb24gdGVzdCgpIHtcblx0XHRcdHJldHVybiB0aGlzLmVsLmNoZWNrZWQ7XG5cdFx0fSxcblx0XHRmb2N1czogZnVuY3Rpb24gZm9jdXMoKSB7XG5cdFx0XHR0aGlzLmVsLmZvY3VzKCk7XG5cdFx0fVxuICB9O1xuXG4gIHZhciBtZXNzYWdlID0ge1xuXHRcdGVsOiBmb3JtLnF1ZXJ5U2VsZWN0b3IoJy5qcy1tZXNzYWdlIHRleHRhcmVhJyksXG5cdFx0dGVzdDogZnVuY3Rpb24gdGVzdCgpIHtcblx0XHRcdHJldHVybiB0aGlzLmVsLnZhbHVlLmxlbmd0aCA+IDEgPyAxIDogMDtcblx0XHR9LFxuXHRcdGZvY3VzOiBmdW5jdGlvbiBmb2N1cygpIHtcblx0XHRcdHRoaXMuZWwuZm9jdXMoKTtcblx0XHR9XG5cdH07XG5cblx0aWYgKGZvcm0ucXVlcnlTZWxlY3RvcignLmpzLWZyb20gaW5wdXQnKSkge1xuXHRcdHZhciBmcm9tID0ge1xuXHRcdFx0ZWw6IGZvcm0ucXVlcnlTZWxlY3RvcignLmpzLWZyb20gaW5wdXQnKSxcblx0XHRcdHRlc3Q6IGZ1bmN0aW9uIHRlc3QoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmVsLnZhbHVlLmxlbmd0aCA+IDEgPyAxIDogMDtcblx0XHRcdH0sXG5cdFx0XHRmb2N1czogZnVuY3Rpb24gZm9jdXMoKSB7XG5cdFx0XHRcdHRoaXMuZWwuZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0aWYgKGZvcm0ucXVlcnlTZWxlY3RvcignLmpzLXdoZXJlIGlucHV0JykpIHtcblx0XHR2YXIgd2hlcmUgPSB7XG5cdFx0XHRlbDogZm9ybS5xdWVyeVNlbGVjdG9yKCcuanMtd2hlcmUgaW5wdXQnKSxcblx0XHRcdHRlc3Q6IGZ1bmN0aW9uIHRlc3QoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmVsLnZhbHVlLmxlbmd0aCA+IDEgPyAxIDogMDtcblx0XHRcdH0sXG5cdFx0XHRmb2N1czogZnVuY3Rpb24gZm9jdXMoKSB7XG5cdFx0XHRcdHRoaXMuZWwuZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0aWYgKGZvcm0ucXVlcnlTZWxlY3RvcignLmpzLXdlaWdodCBpbnB1dCcpKSB7XG5cdFx0dmFyIHdlaWdodCA9IHtcblx0XHRcdGVsOiBmb3JtLnF1ZXJ5U2VsZWN0b3IoJy5qcy13ZWlnaHQgaW5wdXQnKSxcblx0XHRcdHRlc3Q6IGZ1bmN0aW9uIHRlc3QoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmVsLnZhbHVlLmxlbmd0aCA+PSAxID8gMSA6IDA7XG5cdFx0XHR9LFxuXHRcdFx0Zm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuXHRcdFx0XHR0aGlzLmVsLmZvY3VzKCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdGlmIChmb3JtLnF1ZXJ5U2VsZWN0b3IoJy5qcy1hbW91bnQgaW5wdXQnKSkge1xuXHRcdHZhciBhbW91bnQgPSB7XG5cdFx0XHRlbDogZm9ybS5xdWVyeVNlbGVjdG9yKCcuanMtYW1vdW50IGlucHV0JyksXG5cdFx0XHR0ZXN0OiBmdW5jdGlvbiB0ZXN0KCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5lbC52YWx1ZS5sZW5ndGggPj0gMSA/IDEgOiAwO1xuXHRcdFx0fSxcblx0XHRcdGZvY3VzOiBmdW5jdGlvbiBmb2N1cygpIHtcblx0XHRcdFx0dGhpcy5lbC5mb2N1cygpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHRpZiAoZm9ybS5xdWVyeVNlbGVjdG9yKCcuanMtY29ycmVjdGlvbiBpbnB1dCcpKSB7XG5cdFx0dmFyIGNvcnJlY3Rpb24gPSB7XG5cdFx0XHRlbDogZm9ybS5xdWVyeVNlbGVjdG9yKCcuanMtY29ycmVjdGlvbiBpbnB1dCcpLFxuXHRcdFx0dGVzdDogZnVuY3Rpb24gdGVzdCgpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZWwudmFsdWUubGVuZ3RoID4gMSA/IDEgOiAwO1xuXHRcdFx0fSxcblx0XHRcdGZvY3VzOiBmdW5jdGlvbiBmb2N1cygpIHtcblx0XHRcdFx0dGhpcy5lbC5mb2N1cygpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdHBob25lOiBwaG9uZSxcbiAgICBjb21wYW55OiBjb21wYW55LFxuXHRcdG1haWw6IG1haWwsXG5cdFx0bmFtZTogbmFtZSxcblx0XHRhZ3JlZTogYWdyZWUsXG5cdFx0bWVzc2FnZTogbWVzc2FnZSxcblx0XHRmcm9tOiBmcm9tLFxuXHRcdHdoZXJlOiB3aGVyZSxcblx0XHR3ZWlnaHQ6IHdlaWdodCxcblx0XHRhbW91bnQ6IGFtb3VudCxcblx0XHRjb3JyZWN0aW9uOiBjb3JyZWN0aW9uXG5cdH07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBNYXNrIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCxvcHRpb25zID0ge30pe1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdGhpcy5zeW1ib2wgPSBvcHRpb25zLnN5bWJvbCB8fCAnXyc7IC8vINCh0LjQvNCy0L7QuyDQt9Cw0LzQtdC90LjRgtC10LvRjCDQvdC10LfQsNC/0L7Qu9C90LXQvdC90YvRhSDRj9GH0LXQtdC6XG4gICAgdGhpcy5tYXNrID0gb3B0aW9ucy5tYXNrIHx8ICcrNyAoX19fKSBfX18tX18tX18nOyAvLyDQnNCw0YHQutCwINGBINGD0YfRkdGC0L7QvCDRgdC40LzQstC+0LvQsCDQt9Cw0LzQtdC90LjRgtC10LvRj1xuICAgIHRoaXMuYWxsb3dlZENoYXJzID0gb3B0aW9ucy5hbGxvd2VkQ2hhcnMgfHwgJ1swLTldJzsgLy8g0KDQsNC30YDQtdGI0ZHQvdC90YvQtSDRgdC40LzQstC+0LvRiyAo0LHRg9C00YPRgiDRh9Cw0YHRgtGM0Y4g0YDQtdCz0LXQutGB0L/QsClcbiAgICB0aGlzLmVtcHR5ID0gb3B0aW9ucy5lbXB0eSB8fCAnZmFsc2UnOyAvLyDQoNCw0LfRgNC10YjQuNGC0Ywg0L/Rg9GB0YLQvtC1INC/0L7Qu9C1XG4gICAgdGhpcy5sZWdhbExlbmd0aCA9IG9wdGlvbnMubGVnYWxMZW5ndGg7IC8vINCU0L7Qv9GD0YHRgtC40LzRi9C1INC00LvQuNC90Ysg0LfQsNC/0L7Qu9C90LXQvdC40Y9cblxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgZWxlbWVudC52YWx1ZSA9IHRoaXMudmFsdWUgPSB0aGlzLm1hc2s7XG5cbiAgICB0aGlzLnJlZ2V4ID0gYCR7dGhpcy5hbGxvd2VkQ2hhcnN9fCR7dGhpcy5zeW1ib2x9YDtcbiAgICB0aGlzLm1hc2tTeW1ib2xzID0gdGhpcy5tYXNrLm1hdGNoKG5ldyBSZWdFeHAodGhpcy5yZWdleCwnZ2knKSk7XG4gICAgdGhpcy5hbGxvd2VkQ2hhcnNMZW5ndGggPSAwO1xuICAgIHRoaXMubWFza1N5bWJvbHMuZm9yRWFjaCggZWxlbSA9PiB7XG4gICAgICBpZiAoZWxlbSA9PSB0aGlzLnN5bWJvbClcbiAgICAgICAgdGhpcy5hbGxvd2VkQ2hhcnNMZW5ndGgrKztcbiAgICB9KTtcblxuICAgIHRoaXMuY2hlY2tLZXlDb2RlU3VwcG9ydCgpO1xuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGZ1bmN0aW9uKCl7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoICgpPT57XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSggKCk9PntcbiAgICAgICAgICB2YXIgaW5kZXhlZFN5bWJvbCA9IF90aGlzLmVsZW1lbnQudmFsdWUuaW5kZXhPZihfdGhpcy5zeW1ib2wpO1xuICAgICAgICAgIGlmIChpbmRleGVkU3ltYm9sICE9IC0xKVxuICAgICAgICAgICAgX3RoaXMuY2FyZXRQb3NpdGlvbiA9IGluZGV4ZWRTeW1ib2w7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgX3RoaXMuY2FyZXRQb3NpdGlvbiA9IF90aGlzLmVsZW1lbnQudmFsdWUubGVuZ3RoO1xuXG4gICAgICAgICAgX3RoaXMuc2V0Q2FyZXRQb3NpdGlvbihfdGhpcy5lbGVtZW50LF90aGlzLmNhcmV0UG9zaXRpb24sX3RoaXMuY2FyZXRQb3NpdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbigpe1xuXG4gICAgICBpZiAoIV90aGlzLmVsZW1lbnQudmFsdWUpIF90aGlzLmVsZW1lbnQudmFsdWUgPSBfdGhpcy5tYXNrO1xuXG4gICAgfSk7XG5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgKGUpID0+IHtcbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PSAnbWFzaycpIHRoaXMucGFzdGVXaXRoTWFzayhlKTtcbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PSAnc2ltcGxlTWFzaycpIHRoaXMucGFzdGVXaXRoU2ltcGxlTWFzayhlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX19iaW5kZWRSb3V0ZSA9IHRoaXMucm91dGUuYmluZCh0aGlzKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0aGlzLl9fYmluZGVkUm91dGUpO1xuICAgIC8vIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCB0aGlzLl9fYmluZGVkUm91dGUpO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX19iaW5kZWRSb3V0ZSk7XG5cblxuICB9XG5cbiAgcm91dGUoZSl7XG5cbiAgICBpZiAoZS5rZXlDb2RlID09PSAwIHx8IGUua2V5Q29kZSA9PT0gMjI5KVxuICAgICAgdGhpcy5fX3NpbXBsZU1hc2soZSk7XG4gICAgZWxzZVxuICAgICAgdGhpcy5fX21hc2soZSk7XG4gIH1cblxuICBfX3NpbXBsZU1hc2soZSl7XG5cbiAgICB2YXIgc3RhY2sgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSggKCk9PntcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCAoKT0+e1xuICAgICAgICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUubGVuZ3RoID49IHRoaXMuZWxlbWVudC52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZWxlbWVudC52YWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKHRoaXMuZWxlbWVudC52YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIHN0YWNrLnRoZW4oIHJlc3VsdCA9PiB7XG4gICAgICB2YXIgbnVtYmVycyA9IHJlc3VsdC5tYXRjaChuZXcgUmVnRXhwKHRoaXMuYWxsb3dlZENoYXJzLCdpZycpKTtcbiAgICAgIHJldHVybiBudW1iZXJzO1xuICAgIH0pXG4gICAgLnRoZW4oIHJlc3VsdCA9PiB7XG4gICAgICB2YXIgbWFza0FycmF5ID0gdGhpcy5tYXNrLnNwbGl0KCcnKTtcbiAgICAgIHZhciBtYXNrQXJyYXlDaGFycyA9IHRoaXMubWFzay5tYXRjaChuZXcgUmVnRXhwKHRoaXMuYWxsb3dlZENoYXJzLCdpZycpKTtcbiAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hc2tBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobWFza0FycmF5Q2hhcnMgJiYgbWFza0FycmF5Q2hhcnNbY291bnRdKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCAmJiBtYXNrQXJyYXlDaGFyc1tjb3VudF0gPT0gcmVzdWx0W2NvdW50XSl7XG4gICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXNrQXJyYXlbaV0gPT0gdGhpcy5zeW1ib2wgJiYgcmVzdWx0ICYmIHJlc3VsdFtjb3VudF0pIHtcbiAgICAgICAgICBtYXNrQXJyYXlbaV0gPSByZXN1bHRbY291bnRdO1xuICAgICAgICAgIHRoaXMuY2FyZXJQb3NpdGlvbiA9IGkgKyAxO1xuICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgIH0gZWxzZSBpZiAobWFza0FycmF5W2ldID09IHRoaXMuc3ltYm9sICYmIHJlc3VsdCAmJiAhcmVzdWx0W2NvdW50XSkge1xuICAgICAgICAgIG1hc2tBcnJheSA9IG1hc2tBcnJheS5zbGljZSgwLGkpO1xuICAgICAgICAgIHRoaXMuY2FyZXJQb3NpdGlvbiA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbWFza0FycmF5O1xuICAgIH0pXG4gICAgLnRoZW4oIHJlc3VsdCA9PiB7XG4gICAgICB0aGlzLnZhbHVlID0gcmVzdWx0LmpvaW4oJycpO1xuICAgIH0pXG4gICAgLnRoZW4oICgpPT57XG4gICAgICB0aGlzLmRpc3BsYXlSZXN1bHQoKTtcbiAgICB9KVxuICAgIC5jYXRjaCggZSA9PiB7XG5cbiAgICB9KTtcbiAgfVxuXG4gIF9fbWFzayhlKXtcblxuICAgIGlmKGUua2V5ID09IFwiTWV0YVwiXG4gICAgfHwgZS5rZXlJZGVudGlmaWVyID09IFwiTWV0YVwiXG4gICAgfHwgZS5rZXlDb2RlID09IDkxXG4gICAgfHwgZS5tZXRhS2V5ID09IHRydWVcbiAgICB8fCBlLmN0cmxLZXkgPT0gdHJ1ZSkge1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgdmFyIGtleSA9IHRoaXMud2hhdElzS2V5KGUpO1xuICAgIHZhciBrZXlzID0gWyAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICdCYWNrc3BhY2UnLCAnRGVsZXRlJ107XG5cbiAgICAhdGhpcy5rZXlzQXJyYXkgJiYgKHRoaXMua2V5c0FycmF5ID0gW10pO1xuXG4gICAgaWYgKGtleXMuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT0gJ0JhY2tzcGFjZScgfHwga2V5ID09ICdEZWxldGUnKSB7XG4gICAgICBpZiAoIXRoaXMua2V5c0FycmF5Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgdGhpcy5rZXlzQXJyYXkucG9wKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzeW1ib2xzSW5NYXNrID0gdGhpcy5tYXNrLm1hdGNoKG5ldyBSZWdFeHAodGhpcy5zeW1ib2wsJ2lnJykpO1xuXG4gICAgICBpZiAoc3ltYm9sc0luTWFzay5sZW5ndGggPiB0aGlzLmtleXNBcnJheS5sZW5ndGgpXG4gICAgICAgIHRoaXMua2V5c0FycmF5LnB1c2goa2V5KTtcbiAgICAgIGVsc2UgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmtleXNBcnJheS5sZW5ndGggPT0gMCkge1xuXG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5tYXNrO1xuICAgICAgdGhpcy5jYXJlclBvc2l0aW9uID0gdGhpcy5tYXNrLmluZGV4T2YodGhpcy5zeW1ib2wpO1xuXG4gICAgfSBlbHNlIHtcblxuICAgICAgdmFyIG1hc2tBcnJheSA9IHRoaXMubWFzay5zcGxpdCgnJyk7XG4gICAgICB2YXIgY291bnQgPSAwO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hc2tBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobWFza0FycmF5W2ldID09IHRoaXMuc3ltYm9sICYmIHRoaXMua2V5c0FycmF5W2NvdW50XSkge1xuICAgICAgICAgIG1hc2tBcnJheVtpXSA9IHRoaXMua2V5c0FycmF5W2NvdW50XTtcbiAgICAgICAgICB0aGlzLmNhcmVyUG9zaXRpb24gPSBpICsgMTtcbiAgICAgICAgICBjb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMudmFsdWUgPSBtYXNrQXJyYXkuam9pbignJyk7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwbGF5UmVzdWx0KCk7XG4gIH1cblxuICBzZXRDYXJldFBvc2l0aW9uKGN0cmwsIHN0YXJ0LCBlbmQpIHtcbiAgICAvLyBJRSA+PSA5IGFuZCBvdGhlciBicm93c2Vyc1xuICAgIGlmIChjdHJsLnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgICBjdHJsLmZvY3VzKCk7XG4gICAgICBjdHJsLnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpO1xuICAgIH1cbiAgICAvLyBJRSA8IDlcbiAgICBlbHNlIGlmIChjdHJsLmNyZWF0ZVRleHRSYW5nZSkge1xuICAgICAgdmFyIHJhbmdlID0gY3RybC5jcmVhdGVUZXh0UmFuZ2UoKTtcbiAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgcmFuZ2UubW92ZUVuZCgnY2hhcmFjdGVyJywgZW5kKTtcbiAgICAgIHJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgc3RhcnQpO1xuICAgICAgcmFuZ2Uuc2VsZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgd2hhdElzS2V5KGUpe1xuICAgIHZhciBrZXkgPSBudWxsO1xuXG4gICAgaWYgKGUua2V5KSB7XG4gICAgICBrZXkgPSBlLmtleTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgc3dpdGNoICgnJyArIGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSAnNDgnOiBrZXkgPSAnMCc7IGJyZWFrO1xuICAgICAgICBjYXNlICc0OSc6IGtleSA9ICcxJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJzUwJzoga2V5ID0gJzInOyBicmVhaztcbiAgICAgICAgY2FzZSAnNTEnOiBrZXkgPSAnMyc7IGJyZWFrO1xuICAgICAgICBjYXNlICc1Mic6IGtleSA9ICc0JzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJzUzJzoga2V5ID0gJzUnOyBicmVhaztcbiAgICAgICAgY2FzZSAnNTQnOiBrZXkgPSAnNic7IGJyZWFrO1xuICAgICAgICBjYXNlICc1NSc6IGtleSA9ICc3JzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJzU2Jzoga2V5ID0gJzgnOyBicmVhaztcbiAgICAgICAgY2FzZSAnNTcnOiBrZXkgPSAnOSc7IGJyZWFrO1xuICAgICAgICBjYXNlICc4JzogIGtleSA9ICdCYWNrc3BhY2UnOyBicmVhaztcbiAgICAgICAgY2FzZSAnNDYnOiBrZXkgPSAnRGVsZXRlJzsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50LmtleUlkZW50aWZpZXIpIHtcbiAgICAgIHN3aXRjaCAoJycgKyBldmVudC5rZXlJZGVudGlmaWVyKSB7XG4gICAgICAgIGNhc2UgJ1UrMDAzMCc6IGtleSA9ICcwJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1UrMDAzMSc6IGtleSA9ICcxJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1UrMDAzMic6IGtleSA9ICcyJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1UrMDAzMyc6IGtleSA9ICczJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1UrMDAzNCc6IGtleSA9ICc0JzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1UrMDAzNSc6IGtleSA9ICc1JzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1UrMDAzNic6IGtleSA9ICc2JzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1UrMDAzNyc6IGtleSA9ICc3JzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1UrMDAzOCc6IGtleSA9ICc4JzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1UrMDAzOSc6IGtleSA9ICc5JzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1UrMDAwOCc6IGtleSA9ICdCYWNrc3BhY2UnOyBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgcGFzdGVXaXRoTWFzayhlKXtcbiAgICB2YXIgcGFzdGVEYXRhID0gZS5jbGlwYm9hcmREYXRhICYmIGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCdUZXh0Jyk7XG5cbiAgICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAudGhlbiggKCkgPT4ge1xuICAgICAgICBpZiAocGFzdGVEYXRhKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHJldHVybiBwYXN0ZURhdGEubWF0Y2gobmV3IFJlZ0V4cCh0aGlzLmFsbG93ZWRDaGFycywnZ2knKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCByZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSggKCk9PntcbiAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCAoKT0+e1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5lbGVtZW50LnZhbHVlLm1hdGNoKG5ldyBSZWdFeHAodGhpcy5hbGxvd2VkQ2hhcnMsJ2dpJykpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC50aGVuKCBkYXRhID0+IHtcbiAgICAgICAgaWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoJ9Cf0YPRgdGC0L4g0LLQviDQstGB0YLQsNCy0LrQtScpXG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+PSB0aGlzLm1hc2tTeW1ib2xzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuY2hlY2tEb3VibGVNYXNrU3ltYm9scyhkYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMua2V5c0FycmF5Lmxlbmd0aCA8IHRoaXMuYWxsb3dlZENoYXJzTGVuZ3RoKVxuICAgICAgICAgICAgICB0aGlzLmtleXNBcnJheS5wdXNoKGRhdGFbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC50aGVuKCAoKSA9PiB7XG4gICAgICAgIHZhciBtYXNrQXJyYXkgPSB0aGlzLm1hc2suc3BsaXQoJycpO1xuICAgICAgICB2YXIgY291bnQgPSAwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFza0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKG1hc2tBcnJheVtpXSA9PSB0aGlzLnN5bWJvbCAmJiB0aGlzLmtleXNBcnJheVtjb3VudF0pIHtcbiAgICAgICAgICAgIG1hc2tBcnJheVtpXSA9IHRoaXMua2V5c0FycmF5W2NvdW50XTtcbiAgICAgICAgICAgIHRoaXMuY2FyZXJQb3NpdGlvbiA9IGkgKyAxO1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZSA9IG1hc2tBcnJheS5qb2luKCcnKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5UmVzdWx0KCk7XG5cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGUpPT57XG4gICAgICAgIGNvbnNvbGUubG9nKCfQn9GD0YHRgtC+0YLQsCcsZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHBhc3RlV2l0aFNpbXBsZU1hc2soKSB7XG4gICAgdGhpcy5fX3NpbXBsZU1hc2soKTtcbiAgfVxuXG4gIGRpc3BsYXlSZXN1bHQoKXtcbiAgICB2YXIgbGVuZ3RoQWxsb3dlZENoYXJzID0gdGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlLm1hdGNoKCBuZXcgUmVnRXhwKHRoaXMuYWxsb3dlZENoYXJzLCdnaScpICk7XG4gICAgaWYgKHRoaXMubWFza1N5bWJvbHMubGVuZ3RoID09PSBsZW5ndGhBbGxvd2VkQ2hhcnMpIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlICE9IHRoaXMubGFzdFZhbHVlKSB7XG5cbiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudC52YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgdGhpcy5zZXRDYXJldFBvc2l0aW9uKHRoaXMuZWxlbWVudCx0aGlzLmNhcmVyUG9zaXRpb24sdGhpcy5jYXJlclBvc2l0aW9uKTtcbiAgICB0aGlzLmVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JykpO1xuICB9XG4gIGNoZWNrS2V5Q29kZVN1cHBvcnQoKXtcbiAgICB0aGlzLm1ldGhvZCA9ICdtYXNrJztcblxuICAgIHZhciBjaGVja0tleUNvZGUgPSAoZSkgPT4ge1xuICAgICAgaWYgKHRoaXMuYWxsb3dlZENoYXJzID09ICdbMC05XScgJiYgZS5rZXlDb2RlICE9PSAwIHx8IGUua2V5Q29kZSAhPT0gMjI5KXtcbiAgICAgICAgdGhpcy5tZXRob2QgPSAnbWFzayc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1ldGhvZCA9ICdzaW1wbGVNYXNrJztcbiAgICAgIH1cbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGNoZWNrS2V5Q29kZSlcbiAgICB9O1xuXG4gICAgYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsY2hlY2tLZXlDb2RlKTtcbiAgfVxuXG4gIGNoZWNrRG91YmxlTWFza1N5bWJvbHMoZGF0YSkge1xuICAgIHRoaXMua2V5c0FycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1hc2tTeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZGF0YVtpXSAhPSB0aGlzLm1hc2tTeW1ib2xzW2ldICYmIHRoaXMua2V5c0FycmF5Lmxlbmd0aCA8IHRoaXMuYWxsb3dlZENoYXJzTGVuZ3RoKSB7XG4gICAgICAgIHRoaXMua2V5c0FycmF5LnB1c2goZGF0YVtpXSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKDtpIDwgZGF0YS5sZW5ndGg7aSsrKSB7XG4gICAgICBpZiAodGhpcy5rZXlzQXJyYXkubGVuZ3RoIDwgdGhpcy5hbGxvd2VkQ2hhcnNMZW5ndGgpXG4gICAgICAgIHRoaXMua2V5c0FycmF5LnB1c2goZGF0YVtpXSlcbiAgICAgIGVsc2VcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdGVzdCgpe1xuICAgIGxldCByZWdleHAgPSBuZXcgUmVnRXhwKHRoaXMuc3ltYm9sKTtcbiAgICByZXR1cm4gIXJlZ2V4cC50ZXN0KHRoaXMudmFsdWUpO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5rZXlzQXJyYXkgPSBbXTtcbiAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSAnJztcbiAgfVxufVxuIiwiLy8gaW1wb3J0IFRyYW5zaXRpb25FbmQgZnJvbSAnLi4vLi4vLi4vbGF5b3V0L2pzL3RyYW5zaXRpb25FbmQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUYWIge1xuXHRjb25zdHJ1Y3RvcihlbCkge1xuXHRcdHRoaXMudGFiTGFiZWxHcm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYnNfX2xhYmVsR3JvdXAnKVswXTtcblx0XHR0aGlzLnRhYkxhYmVsSXRlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYnNfX2xhYmVsJyk7XG5cdFx0dGhpcy5sYWJlbEN1cnJlbnRJbmRpY2F0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJzX19sYWJlbEN1cnJlbnRMaW5lJylbMF07XG5cdFx0dGhpcy50YWJDb250ZW50R3JvdXAgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJzX19jb250ZW50R3JvdXAnKVswXTtcblx0XHR0aGlzLnRhYkNvbnRlbnRJdGVtID0gdGhpcy50YWJDb250ZW50R3JvdXAuY2hpbGRyZW47XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRhYkxhYmVsSXRlbS5sZW5ndGg7IGkrKykge1xuXHRcdFx0dGhpcy5hZGRMaXN0ZW5lcih0aGlzLnRhYkxhYmVsSXRlbVtpXSk7XG5cdFx0fVxuXHRcdHRoaXMuc2V0Q3VycmVudFRhYihkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJzX19sYWJlbC0tY3VycmVudCcpWzBdKTtcbiAgXHR9XG4gIFx0YWRkTGlzdGVuZXIoZWxlbWVudCkge1xuXHRcdGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7XG5cdFx0XHR0aGlzLnJlbW92ZUN1cnJlbnRUYWIodGhpcy50YWJMYWJlbEl0ZW0pO1xuXHRcdFx0dGhpcy5zZXRDdXJyZW50VGFiKGV2ZW50LnRhcmdldCk7XG5cdFx0fSk7XG5cdH1cblx0cmVtb3ZlQ3VycmVudFRhYihlbGVtZW50cykge1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGVsZW1lbnRzW2ldLmNsYXNzTGlzdC5yZW1vdmUoXCJ0YWJzX19sYWJlbC0tY3VycmVudFwiKTtcblx0XHRcdHRoaXMudGFiQ29udGVudEl0ZW1baV0uY2xhc3NMaXN0LmFkZCgnbm9uZScpO1xuXHRcdH1cblx0fVxuXHRzZXRDdXJyZW50VGFiKGVsZW1lbnQpIHtcblx0XHR0aGlzLmFuaW1hdGlvbkN1cnJlbnRJbmRpY2F0b3IoZWxlbWVudCk7XG5cdFx0Ly8gbGFiZWxcblx0XHRlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0YWJzX19sYWJlbC0tY3VycmVudFwiKTtcblx0XHQvLyBjb250ZW50XG5cdFx0bGV0IGFjdGl2ZUVsZW1lbnQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1pZCcpO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50YWJDb250ZW50SXRlbS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHRoaXMudGFiQ29udGVudEl0ZW1baV0uZ2V0QXR0cmlidXRlKCdkYXRhLWlkJykgPT0gYWN0aXZlRWxlbWVudCkge1xuXHRcdFx0XHR0aGlzLnRhYkNvbnRlbnRJdGVtW2ldLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHRcdFx0XHR2YXIgaGVpZ2h0ID0gdGhpcy50YWJDb250ZW50SXRlbVtpXS5jaGlsZHJlblswXS5vZmZzZXRIZWlnaHQ7XG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKGhlaWdodCk7XG5cdFx0XHRcdHRoaXMudGFiQ29udGVudEdyb3VwLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG5cdFx0XHRcdHRoaXMudGFiQ29udGVudEl0ZW1baV0uc3R5bGUub3BhY2l0eSA9IDE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnRhYkNvbnRlbnRJdGVtW2ldLnN0eWxlLm9wYWNpdHkgPSAwO1xuXHRcdFx0XHR0aGlzLnRhYkNvbnRlbnRJdGVtW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGFuaW1hdGlvbkN1cnJlbnRJbmRpY2F0b3IoZWxlbWVudCkge1xuXHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmxhYmVsQ3VycmVudEluZGljYXRvci5zdHlsZS5sZWZ0ID0gZWxlbWVudC5vZmZzZXRMZWZ0ICsgJ3B4Jztcblx0XHRcdFx0dGhpcy5sYWJlbEN1cnJlbnRJbmRpY2F0b3Iuc3R5bGUud2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoICsgJ3B4Jztcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG59IiwiZXhwb3J0IGNvbnN0IENsYXNzTmFtZSA9IHtcbiAgT1BFTkVEICAgICAgICA6ICd0YWJzX19zZWxlY3QtLWlzT3BlbmVkJyxcbn07XG5cbi8vIGltcG9ydCBUcmFuc2l0aW9uRW5kIGZyb20gJy4uLy4uLy4uL2xheW91dC9qcy90cmFuc2l0aW9uRW5kJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFiU2VsZWN0TW9iaWxlIHtcblx0Y29uc3RydWN0b3IoZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG5cblx0XHR0aGlzLnRhYkxhYmVsR3JvdXAgPSB0aGlzLmVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFic19fbGFiZWxHcm91cCcpWzBdO1xuXHRcdHRoaXMudGFiTGFiZWxJdGVtID0gdGhpcy5lbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYnNfX2xhYmVsJyk7XG5cdFx0dGhpcy5sYWJlbEN1cnJlbnRJbmRpY2F0b3IgPSB0aGlzLmVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFic19fbGFiZWxDdXJyZW50TGluZScpWzBdO1xuXHRcdHRoaXMudGFiQ29udGVudEdyb3VwID0gdGhpcy5lbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhYnNfX2NvbnRlbnRHcm91cCcpWzBdO1xuXHRcdHRoaXMudGFiQ29udGVudEl0ZW0gPSB0aGlzLnRhYkNvbnRlbnRHcm91cC5jaGlsZHJlbjtcblxuICAgIHRoaXMuc2VsZWN0VHJpZ2dlciA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudGFic19fc2VsZWN0Jyk7XG4gICAgdGhpcy5zZWxlY3RQbGFjZWhvbGRlciA9IHRoaXMuZWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YWJzX19zZWxlY3RQbGFjZWhvbGRlcicpWzBdO1xuICAgIHRoaXMuc2VsZWN0RHJvcGRvd24gPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcignLnRhYnNfX3NlbGVjdERyb3Bkb3duJyk7XG4gICAgdGhpcy5zZWxlY3REcm9wZG93bldyYXAgPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcignLnRhYnNfX2Ryb3Bkb3duSW5uZXInKTtcblxuICAgIHRoaXMuZHJvcGRvd25QYWRkaW5nVG9wID0gMzU7XG4gICAgdGhpcy5kcm9wZG93blBhZGRpbmdCb3R0b20gPSAyMDtcbiAgICB0aGlzLmlzT3BlbmVkID0gZmFsc2U7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudGFiTGFiZWxJdGVtLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR0aGlzLmFkZExpc3RlbmVyKHRoaXMudGFiTGFiZWxJdGVtW2ldKTtcblx0XHR9XG5cbiAgICB0aGlzLmFkZExpc3RlbmVyU2VsZWN0KHRoaXMuc2VsZWN0VHJpZ2dlcik7XG5cblx0XHR0aGlzLnNldEN1cnJlbnRUYWIoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFic19fbGFiZWwtLWN1cnJlbnQnKVswXSk7XG5cdH1cblxuICBoYW5kbGVEb2N1bWVudENsaWNrKHsgdGFyZ2V0IH0pIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0VHJpZ2dlci5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgYWRkTGlzdGVuZXJTZWxlY3QoZWxlbWVudCkge1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7XG4gICAgICB0aGlzLnRvZ2dsZSgpXG4gICAgfSk7XG4gIH1cblxuXHRhZGRMaXN0ZW5lcihlbGVtZW50KSB7XG5cdFx0ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcblx0XHRcdHRoaXMucmVtb3ZlQ3VycmVudFRhYih0aGlzLnRhYkxhYmVsSXRlbSk7XG5cdFx0XHR0aGlzLnNldEN1cnJlbnRUYWIoZXZlbnQudGFyZ2V0KTtcblx0XHR9KTtcblx0fVxuXG5cdHJlbW92ZUN1cnJlbnRUYWIoZWxlbWVudHMpIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRlbGVtZW50c1tpXS5jbGFzc0xpc3QucmVtb3ZlKFwidGFic19fbGFiZWwtLWN1cnJlbnRcIik7XG5cdFx0XHR0aGlzLnRhYkNvbnRlbnRJdGVtW2ldLmNsYXNzTGlzdC5hZGQoJ25vbmUnKTtcblx0XHR9XG5cdH1cblxuICB0b2dnbGUoKSB7XG4gICAgaWYgKHRoaXMuaXNPcGVuZWQpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgb3BlbigpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlRG9jdW1lbnRDbGljay5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnNlbGVjdFRyaWdnZXIuY2xhc3NMaXN0LmFkZChDbGFzc05hbWUuT1BFTkVEKTtcbiAgICB0aGlzLnNldFBhZGRpbmdPbkRyb3Bkb3duKCk7XG4gICAgdGhpcy5zZWxlY3REcm9wZG93bi5zdHlsZS5oZWlnaHQgPSB0aGlzLmdldE9wZW5IZWlnaHQoKTtcbiAgICB0aGlzLmlzT3BlbmVkID0gdHJ1ZTtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVEb2N1bWVudENsaWNrLmJpbmQodGhpcykpO1xuICAgIHRoaXMuc2VsZWN0VHJpZ2dlci5jbGFzc0xpc3QucmVtb3ZlKENsYXNzTmFtZS5PUEVORUQpO1xuICAgIHRoaXMucmVtb3ZlUGFkZGluZ09uRHJvcGRvd24oKTtcbiAgICB0aGlzLnNlbGVjdERyb3Bkb3duLnN0eWxlLmhlaWdodCA9IDA7XG4gICAgdGhpcy5pc09wZW5lZCA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0T3BlbkhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3REcm9wZG93bldyYXAuc2Nyb2xsSGVpZ2h0ICsgdGhpcy5kcm9wZG93blBhZGRpbmdUb3AgKyB0aGlzLmRyb3Bkb3duUGFkZGluZ0JvdHRvbTtcbiAgfVxuXG4gIHNldFBhZGRpbmdPbkRyb3Bkb3duKCkge1xuICAgIHRoaXMuc2VsZWN0RHJvcGRvd24uc3R5bGUucGFkZGluZ1RvcCAgICA9IHRoaXMuZHJvcGRvd25QYWRkaW5nVG9wO1xuICAgIHRoaXMuc2VsZWN0RHJvcGRvd24uc3R5bGUucGFkZGluZ0JvdHRvbSA9IHRoaXMuZHJvcGRvd25QYWRkaW5nQm90dG9tO1xuICB9XG5cbiAgcmVtb3ZlUGFkZGluZ09uRHJvcGRvd24oKSB7XG4gICAgdGhpcy5zZWxlY3REcm9wZG93bi5zdHlsZS5wYWRkaW5nVG9wICAgID0gJyc7XG4gICAgdGhpcy5zZWxlY3REcm9wZG93bi5zdHlsZS5wYWRkaW5nQm90dG9tID0gJyc7XG4gIH1cblxuXHRzZXRDdXJyZW50VGFiKGVsZW1lbnQpIHtcblx0XHQvLyB0aGlzLmFuaW1hdGlvbkN1cnJlbnRJbmRpY2F0b3IoZWxlbWVudCk7XG5cdFx0Ly8gbGFiZWxcblx0XHRlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0YWJzX19sYWJlbC0tY3VycmVudFwiKTtcbiAgICB0aGlzLnNlbGVjdFBsYWNlaG9sZGVyLmlubmVySFRNTCA9IGVsZW1lbnQuaW5uZXJIVE1MO1xuXHRcdC8vIGNvbnRlbnRcblx0XHRsZXQgYWN0aXZlRWxlbWVudCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWlkJyk7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRhYkNvbnRlbnRJdGVtLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAodGhpcy50YWJDb250ZW50SXRlbVtpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKSA9PSBhY3RpdmVFbGVtZW50KSB7XG5cdFx0XHRcdHRoaXMudGFiQ29udGVudEl0ZW1baV0uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0XHRcdHZhciBoZWlnaHQgPSB0aGlzLnRhYkNvbnRlbnRJdGVtW2ldLmNoaWxkcmVuWzBdLm9mZnNldEhlaWdodDtcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coaGVpZ2h0KTtcblx0XHRcdFx0dGhpcy50YWJDb250ZW50R3JvdXAuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4Jztcblx0XHRcdFx0dGhpcy50YWJDb250ZW50SXRlbVtpXS5zdHlsZS5vcGFjaXR5ID0gMTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMudGFiQ29udGVudEl0ZW1baV0uc3R5bGUub3BhY2l0eSA9IDA7XG5cdFx0XHRcdHRoaXMudGFiQ29udGVudEl0ZW1baV0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Ly8gYW5pbWF0aW9uQ3VycmVudEluZGljYXRvcihlbGVtZW50KSB7XG5cdC8vIFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblx0Ly8gXHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdC8vIFx0XHRcdHRoaXMubGFiZWxDdXJyZW50SW5kaWNhdG9yLnN0eWxlLmxlZnQgPSBlbGVtZW50Lm9mZnNldExlZnQgKyAncHgnO1xuXHQvLyBcdFx0XHR0aGlzLmxhYmVsQ3VycmVudEluZGljYXRvci5zdHlsZS53aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGggKyAncHgnO1xuXHQvLyBcdFx0fSk7XG5cdC8vIFx0fSk7XG5cdC8vIH1cbn1cbiIsImltcG9ydCBBbmltYXRpb25zIGZyb20gJy4uLy4uL2xheW91dC9qcy9hbmltYXRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBjb250ZW50SGVhZGVyIGV4dGVuZHMgQW5pbWF0aW9ucyB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZWwgPSBlbGVtZW50O1xuICAgIHRoaXMud3JhcCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmNvbnRlbnRIZWFkZXJfX3dyYXAnKTtcbiAgICB0aGlzLmZ1bGxIZWlnaHQgPSB0aGlzLndyYXAub2Zmc2V0SGVpZ2h0O1xuICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy53cmFwLnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50SGVhZGVyX19jb250ZW50Jyk7XG4gICAgdGhpcy5wYXJhZ3JhZkNvdW50ID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmNvbnRlbnRIZWFkZXJfX3dyYXAgcCcpLmxlbmd0aDtcblxuICAgIHRoaXMuaXNNb2JpbGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggPD0gNDgwO1xuICAgIGlmICh0aGlzLmZ1bGxIZWlnaHQgPiAyMDAgJiYgdGhpcy5wYXJhZ3JhZkNvdW50ID4gKHRoaXMuaXNNb2JpbGUgPyAxIDogMikpIHtcbiAgICAgIHRoaXMuYmVnaW5IZWlnaHQgPSAwO1xuICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgdGhpcy5maXJzdFAgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuY29udGVudEhlYWRlcl9fd3JhcCBwOmZpcnN0LWNoaWxkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpcnN0UCA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50SGVhZGVyX193cmFwIHA6Zmlyc3QtY2hpbGQnKTtcbiAgICAgICAgdGhpcy5zZWNvbmRQID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcignLmNvbnRlbnRIZWFkZXJfX3dyYXAgcDpmaXJzdC1jaGlsZCArIHAnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VwYXJhdGVyUCA9IHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmZpcnN0UCkuZ2V0UHJvcGVydHlWYWx1ZSgnbWFyZ2luLXRvcCcpLCAxMCk7XG4gICAgICB0aGlzLnNldEJlZ2luSGVpZ2h0KHRoaXMuZ2V0QmVnaW5IZWlnaHQoKSk7XG4gICAgICB0aGlzLmJ1dHRvblRleHRTaG93ID0gJ9Cf0L7QutCw0LfQsNGC0Ywg0L/QvtC70L3QvtGB0YLRjNGOJztcbiAgICAgIHRoaXMuYnV0dG9uVGV4dEhpZGUgPSAn0KHQstC10YDQvdGD0YLRjCc7XG4gICAgICB0aGlzLmJ1dHRvbiA9IHRoaXMuYWRkQnV0dG9uKCk7XG4gICAgICB0aGlzLmJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMudHJpZ2dlckhlaWdodCgpKTtcbiAgICB9XG4gIH1cbiAgZ2V0QmVnaW5IZWlnaHQoKSB7XG4gICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgIHRoaXMuYmVnaW5IZWlnaHQgPSB0aGlzLmZpcnN0UC5vZmZzZXRIZWlnaHQgKyB0aGlzLnNlcGFyYXRlclA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmVnaW5IZWlnaHQgPSB0aGlzLmZpcnN0UC5vZmZzZXRIZWlnaHQgKyB0aGlzLnNlY29uZFAub2Zmc2V0SGVpZ2h0ICsgdGhpcy5zZXBhcmF0ZXJQKjI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJlZ2luSGVpZ2h0O1xuICB9XG4gIHNldEJlZ2luSGVpZ2h0KGJlZ2luSGVpZ2h0KSB7XG4gICAgdGhpcy53cmFwLnN0eWxlLmhlaWdodCA9IHRoaXMuZnVsbEhlaWdodCArICdweCc7XG4gICAgdGhpcy5oZWlnaHRBbmltYXRpb24oYmVnaW5IZWlnaHQpO1xuICB9XG4gIGhlaWdodEFuaW1hdGlvbihoZWlnaHQpIHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgaGVpZ2h0U3RhcnQgPSBwYXJzZUZsb2F0KHRoaXMud3JhcC5zdHlsZS5oZWlnaHQsIDEwKTtcbiAgICBjb25zdCBoZWlnaHRFbmQgPSBoZWlnaHQ7XG4gICAgY29uc3QgZHVyYXRpb24gPSBNYXRoLmFicyhoZWlnaHRTdGFydCAtIGhlaWdodEVuZCkvMjAwMCAqIDEwMDA7XG4gICAgY29uc3QgYW5pbWF0ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5fX3Byb2dyZXNzKHN0YXJ0LCBkdXJhdGlvbik7XG4gICAgICB0aGlzLndyYXAuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0U3RhcnQgKyAoaGVpZ2h0RW5kIC0gaGVpZ2h0U3RhcnQpKnByb2dyZXNzICsgJ3B4JztcbiAgICAgIGlmIChwcm9ncmVzcyA9PT0gMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XG4gICAgfVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgfVxuICBnZXRFbmRIZWlnaHQoKSB7XG4gICAgdGhpcy5mdWxsSGVpZ2h0ID0gdGhpcy5jb250YWluZXIub2Zmc2V0SGVpZ2h0ICsgdGhpcy5zZXBhcmF0ZXJQO1xuICAgIHJldHVybiB0aGlzLmZ1bGxIZWlnaHQ7XG4gIH1cbiAgb3BlbkNvbnRhaW5lcigpIHtcbiAgICB0aGlzLmhlaWdodEFuaW1hdGlvbih0aGlzLmdldEVuZEhlaWdodCgpKTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ2NvbnRlbnRIZWFkZXItLW9wZW5lZCcpO1xuICAgIHRoaXMuYnV0dG9uLmlubmVySFRNTCA9IHRoaXMuYnV0dG9uVGV4dEhpZGU7XG4gIH1cbiAgY2xvc2VDb250YWluZXIoKSB7XG4gICAgdGhpcy5oZWlnaHRBbmltYXRpb24odGhpcy5nZXRCZWdpbkhlaWdodCgpKTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoJ2NvbnRlbnRIZWFkZXItLW9wZW5lZCcpO1xuICAgIHRoaXMuYnV0dG9uLmlubmVySFRNTCA9IHRoaXMuYnV0dG9uVGV4dFNob3c7XG4gIH1cbiAgYWRkQnV0dG9uKCkge1xuICAgIHZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGJ1dHRvbi5jbGFzc05hbWUgPSAnY29udGVudEhlYWRlcl9fYnV0dG9uTW9yZSc7XG4gICAgYnV0dG9uLmlubmVySFRNTCA9ICc8ZGl2PicgKyB0aGlzLmJ1dHRvblRleHRTaG93ICsgJzwvZGl2Pic7XG4gICAgdGhpcy5lbC5hcHBlbmRDaGlsZChidXR0b24pO1xuICAgIHJldHVybiBidXR0b24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RpdicpWzBdO1xuICB9XG4gIHRyaWdnZXJIZWlnaHQoKSB7XG4gICAgaWYgKHRoaXMuZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdjb250ZW50SGVhZGVyLS1vcGVuZWQnKSkge1xuICAgICAgdGhpcy5jbG9zZUNvbnRhaW5lcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW5Db250YWluZXIoKTtcbiAgICB9XG4gIH1cbn0iLCJpbXBvcnQgQW5pbWF0aW9ucyBmcm9tICcuLi8uLi9sYXlvdXQvanMvYW5pbWF0aW9uJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgY29udGVudEhlYWRlciBleHRlbmRzIEFuaW1hdGlvbnMge1xuXHRjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLmVsID0gZWxlbWVudDtcblx0XHR0aGlzLnNjcm9sbEVsZW1lbnQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5ldmVudEZpbHRlcl9fbW9udGhHcm91cCcpO1xuXHRcdHRoaXMubGVmdEJ1dHRvbiA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmV2ZW50RmlsdGVyX19hcnJvd1ByZXYnKTtcblx0XHR0aGlzLnJpZ2h0QnV0dG9uID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuZXZlbnRGaWx0ZXJfX2Fycm93TmV4dCcpO1xuXHRcdHRoaXMubGVmdEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHRoaXMuc2Nyb2xsVG9SaWdodCgpKTtcblx0XHR0aGlzLnJpZ2h0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4gdGhpcy5zY3JvbGxUb0xlZnQoKSk7XG5cdH1cblx0c2Nyb2xsVG9MZWZ0KCkge1xuXHRcdHRoaXMuc2Nyb2xsRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzY3JvbGxUb0xlZnQnKTtcblx0XHR0aGlzLnNjcm9sbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2Nyb2xsVG9SaWdodCcpO1xuXHRcdHRoaXMucmlnaHRCdXR0b24uY2xhc3NMaXN0LmFkZCgnZXZlbnRGaWx0ZXJfX2Fycm93LS1pbkFjdGl2ZScpO1xuXHRcdHRoaXMubGVmdEJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdldmVudEZpbHRlcl9fYXJyb3ctLWluQWN0aXZlJyk7XG5cdFx0Ly8gY29uc29sZS5sb2coJ2xlZnQnKTtcblx0fVxuXHRzY3JvbGxUb1JpZ2h0KCkge1xuXHRcdHRoaXMuc2Nyb2xsRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzY3JvbGxUb0xlZnQnKTtcblx0XHR0aGlzLnNjcm9sbEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc2Nyb2xsVG9SaWdodCcpO1xuXHRcdHRoaXMucmlnaHRCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnZXZlbnRGaWx0ZXJfX2Fycm93LS1pbkFjdGl2ZScpO1xuXHRcdHRoaXMubGVmdEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdldmVudEZpbHRlcl9fYXJyb3ctLWluQWN0aXZlJyk7XG5cdFx0Ly8gY29uc29sZS5sb2coJ3JpZ2h0Jyk7XG5cdH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIHtcclxuICBjb25zdHJ1Y3Rvcih2aWRlb0NvbnRhaW5lcikge1xyXG4gICAgdGhpcy52aWRlb0NvbnRhaW5lciA9IHZpZGVvQ29udGFpbmVyO1xyXG4gICAgdGhpcy52aWRlbyA9IHRoaXMudmlkZW9Db250YWluZXIucXVlcnlTZWxlY3RvcigndmlkZW8nKTtcclxuXHJcbiAgICBpZiAoIXRoaXMudmlkZW8pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYnRuID0gdGhpcy52aWRlb0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcudmlkZW9Tb3VyY2VfX3BsYXlCdG4nKTtcclxuICAgIHRoaXMubGlzdGVuZXIoKTtcclxuICB9XHJcbiAgXHJcbiAgbGlzdGVuZXIoKSB7XHJcbiAgICB0aGlzLmJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMucGxheSgpKTtcclxuICB9XHJcblxyXG4gIHBsYXkoKSB7XHJcbiAgICB0aGlzLnZpZGVvLnBsYXkoKTtcclxuICAgIHRoaXMuYnRuLmNsYXNzTGlzdC5hZGQoJ3ZpZGVvU291cmNlX19wbGF5QnRuLS1oaWRkZW4nKTtcclxuICAgIHRoaXMudmlkZW8uY2xhc3NMaXN0LnJlbW92ZSgnY29udHJvbHNIaWRkZW4nKTtcclxuICAgIHRoaXMudmlkZW8uc2V0QXR0cmlidXRlKCdjb250cm9scycsICdjb250cm9scycpO1xyXG4gIH1cclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIHtcclxuICBjb25zdHJ1Y3Rvcih0aW1lcikge1xyXG4gICAgdGhpcy50aW1lciA9IHRpbWVyO1xyXG4gICAgdGhpcy50aW1lV3JhcCA9IHRoaXMudGltZXIucXVlcnlTZWxlY3RvcignLnRpbWUnKTtcclxuXHJcbiAgICB0aGlzLnRpbWVBcnJheSA9IHRoaXMudGltZVdyYXAuaW5uZXJUZXh0LnNwbGl0KCc6Jyk7XHJcbiAgICB0aGlzLmhvdXJzID0gK3RoaXMudGltZUFycmF5WzBdO1xyXG4gICAgdGhpcy5taW4gPSArdGhpcy50aW1lQXJyYXlbMV07XHJcbiAgICB0aGlzLnNlYyA9ICt0aGlzLnRpbWVBcnJheVsyXTtcclxuXHJcbiAgICB0aGlzLnRpbWUgPSB0aGlzLmhvdXJzICogMzYwMCArIHRoaXMubWluICogNjAgKyB0aGlzLnNlYztcclxuXHJcbiAgICB0aGlzLmRpc3BsYXlUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBkaXNwbGF5VGltZSgpIHtcclxuICAgIHNldEludGVydmFsKHRoaXMuY2hhbmdlVGltZS5iaW5kKHRoaXMpLCAxMDAwKTtcclxuICB9XHJcblxyXG4gIGNoYW5nZVRpbWUoKSB7XHJcbiAgICBpZiAodGhpcy50aW1lIDw9IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy50aW1lIC09IDE7XHJcblxyXG4gICAgY29uc3QgZm9ybWF0ZWRIb3VycyA9IHRoaXMuZ2V0Rm9ybWF0ZWRQYXJ0KHRoaXMuZ2V0SG91cnMoKSk7XHJcbiAgICBjb25zdCBmb3JtYXRlZE1pbiA9IHRoaXMuZ2V0Rm9ybWF0ZWRQYXJ0KHRoaXMuZ2V0TWluKCkpO1xyXG4gICAgY29uc3QgZm9ybWF0ZWRTZWMgPSB0aGlzLmdldEZvcm1hdGVkUGFydCh0aGlzLmdldFNlYygpKTtcclxuXHJcbiAgICBjb25zdCBmb3JtYXRlZFRpbWUgPSBgJHtmb3JtYXRlZEhvdXJzfToke2Zvcm1hdGVkTWlufToke2Zvcm1hdGVkU2VjfWA7XHJcbiAgICB0aGlzLnRpbWVXcmFwLmlubmVyVGV4dCA9IGZvcm1hdGVkVGltZTtcclxuICB9XHJcblxyXG4gIGdldEZvcm1hdGVkUGFydChwYXJ0KSB7XHJcbiAgICByZXR1cm4gcGFydCA+IDkgPyBgJHtwYXJ0fWAgOiBgMCR7cGFydH1gO1xyXG4gIH1cclxuXHJcbiAgZ2V0SG91cnMoKSB7XHJcbiAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnRpbWUgLyAzNjAwKTtcclxuICB9XHJcblxyXG4gIGdldE1pbigpIHtcclxuICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMudGltZSAvIDYwKSAtIHRoaXMuZ2V0SG91cnMoKSAqIDYwO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VjKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGltZSAtICh0aGlzLmdldEhvdXJzKCkgKiAzNjAwKSAtICh0aGlzLmdldE1pbigpICogNjApO1xyXG4gIH1cclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNze1xyXG4gIGNvbnN0cnVjdG9yKGp1bXBlcikge1xyXG4gICAgdGhpcy5qdW1wZXIgPSBqdW1wZXI7XHJcblxyXG4gICAgdGhpcy5zaXRlSGVhZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRhaW5lcl9fc2l0ZUhlYWRlci0tZml4ZWQnKTtcclxuICAgIHRoaXMuc2l0ZUhlYWRlckhlaWdodCA9IHRoaXMuc2l0ZUhlYWRlci5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgdGhpcy5pdGVtTmFtZVRvSnVtcCA9IHRoaXMuanVtcGVyLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xyXG4gICAgdGhpcy5pdGVtVG9KdW1wID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLml0ZW1OYW1lVG9KdW1wKTtcclxuXHJcbiAgICB0aGlzLmxpc3RlbmVyKCk7XHJcbiAgfVxyXG5cclxuICBsaXN0ZW5lcigpIHtcclxuICAgIHRoaXMuanVtcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMuanVtcCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBqdW1wKCkge1xyXG4gICAgY29uc3Qgc3BlZWQgPSAwLjU7XHJcbiAgICBjb25zdCBvZmZzZXRZID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xyXG4gICAgY29uc3QgaXRlbU9mZnNldFkgPSB0aGlzLml0ZW1Ub0p1bXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gdGhpcy5zaXRlSGVhZGVySGVpZ2h0O1xyXG4gICAgY29uc3Qgc3RvcEl0ZW1OYW1lID0gdGhpcy5pdGVtTmFtZVRvSnVtcDtcclxuICAgIGxldCBzdGFydCA9IG51bGw7XHJcblxyXG4gICAgY29uc3QgYW5pbWF0aW9uID0gKHRpbWUpID0+IHtcclxuICAgICAgaWYgKHN0YXJ0ID09PSBudWxsKSBzdGFydCA9IHRpbWU7XHJcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gdGltZSAtIHN0YXJ0O1xyXG5cclxuICAgICAgbGV0IHN0b3BQb3NpdGlvbjtcclxuICAgICAgaWYgKGl0ZW1PZmZzZXRZIDwgMCkge1xyXG4gICAgICAgIHN0b3BQb3NpdGlvbiA9IE1hdGgubWF4KG9mZnNldFkgLSBwcm9ncmVzcyAvIHNwZWVkLCBvZmZzZXRZICsgaXRlbU9mZnNldFkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHN0b3BQb3NpdGlvbiA9IE1hdGgubWluKG9mZnNldFkgKyBwcm9ncmVzcyAvIHNwZWVkLCBvZmZzZXRZICsgaXRlbU9mZnNldFkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgc3RvcFBvc2l0aW9uKTtcclxuICAgICAgaWYgKHN0b3BQb3NpdGlvbiAhPSBvZmZzZXRZICsgaXRlbU9mZnNldFkpIHtcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0aW9uKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGlvbik7XHJcbiAgfVxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xyXG4gIGNvbnN0cnVjdG9yKGNvbW1lbnQpIHtcclxuICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7XHJcbiAgICB0aGlzLnJlcGx5QnRuID0gdGhpcy5jb21tZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1yZXBseUJ0bicpO1xyXG4gICAgdGhpcy5yZXBseUZvcm1XcmFwID0gdGhpcy5jb21tZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1yZXBseUZvcm1XcmFwJyk7XHJcblxyXG4gICAgdGhpcy5oaWRlRm9ybSgpO1xyXG4gICAgdGhpcy5saXN0ZW5lcigpO1xyXG4gIH1cclxuXHJcbiAgbGlzdGVuZXIoKSB7XHJcbiAgICB0aGlzLnJlcGx5QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMudG9nZ2xlRm9ybSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVGb3JtKCkge1xyXG4gICAgdGhpcy5pc0hpZGUgPyB0aGlzLnNob3dGb3JtKCkgOiB0aGlzLmhpZGVGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBzaG93Rm9ybSgpIHtcclxuICAgIHRoaXMucmVwbHlGb3JtV3JhcC5zdHlsZS5oZWlnaHQgPSB0aGlzLnJlcGx5Rm9ybVdyYXAuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgdGhpcy5pc0hpZGUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGhpZGVGb3JtKCkge1xyXG4gICAgdGhpcy5yZXBseUZvcm1XcmFwLnN0eWxlLmhlaWdodCA9IDA7XHJcbiAgICB0aGlzLmlzSGlkZSA9IHRydWU7XHJcbiAgfVxyXG59Il0sInNvdXJjZVJvb3QiOiIifQ==*/