{"version":3,"sources":["main.js"],"names":["r","e","n","t","o","i","f","c","require","u","a","Error","code","p","exports","call","length","1","module","_animations2","_interopRequireDefault","_menu2","_languages2","_emailsender2","_imager2","obj","__esModule","default","document","onreadystatechange","readyState","init","lazyload","lazyloadOffset","availableWidths","400","600","800","1366","./modules/animations.js","./modules/emailsender","./modules/languages.js","./modules/menu.js","imager.js","2","_aos","_aos2","scrollTo","element","to","duration","perTick","scrollTop","setTimeout","mpw","querySelector","arrow","addEventListener","offsetTop","aos","3","_animations","_formElements","validateField","name","value","test","querySelectorAll","sendEmail","ev","arguments","undefined","result","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","next","done","inputName","el","displayError","nextElementSibling","err","return","validateForm","form","formData","FormData","fetch","method","body","then","onSendSuccess","catch","onSendError","preventDefault","response","attributes","class","innerText","getElementById","reset","setAttribute","resp","errorElem","onInputChange","target","submitBtn","removeAttribute","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","./animations","isomorphic-fetch","4","languageSwitches","getElementsByClassName","w","window","forEach","sw","children","location","5","toggleClass","className","indexOf","replace","menu","currentClass","bodyTop","getBoundingClientRect","top","isFixed","6","this","id","loaded","m","Object","assign","prototype","hasOwnProperty","s","d","b","y","h","k","x","offset","delay","easing","disable","once","startEvent","throttleDelay","debounceDelay","disableMutationObserver","j","O","all","atob","mobile","phone","tablet","node","isSupported","console","info","ready","refresh","refreshHard","v","g","apply","S","_","M","TypeError","leading","maxWait","trailing","cancel","clearTimeout","flush","valueOf","l","slice","constructor","NaN","parseInt","self","Function","toString","Math","max","min","Date","now","MutationObserver","WebKitMutationObserver","MozMutationObserver","Array","addedNodes","removedNodes","dataset","concat","defineProperty","observe","documentElement","childList","subtree","navigator","userAgent","vendor","opera","enumerable","configurable","writable","key","substr","pageYOffset","innerHeight","getAttribute","position","classList","add","remove","anchor","anchorPlacement","isNaN","offsetHeight","offsetLeft","tagName","scrollLeft","offsetParent","left","map","define","amd","AOS","7","addEvent","eventName","fn","attachEvent","defaultWidths","getKeys","keys","object","push","applyEach","collection","callbackEach","new_collection","returnFn","noop","trueFn","debounce","wait","timeout","context","args","Imager","elements","opts","doc","selector","viewportHeight","clientHeight","gif","createElement","src","alt","scrollDelay","onResize","scrolled","availablePixelRatios","onImagesReplaced","widthsMap","refreshPixelRatio","widthInterpolator","createWidthsMap","devicePixelRatio","sort","divs","onReady","elementsOrSelector","additional","changeDivsToEmptyImages","scrollCheck","offscreenImageCount","isPlaceholder","isThisElementOnScreen","clearInterval","interval","initialized","filterFn","registerScrollEvent","checkImagesNeedReplacing","registerResizeEvent","createGif","match","RegExp","elementClassName","elementWidth","cloneNode","width","parentNode","replaceChild","elementOffsetTop","getPageOffset","images","isResizing","image","replaceImagesBasedOnScreenDimensions","computedWidth","naturalWidth","getNaturalWidth","determineAppropriateResolution","changeImageSrcToUseNewImageDimensions","getClosestValue","clientWidth","getPixelRatio","selectedWidth","transforms","pixelRatio","widths","interpolator","baseValue","candidates","parseFloat","setInterval","getPageOffsetGenerator","testCase","Image","imageCopy","8","bind","whatwg-fetch","9","global","factory","globalThis","support","Blob","viewClasses","isArrayBufferView","ArrayBuffer","isView","normalizeName","String","toLowerCase","normalizeValue","iteratorFor","items","shift","Headers","headers","append","isArray","header","getOwnPropertyNames","consumed","bodyUsed","Promise","reject","fileReaderReady","reader","resolve","onload","onerror","error","readBlobAsArrayBuffer","blob","FileReader","promise","readAsArrayBuffer","bufferClone","buf","view","Uint8Array","byteLength","set","buffer","Body","_initBody","_bodyInit","_bodyText","isPrototypeOf","_bodyBlob","_bodyFormData","URLSearchParams","DataView","_bodyArrayBuffer","get","type","rejected","arrayBuffer","isConsumed","byteOffset","text","readAsText","chars","fromCharCode","join","readArrayBufferAsText","decode","json","JSON","parse","oldValue","has","callback","thisArg","values","entries","methods","Request","input","options","upcased","url","credentials","mode","signal","toUpperCase","referrer","cache","reParamSearch","getTime","trim","split","bytes","decodeURIComponent","Response","bodyInit","status","ok","statusText","clone","redirectStatuses","redirect","RangeError","DOMException","message","stack","create","request","aborted","xhr","XMLHttpRequest","abortXhr","abort","rawHeaders","getAllResponseHeaders","line","parts","responseURL","responseText","ontimeout","onabort","open","href","fixUrl","withCredentials","responseType","setRequestHeader","removeEventListener","send","polyfill","WHATWGFetch"],"mappings":"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","file":"../main.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n return re.test(email);\n }\n\n function hasErrors() {\n return document.querySelectorAll('.error:not(.hidden)').length > 0;\n }\n\n function sendEmail(ev) {\n if (!validateForm(true)) {\n return;\n }\n var form = document.querySelector('#cform');\n var formData = new FormData(form);\n\n fetch('/sendemail.php', {\n method: \"POST\",\n body: formData\n }).then(onSendSuccess).catch(onSendError).then(function () {\n (0, _animations.scrollTo)(document.querySelector('html'), document.querySelector('#cform'), 600);\n });\n\n ev.preventDefault();\n }\n\n function onSendSuccess(response) {\n var el = document.querySelector('.alert');\n\n el.attributes.class.value = 'alert success';\n el.innerText = \"Your message has been sent succesfully!\";\n\n //reset form \n document.getElementById('cform').reset();\n\n //set confirm to disabled\n document.getElementById('sendemail').setAttribute(\"disabled\", \"disabled\");\n }\n\n function onSendError(resp) {\n var el = document.querySelector('.alert');\n el.attributes.class.value = 'alert error';\n el.innerText = \"Oops, something went wrong. Please try again.\";\n }\n\n function validateForm() {\n var displayErrors = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n var result = true;\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = _formElements[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var inputName = _step.value;\n\n var el = document.querySelector('[name=\"' + inputName + '\"]');\n if (!validateField(inputName, el.value)) {\n if (displayError) {\n displayError(el.nextElementSibling);\n }\n result = false;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n return result;\n }\n function displayError(errorElem) {\n errorElem.attributes.class.value = 'alert error';\n }\n\n function hideError(errorElem) {\n errorElem.attributes.class.value = 'alert hidden';\n }\n\n function onInputChange(ev) {\n var name = ev.target.name;\n var submitBtn = document.querySelector('#sendemail');\n var errorElem = ev.target.nextElementSibling;\n if (!validateField(ev.target.name, ev.target.value)) {\n displayError(errorElem);\n submitBtn.setAttribute(\"disabled\", \"disabled\");\n } else {\n hideError(errorElem);\n\n var isFormValid = document.querySelector(\".error:not(.hidden)\") == null;\n if (isFormValid) {\n submitBtn.removeAttribute(\"disabled\");\n }\n }\n }\n function init() {\n\n //boo\n var sendEmailBtn = document.querySelector('#sendemail');\n if (sendEmailBtn != null) {\n document.querySelector('#sendemail').addEventListener('click', sendEmail);\n\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = _formElements[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var inputName = _step2.value;\n\n var el = document.querySelector('[name=\"' + inputName + '\"]');\n el.addEventListener('input', onInputChange);\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n }\n }\n\n return {\n init: init\n };\n}();\n\n},{\"./animations\":2,\"isomorphic-fetch\":8}],4:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function () {\n\n function init() {\n\n var languageSwitches = document.getElementsByClassName('language-switch');\n\n var w = window;\n\n [].forEach.call(languageSwitches, function (sw) {\n sw.children[0].addEventListener('click', function (e) {\n e.preventDefault();\n w.location = \"/\";\n }, false);\n\n sw.children[2].addEventListener('click', function (e) {\n e.preventDefault();\n w.location = \"/it/\";\n }, false);\n });\n }\n\n return {\n init: init\n };\n}();\n\n},{}],5:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function () {\n\n function toggleClass(el, className) {\n\n if (el.className.indexOf(className) > -1) {\n el.className = el.className.replace(className, '');\n } else {\n el.className += \" \" + className;\n }\n }\n\n function init() {\n\n document.getElementById(\"nav-trigger\").addEventListener(\"click\", function (e) {\n\n toggleClass(document.getElementById('nav-trigger'), 'open');\n\n var el = document.getElementsByClassName('nav-container')[0];\n toggleClass(el, 'expanded');\n }, false);\n\n //add scroll behavior\n\n document.addEventListener('scroll', function (e) {\n\n var menu = document.querySelector('.nav-container');\n var currentClass = menu.attributes.class.value,\n bodyTop = document.body.getBoundingClientRect().top;\n //marketsTop = document.querySelector('#markets-preview').getBoundingClientRect().top ;\n var isFixed = currentClass.indexOf('follow') > -1;\n\n if (bodyTop < -330 && !isFixed) {\n menu.attributes.class.value += ' follow';\n }\n\n if (bodyTop > -300 && isFixed) {\n menu.attributes.class.value = menu.attributes.class.value.replace(\"follow\", \"\");\n }\n });\n }\n\n return {\n init: init\n };\n}();\n\n},{}],6:[function(require,module,exports){\n!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.AOS=t():e.AOS=t()}(this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return e[o].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p=\"dist/\",t(0)}([function(e,t,n){\"use strict\";function o(e){return e&&e.__esModule?e:{default:e}}var i=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]&&arguments[0];if(e&&(k=!0),k)return w=(0,y.default)(w,x),(0,b.default)(w,x.once),w},O=function(){w=(0,h.default)(),j()},M=function(){w.forEach(function(e,t){e.node.removeAttribute(\"data-aos\"),e.node.removeAttribute(\"data-aos-easing\"),e.node.removeAttribute(\"data-aos-duration\"),e.node.removeAttribute(\"data-aos-delay\")})},S=function(e){return e===!0||\"mobile\"===e&&p.default.mobile()||\"phone\"===e&&p.default.phone()||\"tablet\"===e&&p.default.tablet()||\"function\"==typeof e&&e()===!0},_=function(e){x=i(x,e),w=(0,h.default)();var t=document.all&&!window.atob;return S(x.disable)||t?M():(x.disableMutationObserver||d.default.isSupported()||(console.info('\\n aos: MutationObserver is not supported on this browser,\\n code mutations observing has been disabled.\\n You may have to call \"refreshHard()\" by yourself.\\n '),x.disableMutationObserver=!0),document.querySelector(\"body\").setAttribute(\"data-aos-easing\",x.easing),document.querySelector(\"body\").setAttribute(\"data-aos-duration\",x.duration),document.querySelector(\"body\").setAttribute(\"data-aos-delay\",x.delay),\"DOMContentLoaded\"===x.startEvent&&[\"complete\",\"interactive\"].indexOf(document.readyState)>-1?j(!0):\"load\"===x.startEvent?window.addEventListener(x.startEvent,function(){j(!0)}):document.addEventListener(x.startEvent,function(){j(!0)}),window.addEventListener(\"resize\",(0,s.default)(j,x.debounceDelay,!0)),window.addEventListener(\"orientationchange\",(0,s.default)(j,x.debounceDelay,!0)),window.addEventListener(\"scroll\",(0,u.default)(function(){(0,b.default)(w,x.once)},x.throttleDelay)),x.disableMutationObserver||d.default.ready(\"[data-aos]\",O),w)};e.exports={init:_,refresh:j,refreshHard:O}},function(e,t){},,,,,function(e,t){(function(t){\"use strict\";function n(e,t,n){function o(t){var n=b,o=v;return b=v=void 0,k=t,g=e.apply(o,n)}function r(e){return k=e,h=setTimeout(f,t),M?o(e):g}function a(e){var n=e-w,o=e-k,i=t-n;return S?j(i,y-o):i}function c(e){var n=e-w,o=e-k;return void 0===w||n>=t||n<0||S&&o>=y}function f(){var e=O();return c(e)?d(e):void(h=setTimeout(f,a(e)))}function d(e){return h=void 0,_&&b?o(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),k=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(O())}function m(){var e=O(),n=c(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(f,t),o(w)}return void 0===h&&(h=setTimeout(f,t)),g}var b,v,y,g,h,w,k=0,M=!1,S=!1,_=!0;if(\"function\"!=typeof e)throw new TypeError(s);return t=u(t)||0,i(n)&&(M=!!n.leading,S=\"maxWait\"in n,y=S?x(u(n.maxWait)||0,t):y,_=\"trailing\"in n?!!n.trailing:_),m.cancel=l,m.flush=p,m}function o(e,t,o){var r=!0,a=!0;if(\"function\"!=typeof e)throw new TypeError(s);return i(o)&&(r=\"leading\"in o?!!o.leading:r,a=\"trailing\"in o?!!o.trailing:a),n(e,t,{leading:r,maxWait:t,trailing:a})}function i(e){var t=\"undefined\"==typeof e?\"undefined\":c(e);return!!e&&(\"object\"==t||\"function\"==t)}function r(e){return!!e&&\"object\"==(\"undefined\"==typeof e?\"undefined\":c(e))}function a(e){return\"symbol\"==(\"undefined\"==typeof e?\"undefined\":c(e))||r(e)&&k.call(e)==d}function u(e){if(\"number\"==typeof e)return e;if(a(e))return f;if(i(e)){var t=\"function\"==typeof e.valueOf?e.valueOf():e;e=i(t)?t+\"\":t}if(\"string\"!=typeof e)return 0===e?e:+e;e=e.replace(l,\"\");var n=m.test(e);return n||b.test(e)?v(e.slice(2),n?2:8):p.test(e)?f:+e}var c=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},s=\"Expected a function\",f=NaN,d=\"[object Symbol]\",l=/^\\s+|\\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,m=/^0b[01]+$/i,b=/^0o[0-7]+$/i,v=parseInt,y=\"object\"==(\"undefined\"==typeof t?\"undefined\":c(t))&&t&&t.Object===Object&&t,g=\"object\"==(\"undefined\"==typeof self?\"undefined\":c(self))&&self&&self.Object===Object&&self,h=y||g||Function(\"return this\")(),w=Object.prototype,k=w.toString,x=Math.max,j=Math.min,O=function(){return h.Date.now()};e.exports=o}).call(t,function(){return this}())},function(e,t){(function(t){\"use strict\";function n(e,t,n){function i(t){var n=b,o=v;return b=v=void 0,O=t,g=e.apply(o,n)}function r(e){return O=e,h=setTimeout(f,t),M?i(e):g}function u(e){var n=e-w,o=e-O,i=t-n;return S?x(i,y-o):i}function s(e){var n=e-w,o=e-O;return void 0===w||n>=t||n<0||S&&o>=y}function f(){var e=j();return s(e)?d(e):void(h=setTimeout(f,u(e)))}function d(e){return h=void 0,_&&b?i(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),O=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(j())}function m(){var e=j(),n=s(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(f,t),i(w)}return void 0===h&&(h=setTimeout(f,t)),g}var b,v,y,g,h,w,O=0,M=!1,S=!1,_=!0;if(\"function\"!=typeof e)throw new TypeError(c);return t=a(t)||0,o(n)&&(M=!!n.leading,S=\"maxWait\"in n,y=S?k(a(n.maxWait)||0,t):y,_=\"trailing\"in n?!!n.trailing:_),m.cancel=l,m.flush=p,m}function o(e){var t=\"undefined\"==typeof e?\"undefined\":u(e);return!!e&&(\"object\"==t||\"function\"==t)}function i(e){return!!e&&\"object\"==(\"undefined\"==typeof e?\"undefined\":u(e))}function r(e){return\"symbol\"==(\"undefined\"==typeof e?\"undefined\":u(e))||i(e)&&w.call(e)==f}function a(e){if(\"number\"==typeof e)return e;if(r(e))return s;if(o(e)){var t=\"function\"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+\"\":t}if(\"string\"!=typeof e)return 0===e?e:+e;e=e.replace(d,\"\");var n=p.test(e);return n||m.test(e)?b(e.slice(2),n?2:8):l.test(e)?s:+e}var u=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},c=\"Expected a function\",s=NaN,f=\"[object Symbol]\",d=/^\\s+|\\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,m=/^0o[0-7]+$/i,b=parseInt,v=\"object\"==(\"undefined\"==typeof t?\"undefined\":u(t))&&t&&t.Object===Object&&t,y=\"object\"==(\"undefined\"==typeof self?\"undefined\":u(self))&&self&&self.Object===Object&&self,g=v||y||Function(\"return this\")(),h=Object.prototype,w=h.toString,k=Math.max,x=Math.min,j=function(){return g.Date.now()};e.exports=n}).call(t,function(){return this}())},function(e,t){\"use strict\";function n(e){var t=void 0,o=void 0,i=void 0;for(t=0;te.position?e.node.classList.add(\"aos-animate\"):\"undefined\"!=typeof o&&(\"false\"===o||!n&&\"true\"!==o)&&e.node.classList.remove(\"aos-animate\")},o=function(e,t){var o=window.pageYOffset,i=window.innerHeight;e.forEach(function(e,r){n(e,i+o,t)})};t.default=o},function(e,t,n){\"use strict\";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(12),r=o(i),a=function(e,t){return e.forEach(function(e,n){e.node.classList.add(\"aos-init\"),e.position=(0,r.default)(e.node,t.offset)}),e};t.default=a},function(e,t,n){\"use strict\";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(13),r=o(i),a=function(e,t){var n=0,o=0,i=window.innerHeight,a={offset:e.getAttribute(\"data-aos-offset\"),anchor:e.getAttribute(\"data-aos-anchor\"),anchorPlacement:e.getAttribute(\"data-aos-anchor-placement\")};switch(a.offset&&!isNaN(a.offset)&&(o=parseInt(a.offset)),a.anchor&&document.querySelectorAll(a.anchor)&&(e=document.querySelectorAll(a.anchor)[0]),n=(0,r.default)(e).top,a.anchorPlacement){case\"top-bottom\":break;case\"center-bottom\":n+=e.offsetHeight/2;break;case\"bottom-bottom\":n+=e.offsetHeight;break;case\"top-center\":n+=i/2;break;case\"bottom-center\":n+=i/2+e.offsetHeight;break;case\"center-center\":n+=i/2+e.offsetHeight/2;break;case\"top-top\":n+=i;break;case\"bottom-top\":n+=e.offsetHeight+i;break;case\"center-top\":n+=e.offsetHeight/2+i}return a.anchorPlacement||a.offset||isNaN(t)||(o=t),n+o};t.default=a},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-(\"BODY\"!=e.tagName?e.scrollLeft:0),n+=e.offsetTop-(\"BODY\"!=e.tagName?e.scrollTop:0),e=e.offsetParent;return{top:n,left:t}};t.default=n},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=function(e){return e=e||document.querySelectorAll(\"[data-aos]\"),Array.prototype.map.call(e,function(e){return{node:e}})};t.default=n}])});\n},{}],7:[function(require,module,exports){\n;(function (window, document) {\n 'use strict';\n\n var addEvent = (function () {\n if (document.addEventListener) {\n return function addStandardEventListener(el, eventName, fn) {\n return el.addEventListener(eventName, fn, false);\n };\n }\n else {\n return function addIEEventListener(el, eventName, fn) {\n return el.attachEvent('on' + eventName, fn);\n };\n }\n })();\n\n var defaultWidths = [96, 130, 165, 200, 235, 270, 304, 340, 375, 410, 445, 485, 520, 555, 590, 625, 660, 695, 736];\n\n var getKeys = typeof Object.keys === 'function' ? Object.keys : function (object) {\n var keys = [],\n key;\n\n for (key in object) {\n keys.push(key);\n }\n\n return keys;\n };\n\n var applyEach = function (collection, callbackEach) {\n var i = 0,\n length = collection.length,\n new_collection = [];\n\n for (; i < length; i++) {\n new_collection[i] = callbackEach(collection[i], i);\n }\n\n return new_collection;\n };\n\n var returnFn = function (value) { return value; };\n var noop = function () {};\n var trueFn = function () { return true; };\n\n var debounce = function (fn, wait) {\n var timeout;\n return function () {\n var context = this, args = arguments;\n var later = function () {\n timeout = null;\n fn.apply(context, args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n };\n\n\n /*\n Construct a new Imager instance, passing an optional configuration object.\n\n Example usage:\n\n {\n // Available widths for your images\n availableWidths: [Number],\n\n // Selector to be used to locate your div placeholders\n selector: '',\n\n // Class name to give your resizable images\n className: '',\n\n // If set to true, Imager will update the src attribute of the relevant images\n onResize: Boolean,\n\n // Toggle the lazy load functionality on or off\n lazyload: Boolean,\n\n // Used alongside the lazyload feature (helps performance by setting a higher delay)\n scrollDelay: Number\n }\n\n @param {object} configuration settings\n @return {object} instance of Imager\n */\n var Imager = function (elements, opts) {\n var self = this;\n var doc = document;\n\n opts = opts || {};\n\n if (elements !== undefined) {\n\n // selector string (not elements)\n if (typeof elements === 'string') {\n opts.selector = elements;\n elements = undefined;\n }\n\n // 'opts' object (not elements)\n else if (typeof elements.length === 'undefined') {\n opts = elements;\n elements = undefined;\n }\n }\n\n this.viewportHeight = doc.documentElement.clientHeight;\n this.selector = !elements ? (opts.selector || '.delayed-image-load') : null;\n this.className = opts.className || 'image-replace';\n this.gif = doc.createElement('img');\n this.gif.src = 'data:image/gif;base64,R0lGODlhEAAJAIAAAP///wAAACH5BAEAAAAALAAAAAAQAAkAAAIKhI+py+0Po5yUFQA7';\n this.gif.className = this.className;\n this.gif.alt = '';\n this.lazyloadOffset = opts.lazyloadOffset || 0;\n this.scrollDelay = opts.scrollDelay || 250;\n this.onResize = opts.hasOwnProperty('onResize') ? opts.onResize : true;\n this.lazyload = opts.hasOwnProperty('lazyload') ? opts.lazyload : false;\n this.scrolled = false;\n this.availablePixelRatios = opts.availablePixelRatios || [1, 2];\n this.availableWidths = opts.availableWidths || defaultWidths;\n this.onImagesReplaced = opts.onImagesReplaced || noop;\n this.widthsMap = {};\n this.refreshPixelRatio();\n this.widthInterpolator = opts.widthInterpolator || returnFn;\n\n // Needed as IE8 adds a default `width`/`height` attribute…\n this.gif.removeAttribute('height');\n this.gif.removeAttribute('width');\n\n if (typeof this.availableWidths !== 'function') {\n if (typeof this.availableWidths.length === 'number') {\n this.widthsMap = Imager.createWidthsMap(this.availableWidths, this.widthInterpolator, this.devicePixelRatio);\n }\n else {\n this.widthsMap = this.availableWidths;\n this.availableWidths = getKeys(this.availableWidths);\n }\n\n this.availableWidths = this.availableWidths.sort(function (a, b) {\n return a - b;\n });\n }\n\n this.divs = [];\n this.add(elements || this.selector);\n this.ready(opts.onReady);\n\n setTimeout(function () {\n self.init();\n }, 0);\n };\n\n Imager.prototype.add = function (elementsOrSelector) {\n\n elementsOrSelector = elementsOrSelector || this.selector;\n var elements = typeof elementsOrSelector === 'string' ?\n document.querySelectorAll(elementsOrSelector) : // Selector\n elementsOrSelector; // Elements (NodeList or array of Nodes)\n\n if (elements && elements.length) {\n var additional = applyEach(elements, returnFn);\n this.changeDivsToEmptyImages(additional);\n this.divs = this.divs.concat(additional);\n }\n };\n\n Imager.prototype.scrollCheck = function () {\n var self = this;\n var offscreenImageCount = 0;\n var elements = [];\n\n if (this.scrolled) {\n // collects a subset of not-yet-responsive images and not offscreen anymore\n applyEach(this.divs, function (element) {\n if (self.isPlaceholder(element)) {\n ++offscreenImageCount;\n\n if (self.isThisElementOnScreen(element)) {\n elements.push(element);\n }\n }\n });\n\n if (offscreenImageCount === 0) {\n window.clearInterval(self.interval);\n }\n\n this.changeDivsToEmptyImages(elements);\n this.scrolled = false;\n }\n };\n\n Imager.prototype.init = function () {\n var self = this;\n\n this.initialized = true;\n var filterFn = trueFn;\n\n if (this.lazyload) {\n this.registerScrollEvent();\n\n this.scrolled = true;\n self.scrollCheck();\n\n filterFn = function (element) {\n return self.isPlaceholder(element) === false;\n };\n }\n else {\n this.checkImagesNeedReplacing(this.divs);\n }\n\n if (this.onResize) {\n this.registerResizeEvent(filterFn);\n }\n\n this.onReady();\n };\n\n /**\n * Executes a function when Imager is ready to work\n * It acts as a convenient/shortcut for `new Imager({ onReady: fn })`\n *\n * @since 0.3.1\n * @param {Function} fn\n */\n Imager.prototype.ready = function (fn) {\n this.onReady = fn || noop;\n };\n\n Imager.prototype.createGif = function (element) {\n // if the element is already a responsive image then we don't replace it again\n if (element.className.match(new RegExp('(^| )' + this.className + '( |$)'))) {\n return element;\n }\n\n var elementClassName = element.getAttribute('data-class');\n var elementWidth = element.getAttribute('data-width');\n var gif = this.gif.cloneNode(false);\n\n if (elementWidth) {\n gif.width = elementWidth;\n gif.setAttribute('data-width', elementWidth);\n }\n\n gif.className = (elementClassName ? elementClassName + ' ' : '') + this.className;\n gif.setAttribute('data-src', element.getAttribute('data-src'));\n gif.setAttribute('alt', element.getAttribute('data-alt') || element.alt || this.gif.alt);\n\n element.parentNode.replaceChild(gif, element);\n\n return gif;\n };\n\n Imager.prototype.changeDivsToEmptyImages = function (elements) {\n var self = this;\n\n applyEach(elements, function (element, i) {\n elements[i] = self.createGif(element);\n });\n\n if (this.initialized) {\n this.checkImagesNeedReplacing(elements);\n }\n };\n\n /**\n * Indicates if an element is an Imager placeholder\n *\n * @since 1.3.1\n * @param {HTMLImageElement} element\n * @returns {boolean}\n */\n Imager.prototype.isPlaceholder = function (element) {\n return element.src === this.gif.src;\n };\n\n /**\n * Returns true if an element is located within a screen offset.\n *\n * @param {HTMLElement} element\n * @returns {boolean}\n */\n Imager.prototype.isThisElementOnScreen = function (element) {\n // document.body.scrollTop was working in Chrome but didn't work on Firefox, so had to resort to window.pageYOffset\n // but can't fallback to document.body.scrollTop as that doesn't work in IE with a doctype (?) so have to use document.documentElement.scrollTop\n var elementOffsetTop = 0;\n var offset = Imager.getPageOffset() + this.lazyloadOffset;\n\n if (element.offsetParent) {\n do {\n elementOffsetTop += element.offsetTop;\n }\n while (element = element.offsetParent);\n }\n\n return elementOffsetTop < (this.viewportHeight + offset);\n };\n\n Imager.prototype.checkImagesNeedReplacing = function (images, filterFn) {\n var self = this;\n filterFn = filterFn || trueFn;\n\n if (!this.isResizing) {\n this.isResizing = true;\n this.refreshPixelRatio();\n\n applyEach(images, function (image) {\n if (filterFn(image)) {\n self.replaceImagesBasedOnScreenDimensions(image);\n }\n });\n\n this.isResizing = false;\n this.onImagesReplaced(images);\n }\n };\n\n /**\n * Upgrades an image from an empty placeholder to a fully sourced image element\n *\n * @param {HTMLImageElement} image\n */\n Imager.prototype.replaceImagesBasedOnScreenDimensions = function (image) {\n var computedWidth, naturalWidth;\n\n\tnaturalWidth = Imager.getNaturalWidth(image);\n computedWidth = typeof this.availableWidths === 'function' ? this.availableWidths(image)\n : this.determineAppropriateResolution(image);\n\n image.width = computedWidth;\n\n if (!this.isPlaceholder(image) && computedWidth <= naturalWidth) {\n return;\n }\n\n image.src = this.changeImageSrcToUseNewImageDimensions(image.getAttribute('data-src'), computedWidth);\n image.removeAttribute('width');\n image.removeAttribute('height');\n };\n\n Imager.prototype.determineAppropriateResolution = function (image) {\n return Imager.getClosestValue(image.getAttribute('data-width') || image.parentNode.clientWidth, this.availableWidths);\n };\n\n /**\n * Updates the device pixel ratio value used by Imager\n *\n * It is performed before each replacement loop, in case a user zoomed in/out\n * and thus updated the `window.devicePixelRatio` value.\n *\n * @api\n * @since 1.0.1\n */\n Imager.prototype.refreshPixelRatio = function refreshPixelRatio() {\n this.devicePixelRatio = Imager.getClosestValue(Imager.getPixelRatio(), this.availablePixelRatios);\n };\n\n Imager.prototype.changeImageSrcToUseNewImageDimensions = function (src, selectedWidth) {\n return src\n .replace(/{width}/g, Imager.transforms.width(selectedWidth, this.widthsMap))\n .replace(/{pixel_ratio}/g, Imager.transforms.pixelRatio(this.devicePixelRatio));\n };\n\n Imager.getPixelRatio = function getPixelRatio(context) {\n return (context || window)['devicePixelRatio'] || 1;\n };\n\n Imager.createWidthsMap = function createWidthsMap (widths, interpolator, pixelRatio) {\n var map = {},\n i = widths.length;\n\n while (i--) {\n map[widths[i]] = interpolator(widths[i], pixelRatio);\n }\n\n return map;\n };\n\n Imager.transforms = {\n pixelRatio: function (value) {\n return value === 1 ? '' : '-' + value + 'x';\n },\n width: function (width, map) {\n return map[width] || width;\n }\n };\n\n /**\n * Returns the closest upper value.\n *\n * ```js\n * var candidates = [1, 1.5, 2];\n *\n * Imager.getClosestValue(0.8, candidates); // -> 1\n * Imager.getClosestValue(1, candidates); // -> 1\n * Imager.getClosestValue(1.3, candidates); // -> 1.5\n * Imager.getClosestValue(3, candidates); // -> 2\n * ```\n *\n * @api\n * @since 1.0.1\n * @param {Number} baseValue\n * @param {Array.} candidates\n * @returns {Number}\n */\n Imager.getClosestValue = function getClosestValue(baseValue, candidates) {\n var i = candidates.length,\n selectedWidth = candidates[i - 1];\n\n baseValue = parseFloat(baseValue);\n\n while (i--) {\n if (baseValue <= candidates[i]) {\n selectedWidth = candidates[i];\n }\n }\n\n return selectedWidth;\n };\n\n Imager.prototype.registerResizeEvent = function (filterFn) {\n var self = this;\n\n addEvent(window, 'resize', debounce(function () {\n self.checkImagesNeedReplacing(self.divs, filterFn);\n }, 100));\n };\n\n Imager.prototype.registerScrollEvent = function () {\n var self = this;\n\n this.scrolled = false;\n\n this.interval = window.setInterval(function () {\n self.scrollCheck();\n }, self.scrollDelay);\n\n addEvent(window, 'scroll', function () {\n self.scrolled = true;\n });\n\n addEvent(window, 'resize', function () {\n self.viewportHeight = document.documentElement.clientHeight;\n self.scrolled = true;\n });\n };\n\n Imager.getPageOffsetGenerator = function getPageVerticalOffset(testCase) {\n if (testCase) {\n return function () { return window.pageYOffset; };\n }\n else {\n return function () { return document.documentElement.scrollTop; };\n }\n };\n\n /**\n * Returns the naturalWidth of an image element.\n *\n * @since 1.3.1\n * @param {HTMLImageElement} image\n * @return {Number} Image width in pixels\n */\n Imager.getNaturalWidth = (function () {\n if ('naturalWidth' in (new Image())) {\n return function (image) {\n return image.naturalWidth;\n };\n }\n // non-HTML5 browsers workaround\n return function (image) {\n var imageCopy = document.createElement('img');\n imageCopy.src = image.src;\n return imageCopy.width;\n };\n })();\n\n // This form is used because it seems impossible to stub `window.pageYOffset`\n Imager.getPageOffset = Imager.getPageOffsetGenerator(Object.prototype.hasOwnProperty.call(window, 'pageYOffset'));\n\n // Exporting for testing and convenience purpose\n Imager.applyEach = applyEach;\n Imager.addEvent = addEvent;\n Imager.debounce = debounce;\n\n /* jshint ignore:start */\n if (typeof module === 'object' && typeof module.exports === 'object') {\n // CommonJS, just export\n module.exports = exports = Imager;\n } else if (typeof define === 'function' && define.amd) {\n // AMD support\n define(function () { return Imager; });\n } else if (typeof window === 'object') {\n // If no AMD and we are in the browser, attach to window\n window.Imager = Imager;\n }\n /* jshint ignore:end */\n\n}(window, document));\n\n},{}],8:[function(require,module,exports){\n// the whatwg-fetch polyfill installs the fetch() function\n// on the global object (window or self)\n//\n// Return that as the export for use in Webpack, Browserify etc.\nrequire('whatwg-fetch');\nmodule.exports = self.fetch.bind(self);\n\n},{\"whatwg-fetch\":9}],9:[function(require,module,exports){\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (factory((global.WHATWGFetch = {})));\n}(this, (function (exports) { 'use strict';\n\n var global =\n (typeof globalThis !== 'undefined' && globalThis) ||\n (typeof self !== 'undefined' && self) ||\n (typeof global !== 'undefined' && global);\n\n var support = {\n searchParams: 'URLSearchParams' in global,\n iterable: 'Symbol' in global && 'iterator' in Symbol,\n blob:\n 'FileReader' in global &&\n 'Blob' in global &&\n (function() {\n try {\n new Blob();\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: 'FormData' in global,\n arrayBuffer: 'ArrayBuffer' in global\n };\n\n function isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ];\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n };\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name);\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {\n throw new TypeError('Invalid character in header field name: \"' + name + '\"')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value);\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift();\n return {done: value === undefined, value: value}\n }\n };\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n };\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {};\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value);\n }, this);\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1]);\n }, this);\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name]);\n }, this);\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name);\n value = normalizeValue(value);\n var oldValue = this.map[name];\n this.map[name] = oldValue ? oldValue + ', ' + value : value;\n };\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)];\n };\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name);\n return this.has(name) ? this.map[name] : null\n };\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n };\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value);\n };\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this);\n }\n }\n };\n\n Headers.prototype.keys = function() {\n var items = [];\n this.forEach(function(value, name) {\n items.push(name);\n });\n return iteratorFor(items)\n };\n\n Headers.prototype.values = function() {\n var items = [];\n this.forEach(function(value) {\n items.push(value);\n });\n return iteratorFor(items)\n };\n\n Headers.prototype.entries = function() {\n var items = [];\n this.forEach(function(value, name) {\n items.push([name, value]);\n });\n return iteratorFor(items)\n };\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true;\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result);\n };\n reader.onerror = function() {\n reject(reader.error);\n };\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsArrayBuffer(blob);\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsText(blob);\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf);\n var chars = new Array(view.length);\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i]);\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength);\n view.set(new Uint8Array(buf));\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false;\n\n this._initBody = function(body) {\n /*\n fetch-mock wraps the Response object in an ES6 Proxy to\n provide useful test harness features such as flush. However, on\n ES5 browsers without fetch or Proxy support pollyfills must be used;\n the proxy-pollyfill is unable to proxy an attribute unless it exists\n on the object before the Proxy is created. This change ensures\n Response.bodyUsed exists on the instance, while maintaining the\n semantic of setting Request.bodyUsed in the constructor before\n _initBody is called.\n */\n this.bodyUsed = this.bodyUsed;\n this._bodyInit = body;\n if (!body) {\n this._bodyText = '';\n } else if (typeof body === 'string') {\n this._bodyText = body;\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body;\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body;\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString();\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer);\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer]);\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body);\n } else {\n this._bodyText = body = Object.prototype.toString.call(body);\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8');\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type);\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n }\n };\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n };\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n var isConsumed = consumed(this);\n if (isConsumed) {\n return isConsumed\n }\n if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n return Promise.resolve(\n this._bodyArrayBuffer.buffer.slice(\n this._bodyArrayBuffer.byteOffset,\n this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength\n )\n )\n } else {\n return Promise.resolve(this._bodyArrayBuffer)\n }\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n };\n }\n\n this.text = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n };\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n };\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n };\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase();\n return methods.indexOf(upcased) > -1 ? upcased : method\n }\n\n function Request(input, options) {\n if (!(this instanceof Request)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n\n options = options || {};\n var body = options.body;\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url;\n this.credentials = input.credentials;\n if (!options.headers) {\n this.headers = new Headers(input.headers);\n }\n this.method = input.method;\n this.mode = input.mode;\n this.signal = input.signal;\n if (!body && input._bodyInit != null) {\n body = input._bodyInit;\n input.bodyUsed = true;\n }\n } else {\n this.url = String(input);\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin';\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers);\n }\n this.method = normalizeMethod(options.method || this.method || 'GET');\n this.mode = options.mode || this.mode || null;\n this.signal = options.signal || this.signal;\n this.referrer = null;\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body);\n\n if (this.method === 'GET' || this.method === 'HEAD') {\n if (options.cache === 'no-store' || options.cache === 'no-cache') {\n // Search for a '_' parameter in the query string\n var reParamSearch = /([?&])_=[^&]*/;\n if (reParamSearch.test(this.url)) {\n // If it already exists then set the value with the current time\n this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime());\n } else {\n // Otherwise add a new '_' parameter to the end with the current time\n var reQueryString = /\\?/;\n this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime();\n }\n }\n }\n }\n\n Request.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n };\n\n function decode(body) {\n var form = new FormData();\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=');\n var name = split.shift().replace(/\\+/g, ' ');\n var value = split.join('=').replace(/\\+/g, ' ');\n form.append(decodeURIComponent(name), decodeURIComponent(value));\n }\n });\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers();\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\n // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n // https://github.com/github/fetch/issues/748\n // https://github.com/zloirock/core-js/issues/751\n preProcessedHeaders\n .split('\\r')\n .map(function(header) {\n return header.indexOf('\\n') === 0 ? header.substr(1, header.length) : header\n })\n .forEach(function(line) {\n var parts = line.split(':');\n var key = parts.shift().trim();\n if (key) {\n var value = parts.join(':').trim();\n headers.append(key, value);\n }\n });\n return headers\n }\n\n Body.call(Request.prototype);\n\n function Response(bodyInit, options) {\n if (!(this instanceof Response)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n if (!options) {\n options = {};\n }\n\n this.type = 'default';\n this.status = options.status === undefined ? 200 : options.status;\n this.ok = this.status >= 200 && this.status < 300;\n this.statusText = options.statusText === undefined ? '' : '' + options.statusText;\n this.headers = new Headers(options.headers);\n this.url = options.url || '';\n this._initBody(bodyInit);\n }\n\n Body.call(Response.prototype);\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n };\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''});\n response.type = 'error';\n return response\n };\n\n var redirectStatuses = [301, 302, 303, 307, 308];\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n };\n\n exports.DOMException = global.DOMException;\n try {\n new exports.DOMException();\n } catch (err) {\n exports.DOMException = function(message, name) {\n this.message = message;\n this.name = name;\n var error = Error(message);\n this.stack = error.stack;\n };\n exports.DOMException.prototype = Object.create(Error.prototype);\n exports.DOMException.prototype.constructor = exports.DOMException;\n }\n\n function fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init);\n\n if (request.signal && request.signal.aborted) {\n return reject(new exports.DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest();\n\n function abortXhr() {\n xhr.abort();\n }\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n };\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n setTimeout(function() {\n resolve(new Response(body, options));\n }, 0);\n };\n\n xhr.onerror = function() {\n setTimeout(function() {\n reject(new TypeError('Network request failed'));\n }, 0);\n };\n\n xhr.ontimeout = function() {\n setTimeout(function() {\n reject(new TypeError('Network request failed'));\n }, 0);\n };\n\n xhr.onabort = function() {\n setTimeout(function() {\n reject(new exports.DOMException('Aborted', 'AbortError'));\n }, 0);\n };\n\n function fixUrl(url) {\n try {\n return url === '' && global.location.href ? global.location.href : url\n } catch (e) {\n return url\n }\n }\n\n xhr.open(request.method, fixUrl(request.url), true);\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true;\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false;\n }\n\n if ('responseType' in xhr) {\n if (support.blob) {\n xhr.responseType = 'blob';\n } else if (\n support.arrayBuffer &&\n request.headers.get('Content-Type') &&\n request.headers.get('Content-Type').indexOf('application/octet-stream') !== -1\n ) {\n xhr.responseType = 'arraybuffer';\n }\n }\n\n if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers)) {\n Object.getOwnPropertyNames(init.headers).forEach(function(name) {\n xhr.setRequestHeader(name, normalizeValue(init.headers[name]));\n });\n } else {\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value);\n });\n }\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr);\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr);\n }\n };\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\n })\n }\n\n fetch.polyfill = true;\n\n if (!global.fetch) {\n global.fetch = fetch;\n global.Headers = Headers;\n global.Request = Request;\n global.Response = Response;\n }\n\n exports.Headers = Headers;\n exports.Request = Request;\n exports.Response = Response;\n exports.fetch = fetch;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n},{}]},{},[1])\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJfZGV2L2Fzc2V0cy9zY3JpcHRzL21haW4uanMiLCJfZGV2L2Fzc2V0cy9zY3JpcHRzL21vZHVsZXMvYW5pbWF0aW9ucy5qcyIsIl9kZXYvYXNzZXRzL3NjcmlwdHMvbW9kdWxlcy9lbWFpbHNlbmRlci5qcyIsIl9kZXYvYXNzZXRzL3NjcmlwdHMvbW9kdWxlcy9sYW5ndWFnZXMuanMiLCJfZGV2L2Fzc2V0cy9zY3JpcHRzL21vZHVsZXMvbWVudS5qcyIsIm5vZGVfbW9kdWxlcy9hb3MvZGlzdC9hb3MuanMiLCJub2RlX21vZHVsZXMvaW1hZ2VyLmpzL0ltYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9pc29tb3JwaGljLWZldGNoL2ZldGNoLW5wbS1icm93c2VyaWZ5LmpzIiwibm9kZV9tb2R1bGVzL3doYXR3Zy1mZXRjaC9kaXN0L2ZldGNoLnVtZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0FDQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7Ozs7O0FBRUEsU0FBUyxrQkFBVCxHQUE4QixZQUFNO0FBQ2xDLE1BQUksU0FBUyxVQUFULEtBQXdCLFVBQTVCLEVBQXdDO0FBQ3RDO0FBQ0EseUJBQVcsSUFBWDtBQUNBLG1CQUFLLElBQUw7QUFDQSx3QkFBVSxJQUFWO0FBQ0E7QUFDQSwwQkFBWSxJQUFaOztBQUVBLFFBQUksZ0JBQUosQ0FBVyxpQkFBWCxFQUE4QjtBQUM1QixnQkFBVSxLQURrQjtBQUU1QixzQkFBZ0IsR0FGWTtBQUc1Qix1QkFBaUI7QUFDZixhQUFLLE9BRFU7QUFFZixhQUFLLFFBRlU7QUFHZixhQUFLLE9BSFU7QUFJZixjQUFNO0FBSlM7QUFIVyxLQUE5Qjs7QUFXQSxRQUFJLGdCQUFKLENBQVcscUJBQVgsRUFBa0M7QUFDaEMsZ0JBQVUsSUFEc0I7QUFFaEMsc0JBQWdCLEdBRmdCO0FBR2hDLHVCQUFpQjtBQUNmLGFBQUssT0FEVTtB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QyxFQUE4QyxFQUE5QyxDQUEvQjtBQUNIO0FBSUosU0FsQkQ7QUFvQk47O0FBRUEsV0FBTztBQUNMLGNBQU07QUFERCxLQUFQO0FBSUQsQ0F0RGdCLEVBQWpCOzs7QUNGQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCJcbmltcG9ydCBhbmltYXRpb25zIGZyb20gJy4vbW9kdWxlcy9hbmltYXRpb25zLmpzJztcbmltcG9ydCBtZW51IGZyb20gJy4vbW9kdWxlcy9tZW51LmpzJztcbmltcG9ydCBsYW5ndWFnZXMgZnJvbSAnLi9tb2R1bGVzL2xhbmd1YWdlcy5qcyc7XG5pbXBvcnQgZW1haWxzZW5kZXIgZnJvbSAnLi9tb2R1bGVzL2VtYWlsc2VuZGVyJztcblxuaW1wb3J0IEltYWdlciBmcm9tICdpbWFnZXIuanMnO1xuXG5kb2N1bWVudC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgLy8gZG9jdW1lbnQgcmVhZHlcbiAgICBhbmltYXRpb25zLmluaXQoKTtcbiAgICBtZW51LmluaXQoKTtcbiAgICBsYW5ndWFnZXMuaW5pdCgpO1xuICAgIC8vY3MuaW5pdCgpO1xuICAgIGVtYWlsc2VuZGVyLmluaXQoKTtcblxuICAgIG5ldyBJbWFnZXIoJy5tdWx0aXBsZS1zaXplcycsIHtcbiAgICAgIGxhenlsb2FkOiBmYWxzZSxcbiAgICAgIGxhenlsb2FkT2Zmc2V0OiA1MDAsXG4gICAgICBhdmFpbGFibGVXaWR0aHM6IHtcbiAgICAgICAgNDAwOiAnc21hbGwnLFxuICAgICAgICA2MDA6ICdtZWRpdW0nLFxuICAgICAgICA4MDA6ICdsYXJnZScsXG4gICAgICAgIDEzNjY6ICd4bGFyZ2UnXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBuZXcgSW1hZ2VyKCcuZGVsYXllZC1pbWFnZS1sb2FkJywge1xuICAgICAgbGF6eWxvYWQ6IHRydWUsXG4gICAgICBsYXp5bG9hZE9mZnNldDogNTAwLFxuICAgICAgYXZhaWxhYmxlV2lkdGhzOiB7XG4gICAgICAgIDQwMDogJ3NtYWxsJyxcbiAgICAgICAgNjAwOiAnbWVkaXVtJyxcbiAgICAgICAgODAwOiAnbGFyZ2UnLFxuICAgICAgICAxMzY2OiAneGxhcmdlJ1xuICAgICAgfVxuICAgIH0pO1xuXG4gIH1cbn07XG5cbiIsImltcG9ydCBBT1MgZnJvbSBcImFvc1wiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAvL2NvbnN0IGFuaW1hdGVkRWxzID0gJChcIi5hbmltYXRlZFwiKTtcblxuICAgIC8vb3RoZXIgYW5pbWF0aW9uc1xuICAgIGNvbnN0IG1wdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjbWFya2V0cy1wcmV2aWV3XCIpO1xuICAgIGNvbnN0IGFycm93ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Zsb2F0aW5nLWFycm93Jyk7XG4gICAgaWYoYXJyb3cgIT0gbnVsbCl7XG4gICAgICBhcnJvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oKXtcbiAgICAgIHNjcm9sbFRvKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKSwgbXB3Lm9mZnNldFRvcC0xMDAsIDYwMCk7XG4gICAgfSl9O1xuXG4gICAgXG4gICAgQU9TLmluaXQoe1xuICAgICAgZHVyYXRpb246IDUwMFxuICAgIH0pO1xuXG4gICAgXG5cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjcm9sbFRvKGVsZW1lbnQsIHRvLCBkdXJhdGlvbikge1xuICAgICAgaWYgKGR1cmF0aW9uIDw9IDApIHJldHVybjtcbiAgICAgIHZhciBkaWZmZXJlbmNlID0gdG8gLSBlbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgIHZhciBwZXJUaWNrID0gZGlmZmVyZW5jZSAvIGR1cmF0aW9uICogMTA7XG5cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSBlbGVtZW50LnNjcm9sbFRvcCArIHBlclRpY2s7XG4gICAgICAgICAgaWYgKGVsZW1lbnQuc2Nyb2xsVG9wID09PSB0bykgcmV0dXJuO1xuICAgICAgICAgIHNjcm9sbFRvKGVsZW1lbnQsIHRvLCBkdXJhdGlvbiAtIDEwKTtcbiAgICAgIH0sIDEwKTtcbiAgfVxuICBcblxuICByZXR1cm4ge1xuICAgIGluaXQ6IGluaXQsXG4gICAgc2Nyb2xsVG86IHNjcm9sbFRvXG4gIH07XG59KSgpO1xuIiwiLy9pbXBvcnQgbWFpbGd1biBmcm9tICdtYWlsZ3VuLmpzJ1xuaW1wb3J0IFwiaXNvbW9ycGhpYy1mZXRjaFwiXG5pbXBvcnQge3Njcm9sbFRvfSBmcm9tICcuL2FuaW1hdGlvbnMnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbiAoKSB7XG5cblxuICAgIGNvbnN0IF9mb3JtRWxlbWVudHMgPSBbICdmcm9tJywgJ3N1YmplY3QnLCAndGV4dCddO1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGaWVsZChuYW1lLCB2YWx1ZSkge1xuXG4gICAgICAgIGlmIChuYW1lID09PSAnZnJvbScpIHtcbiAgICAgICAgICAgIGlmICghdmFsaWRhdGVFbWFpbCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lPT09ICdzdWJqZWN0Jyl7XG4gICAgICAgICAgICBpZih2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCA9PTApe1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWU9PT0gJ3RleHQnKXtcbiAgICAgICAgICAgIGlmKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoID09MCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoaGFzRXJyb3JzKCkpe1xuICAgICAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUVtYWlsKGVtYWlsKSB7XG4gICAgICAgIHZhciByZSA9IC9eKChbXjw+KClcXFtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoXFxbWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcXSl8KChbYS16QS1aXFwtMC05XStcXC4pK1thLXpBLVpdezIsfSkpJC87XG4gICAgICAgIHJldHVybiByZS50ZXN0KGVtYWlsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNFcnJvcnMoKXtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5lcnJvcjpub3QoLmhpZGRlbiknKS5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNlbmRFbWFpbChldikge1xuICAgICAgICBpZighdmFsaWRhdGVGb3JtKHRydWUpKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb3JtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Nmb3JtJyk7XG4gICAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcblxuICAgICAgICBmZXRjaCgnL3NlbmRlbWFpbC5waHAnLFxuICAgICAgICB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGJvZHk6IGZvcm1EYXRhXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKG9uU2VuZFN1Y2Nlc3MpXG4gICAgICAgIC5jYXRjaChvblNlbmRFcnJvcilcbiAgICAgICAgLnRoZW4oKCk9PntcbiAgICAgICAgICAgIHNjcm9sbFRvKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY2Zvcm0nKSwgNjAwKTtcbiAgICAgICAgfSlcblxuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uU2VuZFN1Y2Nlc3MocmVzcG9uc2Upe1xuICAgICAgIGNvbnN0IGVsID0gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5hbGVydCcpXG5cbiAgICAgICBlbC5hdHRyaWJ1dGVzLmNsYXNzLnZhbHVlID0gJ2FsZXJ0IHN1Y2Nlc3MnXG4gICAgICAgZWwuaW5uZXJUZXh0ID0gXCJZb3VyIG1lc3NhZ2UgaGFzIGJlZW4gc2VudCBzdWNjZXNmdWxseSFcIlxuXG4gICAgICAgLy9yZXNldCBmb3JtIFxuICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZm9ybScpLnJlc2V0KClcblxuICAgICAgIC8vc2V0IGNvbmZpcm0gdG8gZGlzYWJsZWRcbiAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VuZGVtYWlsJykuc2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcblxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uU2VuZEVycm9yKHJlc3Ape1xuICAgICAgICBjb25zdCBlbCA9ICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYWxlcnQnKVxuICAgICAgICBlbC5hdHRyaWJ1dGVzLmNsYXNzLnZhbHVlID0gJ2FsZXJ0IGVycm9yJztcbiAgICAgICAgZWwuaW5uZXJUZXh0ID0gXCJPb3BzLCBzb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHRyeSBhZ2Fpbi5cIlxuICAgICB9XG4gICAgXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGb3JtKGRpc3BsYXlFcnJvcnM9ZmFsc2Upe1xuICAgICAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgZm9yKGxldCBpbnB1dE5hbWUgb2YgX2Zvcm1FbGVtZW50cyl7XG4gICAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPVwiJytpbnB1dE5hbWUrJ1wiXScpO1xuICAgICAgICAgICAgaWYoIXZhbGlkYXRlRmllbGQoaW5wdXROYW1lLCBlbC52YWx1ZSkpe1xuICAgICAgICAgICAgICAgIGlmKGRpc3BsYXlFcnJvcil7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFcnJvcihlbC5uZXh0RWxlbWVudFNpYmxpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQ9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlzcGxheUVycm9yKGVycm9yRWxlbSl7XG4gICAgICAgIGVycm9yRWxlbS5hdHRyaWJ1dGVzLmNsYXNzLnZhbHVlID0gJ2FsZXJ0IGVycm9yJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoaWRlRXJyb3IoZXJyb3JFbGVtKXtcbiAgICAgICAgZXJyb3JFbGVtLmF0dHJpYnV0ZXMuY2xhc3MudmFsdWUgPSAnYWxlcnQgaGlkZGVuJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbklucHV0Q2hhbmdlKGV2KSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBldi50YXJnZXQubmFtZTtcbiAgICAgICAgY29uc3Qgc3VibWl0QnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlbmRlbWFpbCcpO1xuICAgICAgICBjb25zdCBlcnJvckVsZW0gPSBldi50YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICBpZiAoIXZhbGlkYXRlRmllbGQoZXYudGFyZ2V0Lm5hbWUsIGV2LnRhcmdldC52YWx1ZSkpIHtcbiAgICAgICAgICAgIGRpc3BsYXlFcnJvcihlcnJvckVsZW0pXG4gICAgICAgICAgICBzdWJtaXRCdG4uc2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhpZGVFcnJvcihlcnJvckVsZW0pO1xuXG4gICAgICAgICAgICBjb25zdCBpc0Zvcm1WYWxpZCA9IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmVycm9yOm5vdCguaGlkZGVuKVwiKSA9PSBudWxsKTtcbiAgICAgICAgICAgIGlmKGlzRm9ybVZhbGlkKXtcbiAgICAgICAgICAgICAgICBzdWJtaXRCdG4ucmVtb3ZlQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaW5pdCgpIHtcblxuICAgICAgICAvL2Jvb1xuICAgICAgICBjb25zdCBzZW5kRW1haWxCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VuZGVtYWlsJyk7XG4gICAgICAgIGlmKHNlbmRFbWFpbEJ0biAhPSBudWxsKXtcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZW5kZW1haWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNlbmRFbWFpbClcblxuICAgICAgICAgICAgZm9yKGxldCBpbnB1dE5hbWUgb2YgX2Zvcm1FbGVtZW50cyl7XG4gICAgICAgICAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbbmFtZT1cIicraW5wdXROYW1lKydcIl0nKTtcbiAgICAgICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIG9uSW5wdXRDaGFuZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGluaXQ6IGluaXRcbiAgICB9O1xuXG59KSgpO1xuXG5cblxuXG4iLCJcblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkge1xuXG5cblxuICAgIGZ1bmN0aW9uIGluaXQoKSB7XG5cbiAgICAgICAgY29uc3QgbGFuZ3VhZ2VTd2l0Y2hlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2xhbmd1YWdlLXN3aXRjaCcpO1xuXG4gICAgICAgIGxldCB3ID0gd2luZG93O1xuXG4gICAgICAgIFtdLmZvckVhY2guY2FsbChsYW5ndWFnZVN3aXRjaGVzLCBmdW5jdGlvbiAoc3cpIHtcbiAgICAgICAgICAgIHN3LmNoaWxkcmVuWzBdLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdy5sb2NhdGlvbiA9IFwiL1wiO1xuICAgICAgICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICAgICAgICBzdy5jaGlsZHJlblsyXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHcubG9jYXRpb24gPSBcIi9pdC9cIjtcbiAgICAgICAgICAgIH0sIGZhbHNlKTtcblxuICAgICAgICB9KTtcblxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5pdDogaW5pdFxuICAgIH07XG5cbn0pKCk7XG5cblxuXG4iLCJcblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG5cbiAgICBmdW5jdGlvbiB0b2dnbGVDbGFzcyhlbCwgY2xhc3NOYW1lKXtcblxuICAgICAgICBpZihlbC5jbGFzc05hbWUuaW5kZXhPZihjbGFzc05hbWUpPiAtMSApe1xuICAgICAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lLnJlcGxhY2UoY2xhc3NOYW1lLCAnJyk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgZWwuY2xhc3NOYW1lICs9IGAgJHtjbGFzc05hbWV9YDtcbiAgICAgICAgfVxuXG4gICAgfVxuXG5cdGZ1bmN0aW9uIGluaXQoKSB7IFxuXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibmF2LXRyaWdnZXJcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpeyAgXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRvZ2dsZUNsYXNzKCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmF2LXRyaWdnZXInKSwgJ29wZW4nKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IGVsPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCduYXYtY29udGFpbmVyJylbMF07XG4gICAgICAgICAgICB0b2dnbGVDbGFzcyhlbCwgJ2V4cGFuZGVkJyk7XG5cblxuXG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgXG5cbiAgICAgICAgLy9hZGQgc2Nyb2xsIGJlaGF2aW9yXG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgZnVuY3Rpb24oZSl7XG5cbiAgICAgICAgICAgIGxldCBtZW51ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5hdi1jb250YWluZXInKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDbGFzcyA9IG1lbnUuYXR0cmlidXRlcy5jbGFzcy52YWx1ZSxcbiAgICAgICAgICAgIGJvZHlUb3AgPSBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgICAgIC8vbWFya2V0c1RvcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtYXJrZXRzLXByZXZpZXcnKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgO1xuICAgICAgICAgICAgY29uc3QgaXNGaXhlZCA9IChjdXJyZW50Q2xhc3MuaW5kZXhPZignZm9sbG93JykgPiAtMSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKGJvZHlUb3AgPCAtMzMwICYmICFpc0ZpeGVkKXtcbiAgICAgICAgICAgICAgICBtZW51LmF0dHJpYnV0ZXMuY2xhc3MudmFsdWUgKz0gJyBmb2xsb3cnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihib2R5VG9wID4gLTMwMCAmJiBpc0ZpeGVkKXtcbiAgICAgICAgICAgICAgICBtZW51LmF0dHJpYnV0ZXMuY2xhc3MudmFsdWUgID0gbWVudS5hdHRyaWJ1dGVzLmNsYXNzLnZhbHVlLnJlcGxhY2UoXCJmb2xsb3dcIiwgXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIFxuXG5cbiAgICAgICAgfSlcblxuXHR9XG5cbiAgcmV0dXJuIHtcbiAgICBpbml0OiBpbml0XG4gIH07XG5cbn0pKCk7XG5cblxuXG4iLCIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSx0KTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLkFPUz10KCk6ZS5BT1M9dCgpfSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobyl7aWYobltvXSlyZXR1cm4gbltvXS5leHBvcnRzO3ZhciBpPW5bb109e2V4cG9ydHM6e30saWQ6byxsb2FkZWQ6ITF9O3JldHVybiBlW29dLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLHQpLGkubG9hZGVkPSEwLGkuZXhwb3J0c312YXIgbj17fTtyZXR1cm4gdC5tPWUsdC5jPW4sdC5wPVwiZGlzdC9cIix0KDApfShbZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG8oZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBpPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIG8gaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixvKSYmKGVbb109bltvXSl9cmV0dXJuIGV9LHI9bigxKSxhPShvKHIpLG4oNikpLHU9byhhKSxjPW4oNykscz1vKGMpLGY9big4KSxkPW8oZiksbD1uKDkpLHA9byhsKSxtPW4oMTApLGI9byhtKSx2PW4oMTEpLHk9byh2KSxnPW4oMTQpLGg9byhnKSx3PVtdLGs9ITEseD17b2Zmc2V0OjEyMCxkZWxheTowLGVhc2luZzpcImVhc2VcIixkdXJhdGlvbjo0MDAsZGlzYWJsZTohMSxvbmNlOiExLHN0YXJ0RXZlbnQ6XCJET01Db250ZW50TG9hZGVkXCIsdGhyb3R0bGVEZWxheTo5OSxkZWJvdW5jZURlbGF5OjUwLGRpc2FibGVNdXRhdGlvbk9ic2VydmVyOiExfSxqPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTtpZihlJiYoaz0hMCksaylyZXR1cm4gdz0oMCx5LmRlZmF1bHQpKHcseCksKDAsYi5kZWZhdWx0KSh3LHgub25jZSksd30sTz1mdW5jdGlvbigpe3c9KDAsaC5kZWZhdWx0KSgpLGooKX0sTT1mdW5jdGlvbigpe3cuZm9yRWFjaChmdW5jdGlvbihlLHQpe2Uubm9kZS5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLWFvc1wiKSxlLm5vZGUucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1hb3MtZWFzaW5nXCIpLGUubm9kZS5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLWFvcy1kdXJhdGlvblwiKSxlLm5vZGUucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1hb3MtZGVsYXlcIil9KX0sUz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PSEwfHxcIm1vYmlsZVwiPT09ZSYmcC5kZWZhdWx0Lm1vYmlsZSgpfHxcInBob25lXCI9PT1lJiZwLmRlZmF1bHQucGhvbmUoKXx8XCJ0YWJsZXRcIj09PWUmJnAuZGVmYXVsdC50YWJsZXQoKXx8XCJmdW5jdGlvblwiPT10eXBlb2YgZSYmZSgpPT09ITB9LF89ZnVuY3Rpb24oZSl7eD1pKHgsZSksdz0oMCxoLmRlZmF1bHQpKCk7dmFyIHQ9ZG9jdW1lbnQuYWxsJiYhd2luZG93LmF0b2I7cmV0dXJuIFMoeC5kaXNhYmxlKXx8dD9NKCk6KHguZGlzYWJsZU11dGF0aW9uT2JzZXJ2ZXJ8fGQuZGVmYXVsdC5pc1N1cHBvcnRlZCgpfHwoY29uc29sZS5pbmZvKCdcXG4gICAgICBhb3M6IE11dGF0aW9uT2JzZXJ2ZXIgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGJyb3dzZXIsXFxuICAgICAgY29kZSBtdXRhdGlvbnMgb2JzZXJ2aW5nIGhhcyBiZWVuIGRpc2FibGVkLlxcbiAgICAgIFlvdSBtYXkgaGF2ZSB0byBjYWxsIFwicmVmcmVzaEhhcmQoKVwiIGJ5IHlvdXJzZWxmLlxcbiAgICAnKSx4LmRpc2FibGVNdXRhdGlvbk9ic2VydmVyPSEwKSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiYm9keVwiKS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWFvcy1lYXNpbmdcIix4LmVhc2luZyksZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImJvZHlcIikuc2V0QXR0cmlidXRlKFwiZGF0YS1hb3MtZHVyYXRpb25cIix4LmR1cmF0aW9uKSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiYm9keVwiKS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWFvcy1kZWxheVwiLHguZGVsYXkpLFwiRE9NQ29udGVudExvYWRlZFwiPT09eC5zdGFydEV2ZW50JiZbXCJjb21wbGV0ZVwiLFwiaW50ZXJhY3RpdmVcIl0uaW5kZXhPZihkb2N1bWVudC5yZWFkeVN0YXRlKT4tMT9qKCEwKTpcImxvYWRcIj09PXguc3RhcnRFdmVudD93aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcih4LnN0YXJ0RXZlbnQsZnVuY3Rpb24oKXtqKCEwKX0pOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoeC5zdGFydEV2ZW50LGZ1bmN0aW9uKCl7aighMCl9KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCgwLHMuZGVmYXVsdCkoaix4LmRlYm91bmNlRGVsYXksITApKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm9yaWVudGF0aW9uY2hhbmdlXCIsKDAscy5kZWZhdWx0KShqLHguZGVib3VuY2VEZWxheSwhMCkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsKDAsdS5kZWZhdWx0KShmdW5jdGlvbigpeygwLGIuZGVmYXVsdCkodyx4Lm9uY2UpfSx4LnRocm90dGxlRGVsYXkpKSx4LmRpc2FibGVNdXRhdGlvbk9ic2VydmVyfHxkLmRlZmF1bHQucmVhZHkoXCJbZGF0YS1hb3NdXCIsTyksdyl9O2UuZXhwb3J0cz17aW5pdDpfLHJlZnJlc2g6aixyZWZyZXNoSGFyZDpPfX0sZnVuY3Rpb24oZSx0KXt9LCwsLCxmdW5jdGlvbihlLHQpeyhmdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKGUsdCxuKXtmdW5jdGlvbiBvKHQpe3ZhciBuPWIsbz12O3JldHVybiBiPXY9dm9pZCAwLGs9dCxnPWUuYXBwbHkobyxuKX1mdW5jdGlvbiByKGUpe3JldHVybiBrPWUsaD1zZXRUaW1lb3V0KGYsdCksTT9vKGUpOmd9ZnVuY3Rpb24gYShlKXt2YXIgbj1lLXcsbz1lLWssaT10LW47cmV0dXJuIFM/aihpLHktbyk6aX1mdW5jdGlvbiBjKGUpe3ZhciBuPWUtdyxvPWUtaztyZXR1cm4gdm9pZCAwPT09d3x8bj49dHx8bjwwfHxTJiZvPj15fWZ1bmN0aW9uIGYoKXt2YXIgZT1PKCk7cmV0dXJuIGMoZSk/ZChlKTp2b2lkKGg9c2V0VGltZW91dChmLGEoZSkpKX1mdW5jdGlvbiBkKGUpe3JldHVybiBoPXZvaWQgMCxfJiZiP28oZSk6KGI9dj12b2lkIDAsZyl9ZnVuY3Rpb24gbCgpe3ZvaWQgMCE9PWgmJmNsZWFyVGltZW91dChoKSxrPTAsYj13PXY9aD12b2lkIDB9ZnVuY3Rpb24gcCgpe3JldHVybiB2b2lkIDA9PT1oP2c6ZChPKCkpfWZ1bmN0aW9uIG0oKXt2YXIgZT1PKCksbj1jKGUpO2lmKGI9YXJndW1lbnRzLHY9dGhpcyx3PWUsbil7aWYodm9pZCAwPT09aClyZXR1cm4gcih3KTtpZihTKXJldHVybiBoPXNldFRpbWVvdXQoZix0KSxvKHcpfXJldHVybiB2b2lkIDA9PT1oJiYoaD1zZXRUaW1lb3V0KGYsdCkpLGd9dmFyIGIsdix5LGcsaCx3LGs9MCxNPSExLFM9ITEsXz0hMDtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3Iocyk7cmV0dXJuIHQ9dSh0KXx8MCxpKG4pJiYoTT0hIW4ubGVhZGluZyxTPVwibWF4V2FpdFwiaW4gbix5PVM/eCh1KG4ubWF4V2FpdCl8fDAsdCk6eSxfPVwidHJhaWxpbmdcImluIG4/ISFuLnRyYWlsaW5nOl8pLG0uY2FuY2VsPWwsbS5mbHVzaD1wLG19ZnVuY3Rpb24gbyhlLHQsbyl7dmFyIHI9ITAsYT0hMDtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3Iocyk7cmV0dXJuIGkobykmJihyPVwibGVhZGluZ1wiaW4gbz8hIW8ubGVhZGluZzpyLGE9XCJ0cmFpbGluZ1wiaW4gbz8hIW8udHJhaWxpbmc6YSksbihlLHQse2xlYWRpbmc6cixtYXhXYWl0OnQsdHJhaWxpbmc6YX0pfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9XCJ1bmRlZmluZWRcIj09dHlwZW9mIGU/XCJ1bmRlZmluZWRcIjpjKGUpO3JldHVybiEhZSYmKFwib2JqZWN0XCI9PXR8fFwiZnVuY3Rpb25cIj09dCl9ZnVuY3Rpb24gcihlKXtyZXR1cm4hIWUmJlwib2JqZWN0XCI9PShcInVuZGVmaW5lZFwiPT10eXBlb2YgZT9cInVuZGVmaW5lZFwiOmMoZSkpfWZ1bmN0aW9uIGEoZSl7cmV0dXJuXCJzeW1ib2xcIj09KFwidW5kZWZpbmVkXCI9PXR5cGVvZiBlP1widW5kZWZpbmVkXCI6YyhlKSl8fHIoZSkmJmsuY2FsbChlKT09ZH1mdW5jdGlvbiB1KGUpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiBlKXJldHVybiBlO2lmKGEoZSkpcmV0dXJuIGY7aWYoaShlKSl7dmFyIHQ9XCJmdW5jdGlvblwiPT10eXBlb2YgZS52YWx1ZU9mP2UudmFsdWVPZigpOmU7ZT1pKHQpP3QrXCJcIjp0fWlmKFwic3RyaW5nXCIhPXR5cGVvZiBlKXJldHVybiAwPT09ZT9lOitlO2U9ZS5yZXBsYWNlKGwsXCJcIik7dmFyIG49bS50ZXN0KGUpO3JldHVybiBufHxiLnRlc3QoZSk/dihlLnNsaWNlKDIpLG4/Mjo4KTpwLnRlc3QoZSk/ZjorZX12YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiBlfSxzPVwiRXhwZWN0ZWQgYSBmdW5jdGlvblwiLGY9TmFOLGQ9XCJbb2JqZWN0IFN5bWJvbF1cIixsPS9eXFxzK3xcXHMrJC9nLHA9L15bLStdMHhbMC05YS1mXSskL2ksbT0vXjBiWzAxXSskL2ksYj0vXjBvWzAtN10rJC9pLHY9cGFyc2VJbnQseT1cIm9iamVjdFwiPT0oXCJ1bmRlZmluZWRcIj09dHlwZW9mIHQ/XCJ1bmRlZmluZWRcIjpjKHQpKSYmdCYmdC5PYmplY3Q9PT1PYmplY3QmJnQsZz1cIm9iamVjdFwiPT0oXCJ1bmRlZmluZWRcIj09dHlwZW9mIHNlbGY/XCJ1bmRlZmluZWRcIjpjKHNlbGYpKSYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsaD15fHxnfHxGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCksdz1PYmplY3QucHJvdG90eXBlLGs9dy50b1N0cmluZyx4PU1hdGgubWF4LGo9TWF0aC5taW4sTz1mdW5jdGlvbigpe3JldHVybiBoLkRhdGUubm93KCl9O2UuZXhwb3J0cz1vfSkuY2FsbCh0LGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCkpfSxmdW5jdGlvbihlLHQpeyhmdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKGUsdCxuKXtmdW5jdGlvbiBpKHQpe3ZhciBuPWIsbz12O3JldHVybiBiPXY9dm9pZCAwLE89dCxnPWUuYXBwbHkobyxuKX1mdW5jdGlvbiByKGUpe3JldHVybiBPPWUsaD1zZXRUaW1lb3V0KGYsdCksTT9pKGUpOmd9ZnVuY3Rpb24gdShlKXt2YXIgbj1lLXcsbz1lLU8saT10LW47cmV0dXJuIFM/eChpLHktbyk6aX1mdW5jdGlvbiBzKGUpe3ZhciBuPWUtdyxvPWUtTztyZXR1cm4gdm9pZCAwPT09d3x8bj49dHx8bjwwfHxTJiZvPj15fWZ1bmN0aW9uIGYoKXt2YXIgZT1qKCk7cmV0dXJuIHMoZSk/ZChlKTp2b2lkKGg9c2V0VGltZW91dChmLHUoZSkpKX1mdW5jdGlvbiBkKGUpe3JldHVybiBoPXZvaWQgMCxfJiZiP2koZSk6KGI9dj12b2lkIDAsZyl9ZnVuY3Rpb24gbCgpe3ZvaWQgMCE9PWgmJmNsZWFyVGltZW91dChoKSxPPTAsYj13PXY9aD12b2lkIDB9ZnVuY3Rpb24gcCgpe3JldHVybiB2b2lkIDA9PT1oP2c6ZChqKCkpfWZ1bmN0aW9uIG0oKXt2YXIgZT1qKCksbj1zKGUpO2lmKGI9YXJndW1lbnRzLHY9dGhpcyx3PWUsbil7aWYodm9pZCAwPT09aClyZXR1cm4gcih3KTtpZihTKXJldHVybiBoPXNldFRpbWVvdXQoZix0KSxpKHcpfXJldHVybiB2b2lkIDA9PT1oJiYoaD1zZXRUaW1lb3V0KGYsdCkpLGd9dmFyIGIsdix5LGcsaCx3LE89MCxNPSExLFM9ITEsXz0hMDtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoYyk7cmV0dXJuIHQ9YSh0KXx8MCxvKG4pJiYoTT0hIW4ubGVhZGluZyxTPVwibWF4V2FpdFwiaW4gbix5PVM/ayhhKG4ubWF4V2FpdCl8fDAsdCk6eSxfPVwidHJhaWxpbmdcImluIG4/ISFuLnRyYWlsaW5nOl8pLG0uY2FuY2VsPWwsbS5mbHVzaD1wLG19ZnVuY3Rpb24gbyhlKXt2YXIgdD1cInVuZGVmaW5lZFwiPT10eXBlb2YgZT9cInVuZGVmaW5lZFwiOnUoZSk7cmV0dXJuISFlJiYoXCJvYmplY3RcIj09dHx8XCJmdW5jdGlvblwiPT10KX1mdW5jdGlvbiBpKGUpe3JldHVybiEhZSYmXCJvYmplY3RcIj09KFwidW5kZWZpbmVkXCI9PXR5cGVvZiBlP1widW5kZWZpbmVkXCI6dShlKSl9ZnVuY3Rpb24gcihlKXtyZXR1cm5cInN5bWJvbFwiPT0oXCJ1bmRlZmluZWRcIj09dHlwZW9mIGU/XCJ1bmRlZmluZWRcIjp1KGUpKXx8aShlKSYmdy5jYWxsKGUpPT1mfWZ1bmN0aW9uIGEoZSl7aWYoXCJudW1iZXJcIj09dHlwZW9mIGUpcmV0dXJuIGU7aWYocihlKSlyZXR1cm4gcztpZihvKGUpKXt2YXIgdD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBlLnZhbHVlT2Y/ZS52YWx1ZU9mKCk6ZTtlPW8odCk/dCtcIlwiOnR9aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGUpcmV0dXJuIDA9PT1lP2U6K2U7ZT1lLnJlcGxhY2UoZCxcIlwiKTt2YXIgbj1wLnRlc3QoZSk7cmV0dXJuIG58fG0udGVzdChlKT9iKGUuc2xpY2UoMiksbj8yOjgpOmwudGVzdChlKT9zOitlfXZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIGV9LGM9XCJFeHBlY3RlZCBhIGZ1bmN0aW9uXCIscz1OYU4sZj1cIltvYmplY3QgU3ltYm9sXVwiLGQ9L15cXHMrfFxccyskL2csbD0vXlstK10weFswLTlhLWZdKyQvaSxwPS9eMGJbMDFdKyQvaSxtPS9eMG9bMC03XSskL2ksYj1wYXJzZUludCx2PVwib2JqZWN0XCI9PShcInVuZGVmaW5lZFwiPT10eXBlb2YgdD9cInVuZGVmaW5lZFwiOnUodCkpJiZ0JiZ0Lk9iamVjdD09PU9iamVjdCYmdCx5PVwib2JqZWN0XCI9PShcInVuZGVmaW5lZFwiPT10eXBlb2Ygc2VsZj9cInVuZGVmaW5lZFwiOnUoc2VsZikpJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixnPXZ8fHl8fEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSxoPU9iamVjdC5wcm90b3R5cGUsdz1oLnRvU3RyaW5nLGs9TWF0aC5tYXgseD1NYXRoLm1pbixqPWZ1bmN0aW9uKCl7cmV0dXJuIGcuRGF0ZS5ub3coKX07ZS5leHBvcnRzPW59KS5jYWxsKHQsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKSl9LGZ1bmN0aW9uKGUsdCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbihlKXt2YXIgdD12b2lkIDAsbz12b2lkIDAsaT12b2lkIDA7Zm9yKHQ9MDt0PGUubGVuZ3RoO3QrPTEpe2lmKG89ZVt0XSxvLmRhdGFzZXQmJm8uZGF0YXNldC5hb3MpcmV0dXJuITA7aWYoaT1vLmNoaWxkcmVuJiZuKG8uY2hpbGRyZW4pKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIG8oKXtyZXR1cm4gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXJ8fHdpbmRvdy5XZWJLaXRNdXRhdGlvbk9ic2VydmVyfHx3aW5kb3cuTW96TXV0YXRpb25PYnNlcnZlcn1mdW5jdGlvbiBpKCl7cmV0dXJuISFvKCl9ZnVuY3Rpb24gcihlLHQpe3ZhciBuPXdpbmRvdy5kb2N1bWVudCxpPW8oKSxyPW5ldyBpKGEpO3U9dCxyLm9ic2VydmUobi5kb2N1bWVudEVsZW1lbnQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwLHJlbW92ZWROb2RlczohMH0pfWZ1bmN0aW9uIGEoZSl7ZSYmZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuYWRkZWROb2Rlcyksbz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLnJlbW92ZWROb2RlcyksaT10LmNvbmNhdChvKTtpZihuKGkpKXJldHVybiB1KCl9KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgdT1mdW5jdGlvbigpe307dC5kZWZhdWx0PXtpc1N1cHBvcnRlZDppLHJlYWR5OnJ9fSxmdW5jdGlvbihlLHQpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIG4oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIG8oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudHx8bmF2aWdhdG9yLnZlbmRvcnx8d2luZG93Lm9wZXJhfHxcIlwifU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgbz10W25dO28uZW51bWVyYWJsZT1vLmVudW1lcmFibGV8fCExLG8uY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixvKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxvJiZlKHQsbyksdH19KCkscj0vKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXJpc3xraW5kbGV8bGdlIHxtYWVtb3xtaWRwfG1tcHxtb2JpbGUuK2ZpcmVmb3h8bmV0ZnJvbnR8b3BlcmEgbShvYnxpbilpfHBhbG0oIG9zKT98cGhvbmV8cChpeGl8cmUpXFwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoNHw2KTB8c3ltYmlhbnx0cmVvfHVwXFwuKGJyb3dzZXJ8bGluayl8dm9kYWZvbmV8d2FwfHdpbmRvd3MgY2V8eGRhfHhpaW5vL2ksYT0vMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1xcLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXxcXC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKGV8dil3fGJ1bWJ8YndcXC0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbVxcLXxjZWxsfGNodG18Y2xkY3xjbWRcXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcXC1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfFxcLWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShcXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcXC01fGdcXC1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXFwtKG18cHx0KXxoZWlcXC18aGkocHR8dGEpfGhwKCBpfGlwKXxoc1xcLWN8aHQoYyhcXC18IHxffGF8Z3xwfHN8dCl8dHApfGh1KGF3fHRjKXxpXFwtKDIwfGdvfG1hKXxpMjMwfGlhYyggfFxcLXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djXFwtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcXC8oa3xsfHUpfDUwfDU0fFxcLVthLXddKXxsaWJ3fGx5bnh8bTFcXC13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bVxcLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFxcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXFwtfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3xcXC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG5cXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcXC1nfHFhXFwtYXxxYygwN3wxMnwyMXwzMnw2MHxcXC1bMi03XXxpXFwtKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aFxcLXxvb3xwXFwtKXxzZGtcXC98c2UoYyhcXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXFwtfHNoYXJ8c2llKFxcLXxtKXxza1xcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFxcLXx2XFwtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsXFwtfHRkZ1xcLXx0ZWwoaXxtKXx0aW1cXC18dFxcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXFwtfG0zfG01KXx0eFxcLTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFxcLXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoXFwtfCApfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzXFwtfHlvdXJ8emV0b3x6dGVcXC0vaSx1PS8oYW5kcm9pZHxiYlxcZCt8bWVlZ28pLittb2JpbGV8YXZhbnRnb3xiYWRhXFwvfGJsYWNrYmVycnl8YmxhemVyfGNvbXBhbHxlbGFpbmV8ZmVubmVjfGhpcHRvcHxpZW1vYmlsZXxpcChob25lfG9kKXxpcmlzfGtpbmRsZXxsZ2UgfG1hZW1vfG1pZHB8bW1wfG1vYmlsZS4rZmlyZWZveHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyBjZXx4ZGF8eGlpbm98YW5kcm9pZHxpcGFkfHBsYXlib29rfHNpbGsvaSxjPS8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzXFwtKXxhaShrb3xybil8YWwoYXZ8Y2F8Y28pfGFtb2l8YW4oZXh8bnl8eXcpfGFwdHV8YXIoY2h8Z28pfGFzKHRlfHVzKXxhdHR3fGF1KGRpfFxcLW18ciB8cyApfGF2YW58YmUoY2t8bGx8bnEpfGJpKGxifHJkKXxibChhY3xheil8YnIoZXx2KXd8YnVtYnxid1xcLShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtXFwtfGNlbGx8Y2h0bXxjbGRjfGNtZFxcLXxjbyhtcHxuZCl8Y3Jhd3xkYShpdHxsbHxuZyl8ZGJ0ZXxkY1xcLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8XFwtZCl8ZWwoNDl8YWkpfGVtKGwyfHVsKXxlcihpY3xrMCl8ZXNsOHxleihbNC03XTB8b3N8d2F8emUpfGZldGN8Zmx5KFxcLXxfKXxnMSB1fGc1NjB8Z2VuZXxnZlxcLTV8Z1xcLW1vfGdvKFxcLnd8b2QpfGdyKGFkfHVuKXxoYWllfGhjaXR8aGRcXC0obXxwfHQpfGhlaVxcLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzXFwtY3xodChjKFxcLXwgfF98YXxnfHB8c3x0KXx0cCl8aHUoYXd8dGMpfGlcXC0oMjB8Z298bWEpfGkyMzB8aWFjKCB8XFwtfFxcLyl8aWJyb3xpZGVhfGlnMDF8aWtvbXxpbTFrfGlubm98aXBhcXxpcmlzfGphKHR8dilhfGpicm98amVtdXxqaWdzfGtkZGl8a2VqaXxrZ3QoIHxcXC8pfGtsb258a3B0IHxrd2NcXC18a3lvKGN8ayl8bGUobm98eGkpfGxnKCBnfFxcLyhrfGx8dSl8NTB8NTR8XFwtW2Etd10pfGxpYnd8bHlueHxtMVxcLXd8bTNnYXxtNTBcXC98bWEodGV8dWl8eG8pfG1jKDAxfDIxfGNhKXxtXFwtY3J8bWUocmN8cmkpfG1pKG84fG9hfHRzKXxtbWVmfG1vKDAxfDAyfGJpfGRlfGRvfHQoXFwtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSlcXC18b258dGZ8d2Z8d2d8d3QpfG5vayg2fGkpfG56cGh8bzJpbXxvcCh0aXx3dil8b3Jhbnxvd2cxfHA4MDB8cGFuKGF8ZHx0KXxwZHhnfHBnKDEzfFxcLShbMS04XXxjKSl8cGhpbHxwaXJlfHBsKGF5fHVjKXxwblxcLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdFxcLWd8cWFcXC1hfHFjKDA3fDEyfDIxfDMyfDYwfFxcLVsyLTddfGlcXC0pfHF0ZWt8cjM4MHxyNjAwfHJha3N8cmltOXxybyh2ZXx6byl8czU1XFwvfHNhKGdlfG1hfG1tfG1zfG55fHZhKXxzYygwMXxoXFwtfG9vfHBcXC0pfHNka1xcL3xzZShjKFxcLXwwfDEpfDQ3fG1jfG5kfHJpKXxzZ2hcXC18c2hhcnxzaWUoXFwtfG0pfHNrXFwtMHxzbCg0NXxpZCl8c20oYWx8YXJ8YjN8aXR8dDUpfHNvKGZ0fG55KXxzcCgwMXxoXFwtfHZcXC18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2xcXC18dGRnXFwtfHRlbChpfG0pfHRpbVxcLXx0XFwtbW98dG8ocGx8c2gpfHRzKDcwfG1cXC18bTN8bTUpfHR4XFwtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118XFwtdil8dm00MHx2b2RhfHZ1bGN8dngoNTJ8NTN8NjB8NjF8NzB8ODB8ODF8ODN8ODV8OTgpfHczYyhcXC18ICl8d2ViY3x3aGl0fHdpKGcgfG5jfG53KXx3bWxifHdvbnV8eDcwMHx5YXNcXC18eW91cnx6ZXRvfHp0ZVxcLS9pLHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7bih0aGlzLGUpfXJldHVybiBpKGUsW3trZXk6XCJwaG9uZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9bygpO3JldHVybiEoIXIudGVzdChlKSYmIWEudGVzdChlLnN1YnN0cigwLDQpKSl9fSx7a2V5OlwibW9iaWxlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1vKCk7cmV0dXJuISghdS50ZXN0KGUpJiYhYy50ZXN0KGUuc3Vic3RyKDAsNCkpKX19LHtrZXk6XCJ0YWJsZXRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vYmlsZSgpJiYhdGhpcy5waG9uZSgpfX1dKSxlfSgpO3QuZGVmYXVsdD1uZXcgc30sZnVuY3Rpb24oZSx0KXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1mdW5jdGlvbihlLHQsbil7dmFyIG89ZS5ub2RlLmdldEF0dHJpYnV0ZShcImRhdGEtYW9zLW9uY2VcIik7dD5lLnBvc2l0aW9uP2Uubm9kZS5jbGFzc0xpc3QuYWRkKFwiYW9zLWFuaW1hdGVcIik6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIG8mJihcImZhbHNlXCI9PT1vfHwhbiYmXCJ0cnVlXCIhPT1vKSYmZS5ub2RlLmNsYXNzTGlzdC5yZW1vdmUoXCJhb3MtYW5pbWF0ZVwiKX0sbz1mdW5jdGlvbihlLHQpe3ZhciBvPXdpbmRvdy5wYWdlWU9mZnNldCxpPXdpbmRvdy5pbm5lckhlaWdodDtlLmZvckVhY2goZnVuY3Rpb24oZSxyKXtuKGUsaStvLHQpfSl9O3QuZGVmYXVsdD1vfSxmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGk9bigxMikscj1vKGkpLGE9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUsbil7ZS5ub2RlLmNsYXNzTGlzdC5hZGQoXCJhb3MtaW5pdFwiKSxlLnBvc2l0aW9uPSgwLHIuZGVmYXVsdCkoZS5ub2RlLHQub2Zmc2V0KX0pLGV9O3QuZGVmYXVsdD1hfSxmdW5jdGlvbihlLHQsbil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIGk9bigxMykscj1vKGkpLGE9ZnVuY3Rpb24oZSx0KXt2YXIgbj0wLG89MCxpPXdpbmRvdy5pbm5lckhlaWdodCxhPXtvZmZzZXQ6ZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWFvcy1vZmZzZXRcIiksYW5jaG9yOmUuZ2V0QXR0cmlidXRlKFwiZGF0YS1hb3MtYW5jaG9yXCIpLGFuY2hvclBsYWNlbWVudDplLmdldEF0dHJpYnV0ZShcImRhdGEtYW9zLWFuY2hvci1wbGFjZW1lbnRcIil9O3N3aXRjaChhLm9mZnNldCYmIWlzTmFOKGEub2Zmc2V0KSYmKG89cGFyc2VJbnQoYS5vZmZzZXQpKSxhLmFuY2hvciYmZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChhLmFuY2hvcikmJihlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYS5hbmNob3IpWzBdKSxuPSgwLHIuZGVmYXVsdCkoZSkudG9wLGEuYW5jaG9yUGxhY2VtZW50KXtjYXNlXCJ0b3AtYm90dG9tXCI6YnJlYWs7Y2FzZVwiY2VudGVyLWJvdHRvbVwiOm4rPWUub2Zmc2V0SGVpZ2h0LzI7YnJlYWs7Y2FzZVwiYm90dG9tLWJvdHRvbVwiOm4rPWUub2Zmc2V0SGVpZ2h0O2JyZWFrO2Nhc2VcInRvcC1jZW50ZXJcIjpuKz1pLzI7YnJlYWs7Y2FzZVwiYm90dG9tLWNlbnRlclwiOm4rPWkvMitlLm9mZnNldEhlaWdodDticmVhaztjYXNlXCJjZW50ZXItY2VudGVyXCI6bis9aS8yK2Uub2Zmc2V0SGVpZ2h0LzI7YnJlYWs7Y2FzZVwidG9wLXRvcFwiOm4rPWk7YnJlYWs7Y2FzZVwiYm90dG9tLXRvcFwiOm4rPWUub2Zmc2V0SGVpZ2h0K2k7YnJlYWs7Y2FzZVwiY2VudGVyLXRvcFwiOm4rPWUub2Zmc2V0SGVpZ2h0LzIraX1yZXR1cm4gYS5hbmNob3JQbGFjZW1lbnR8fGEub2Zmc2V0fHxpc05hTih0KXx8KG89dCksbitvfTt0LmRlZmF1bHQ9YX0sZnVuY3Rpb24oZSx0KXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPTA7ZSYmIWlzTmFOKGUub2Zmc2V0TGVmdCkmJiFpc05hTihlLm9mZnNldFRvcCk7KXQrPWUub2Zmc2V0TGVmdC0oXCJCT0RZXCIhPWUudGFnTmFtZT9lLnNjcm9sbExlZnQ6MCksbis9ZS5vZmZzZXRUb3AtKFwiQk9EWVwiIT1lLnRhZ05hbWU/ZS5zY3JvbGxUb3A6MCksZT1lLm9mZnNldFBhcmVudDtyZXR1cm57dG9wOm4sbGVmdDp0fX07dC5kZWZhdWx0PW59LGZ1bmN0aW9uKGUsdCl7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZXx8ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLWFvc11cIiksQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKGUsZnVuY3Rpb24oZSl7cmV0dXJue25vZGU6ZX19KX07dC5kZWZhdWx0PW59XSl9KTsiLCI7KGZ1bmN0aW9uICh3aW5kb3csIGRvY3VtZW50KSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGFkZEV2ZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBhZGRTdGFuZGFyZEV2ZW50TGlzdGVuZXIoZWwsIGV2ZW50TmFtZSwgZm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZuLCBmYWxzZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGFkZElFRXZlbnRMaXN0ZW5lcihlbCwgZXZlbnROYW1lLCBmbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbC5hdHRhY2hFdmVudCgnb24nICsgZXZlbnROYW1lLCBmbik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSkoKTtcblxuICAgIHZhciBkZWZhdWx0V2lkdGhzID0gWzk2LCAxMzAsIDE2NSwgMjAwLCAyMzUsIDI3MCwgMzA0LCAzNDAsIDM3NSwgNDEwLCA0NDUsIDQ4NSwgNTIwLCA1NTUsIDU5MCwgNjI1LCA2NjAsIDY5NSwgNzM2XTtcblxuICAgIHZhciBnZXRLZXlzID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmtleXMgOiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIHZhciBrZXlzID0gW10sXG4gICAgICAgICAgICBrZXk7XG5cbiAgICAgICAgZm9yIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXlzO1xuICAgIH07XG5cbiAgICB2YXIgYXBwbHlFYWNoID0gZnVuY3Rpb24gKGNvbGxlY3Rpb24sIGNhbGxiYWNrRWFjaCkge1xuICAgICAgICB2YXIgaSA9IDAsXG4gICAgICAgICAgICBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aCxcbiAgICAgICAgICAgIG5ld19jb2xsZWN0aW9uID0gW107XG5cbiAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbmV3X2NvbGxlY3Rpb25baV0gPSBjYWxsYmFja0VhY2goY29sbGVjdGlvbltpXSwgaSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3X2NvbGxlY3Rpb247XG4gICAgfTtcblxuICAgIHZhciByZXR1cm5GbiA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4gICAgdmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICB2YXIgdHJ1ZUZuID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTtcblxuICAgIHZhciBkZWJvdW5jZSA9IGZ1bmN0aW9uIChmbiwgd2FpdCkge1xuICAgICAgICB2YXIgdGltZW91dDtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcywgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgICAgIHZhciBsYXRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBmbi5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG4gICAgICAgIH07XG4gICAgfTtcblxuXG4gICAgLypcbiAgICAgICAgQ29uc3RydWN0IGEgbmV3IEltYWdlciBpbnN0YW5jZSwgcGFzc2luZyBhbiBvcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdC5cblxuICAgICAgICBFeGFtcGxlIHVzYWdlOlxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gQXZhaWxhYmxlIHdpZHRocyBmb3IgeW91ciBpbWFnZXNcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVXaWR0aHM6IFtOdW1iZXJdLFxuXG4gICAgICAgICAgICAgICAgLy8gU2VsZWN0b3IgdG8gYmUgdXNlZCB0byBsb2NhdGUgeW91ciBkaXYgcGxhY2Vob2xkZXJzXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6ICcnLFxuXG4gICAgICAgICAgICAgICAgLy8gQ2xhc3MgbmFtZSB0byBnaXZlIHlvdXIgcmVzaXphYmxlIGltYWdlc1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJycsXG5cbiAgICAgICAgICAgICAgICAvLyBJZiBzZXQgdG8gdHJ1ZSwgSW1hZ2VyIHdpbGwgdXBkYXRlIHRoZSBzcmMgYXR0cmlidXRlIG9mIHRoZSByZWxldmFudCBpbWFnZXNcbiAgICAgICAgICAgICAgICBvblJlc2l6ZTogQm9vbGVhbixcblxuICAgICAgICAgICAgICAgIC8vIFRvZ2dsZSB0aGUgbGF6eSBsb2FkIGZ1bmN0aW9uYWxpdHkgb24gb3Igb2ZmXG4gICAgICAgICAgICAgICAgbGF6eWxvYWQ6IEJvb2xlYW4sXG5cbiAgICAgICAgICAgICAgICAvLyBVc2VkIGFsb25nc2lkZSB0aGUgbGF6eWxvYWQgZmVhdHVyZSAoaGVscHMgcGVyZm9ybWFuY2UgYnkgc2V0dGluZyBhIGhpZ2hlciBkZWxheSlcbiAgICAgICAgICAgICAgICBzY3JvbGxEZWxheTogTnVtYmVyXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgQHBhcmFtIHtvYmplY3R9IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3NcbiAgICAgICAgQHJldHVybiB7b2JqZWN0fSBpbnN0YW5jZSBvZiBJbWFnZXJcbiAgICAgKi9cbiAgICB2YXIgSW1hZ2VyID0gZnVuY3Rpb24gKGVsZW1lbnRzLCBvcHRzKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIGRvYyAgPSBkb2N1bWVudDtcblxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fTtcblxuICAgICAgICBpZiAoZWxlbWVudHMgIT09IHVuZGVmaW5lZCkge1xuXG4gICAgICAgICAgICAvLyBzZWxlY3RvciBzdHJpbmcgKG5vdCBlbGVtZW50cylcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgb3B0cy5zZWxlY3RvciA9IGVsZW1lbnRzO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAnb3B0cycgb2JqZWN0IChub3QgZWxlbWVudHMpXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZWxlbWVudHMubGVuZ3RoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIG9wdHMgPSBlbGVtZW50cztcbiAgICAgICAgICAgICAgICBlbGVtZW50cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmlld3BvcnRIZWlnaHQgICA9IGRvYy5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICB0aGlzLnNlbGVjdG9yICAgICAgICAgPSAhZWxlbWVudHMgPyAob3B0cy5zZWxlY3RvciB8fCAnLmRlbGF5ZWQtaW1hZ2UtbG9hZCcpIDogbnVsbDtcbiAgICAgICAgdGhpcy5jbGFzc05hbWUgICAgICAgID0gb3B0cy5jbGFzc05hbWUgfHwgJ2ltYWdlLXJlcGxhY2UnO1xuICAgICAgICB0aGlzLmdpZiAgICAgICAgICAgICAgPSBkb2MuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICAgIHRoaXMuZ2lmLnNyYyAgICAgICAgICA9ICdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFQUFKQUlBQUFQLy8vd0FBQUNINUJBRUFBQUFBTEFBQUFBQVFBQWtBQUFJS2hJK3B5KzBQbzV5VUZRQTcnO1xuICAgICAgICB0aGlzLmdpZi5jbGFzc05hbWUgICAgPSB0aGlzLmNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5naWYuYWx0ICAgICAgICAgID0gJyc7XG4gICAgICAgIHRoaXMubGF6eWxvYWRPZmZzZXQgICA9IG9wdHMubGF6eWxvYWRPZmZzZXQgfHwgMDtcbiAgICAgICAgdGhpcy5zY3JvbGxEZWxheSAgICAgID0gb3B0cy5zY3JvbGxEZWxheSB8fCAyNTA7XG4gICAgICAgIHRoaXMub25SZXNpemUgICAgICAgICA9IG9wdHMuaGFzT3duUHJvcGVydHkoJ29uUmVzaXplJykgPyBvcHRzLm9uUmVzaXplIDogdHJ1ZTtcbiAgICAgICAgdGhpcy5sYXp5bG9hZCAgICAgICAgID0gb3B0cy5oYXNPd25Qcm9wZXJ0eSgnbGF6eWxvYWQnKSA/IG9wdHMubGF6eWxvYWQgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5zY3JvbGxlZCAgICAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlUGl4ZWxSYXRpb3MgPSBvcHRzLmF2YWlsYWJsZVBpeGVsUmF0aW9zIHx8IFsxLCAyXTtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVXaWR0aHMgID0gb3B0cy5hdmFpbGFibGVXaWR0aHMgfHwgZGVmYXVsdFdpZHRocztcbiAgICAgICAgdGhpcy5vbkltYWdlc1JlcGxhY2VkID0gb3B0cy5vbkltYWdlc1JlcGxhY2VkIHx8IG5vb3A7XG4gICAgICAgIHRoaXMud2lkdGhzTWFwICAgICAgICA9IHt9O1xuICAgICAgICB0aGlzLnJlZnJlc2hQaXhlbFJhdGlvKCk7XG4gICAgICAgIHRoaXMud2lkdGhJbnRlcnBvbGF0b3IgPSBvcHRzLndpZHRoSW50ZXJwb2xhdG9yIHx8IHJldHVybkZuO1xuXG4gICAgICAgIC8vIE5lZWRlZCBhcyBJRTggYWRkcyBhIGRlZmF1bHQgYHdpZHRoYC9gaGVpZ2h0YCBhdHRyaWJ1dGXigKZcbiAgICAgICAgdGhpcy5naWYucmVtb3ZlQXR0cmlidXRlKCdoZWlnaHQnKTtcbiAgICAgICAgdGhpcy5naWYucmVtb3ZlQXR0cmlidXRlKCd3aWR0aCcpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hdmFpbGFibGVXaWR0aHMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuYXZhaWxhYmxlV2lkdGhzLmxlbmd0aCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGhzTWFwID0gSW1hZ2VyLmNyZWF0ZVdpZHRoc01hcCh0aGlzLmF2YWlsYWJsZVdpZHRocywgdGhpcy53aWR0aEludGVycG9sYXRvciwgdGhpcy5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndpZHRoc01hcCA9IHRoaXMuYXZhaWxhYmxlV2lkdGhzO1xuICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVXaWR0aHMgPSBnZXRLZXlzKHRoaXMuYXZhaWxhYmxlV2lkdGhzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmF2YWlsYWJsZVdpZHRocyA9IHRoaXMuYXZhaWxhYmxlV2lkdGhzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBhIC0gYjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGl2cyA9IFtdO1xuICAgICAgICB0aGlzLmFkZChlbGVtZW50cyB8fCB0aGlzLnNlbGVjdG9yKTtcbiAgICAgICAgdGhpcy5yZWFkeShvcHRzLm9uUmVhZHkpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5pbml0KCk7XG4gICAgICAgIH0sIDApO1xuICAgIH07XG5cbiAgICBJbWFnZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChlbGVtZW50c09yU2VsZWN0b3IpIHtcblxuICAgICAgICBlbGVtZW50c09yU2VsZWN0b3IgPSBlbGVtZW50c09yU2VsZWN0b3IgfHwgdGhpcy5zZWxlY3RvcjtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gdHlwZW9mIGVsZW1lbnRzT3JTZWxlY3RvciA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlbGVtZW50c09yU2VsZWN0b3IpIDogLy8gU2VsZWN0b3JcbiAgICAgICAgICAgIGVsZW1lbnRzT3JTZWxlY3RvcjsgLy8gRWxlbWVudHMgKE5vZGVMaXN0IG9yIGFycmF5IG9mIE5vZGVzKVxuXG4gICAgICAgIGlmIChlbGVtZW50cyAmJiBlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsID0gYXBwbHlFYWNoKGVsZW1lbnRzLCByZXR1cm5Gbik7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURpdnNUb0VtcHR5SW1hZ2VzKGFkZGl0aW9uYWwpO1xuICAgICAgICAgICAgdGhpcy5kaXZzID0gdGhpcy5kaXZzLmNvbmNhdChhZGRpdGlvbmFsKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBJbWFnZXIucHJvdG90eXBlLnNjcm9sbENoZWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBvZmZzY3JlZW5JbWFnZUNvdW50ID0gMDtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsZWQpIHtcbiAgICAgICAgICAgIC8vIGNvbGxlY3RzIGEgc3Vic2V0IG9mIG5vdC15ZXQtcmVzcG9uc2l2ZSBpbWFnZXMgYW5kIG5vdCBvZmZzY3JlZW4gYW55bW9yZVxuICAgICAgICAgICAgYXBwbHlFYWNoKHRoaXMuZGl2cywgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc1BsYWNlaG9sZGVyKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICsrb2Zmc2NyZWVuSW1hZ2VDb3VudDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc1RoaXNFbGVtZW50T25TY3JlZW4oZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG9mZnNjcmVlbkltYWdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChzZWxmLmludGVydmFsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEaXZzVG9FbXB0eUltYWdlcyhlbGVtZW50cyk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgSW1hZ2VyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIHZhciBmaWx0ZXJGbiA9IHRydWVGbjtcblxuICAgICAgICBpZiAodGhpcy5sYXp5bG9hZCkge1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlclNjcm9sbEV2ZW50KCk7XG5cbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsZWQgPSB0cnVlO1xuICAgICAgICAgICAgc2VsZi5zY3JvbGxDaGVjaygpO1xuXG4gICAgICAgICAgICBmaWx0ZXJGbiA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaXNQbGFjZWhvbGRlcihlbGVtZW50KSA9PT0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaGVja0ltYWdlc05lZWRSZXBsYWNpbmcodGhpcy5kaXZzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9uUmVzaXplKSB7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyUmVzaXplRXZlbnQoZmlsdGVyRm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vblJlYWR5KCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGEgZnVuY3Rpb24gd2hlbiBJbWFnZXIgaXMgcmVhZHkgdG8gd29ya1xuICAgICAqIEl0IGFjdHMgYXMgYSBjb252ZW5pZW50L3Nob3J0Y3V0IGZvciBgbmV3IEltYWdlcih7IG9uUmVhZHk6IGZuIH0pYFxuICAgICAqXG4gICAgICogQHNpbmNlIDAuMy4xXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICAgKi9cbiAgICBJbWFnZXIucHJvdG90eXBlLnJlYWR5ID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHRoaXMub25SZWFkeSA9IGZuIHx8IG5vb3A7XG4gICAgfTtcblxuICAgIEltYWdlci5wcm90b3R5cGUuY3JlYXRlR2lmID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBhIHJlc3BvbnNpdmUgaW1hZ2UgdGhlbiB3ZSBkb24ndCByZXBsYWNlIGl0IGFnYWluXG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTmFtZS5tYXRjaChuZXcgUmVnRXhwKCcoXnwgKScgKyB0aGlzLmNsYXNzTmFtZSArICcoIHwkKScpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZWxlbWVudENsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNsYXNzJyk7XG4gICAgICAgIHZhciBlbGVtZW50V2lkdGggPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS13aWR0aCcpO1xuICAgICAgICB2YXIgZ2lmID0gdGhpcy5naWYuY2xvbmVOb2RlKGZhbHNlKTtcblxuICAgICAgICBpZiAoZWxlbWVudFdpZHRoKSB7XG4gICAgICAgICAgZ2lmLndpZHRoID0gZWxlbWVudFdpZHRoO1xuICAgICAgICAgIGdpZi5zZXRBdHRyaWJ1dGUoJ2RhdGEtd2lkdGgnLCBlbGVtZW50V2lkdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2lmLmNsYXNzTmFtZSA9IChlbGVtZW50Q2xhc3NOYW1lID8gZWxlbWVudENsYXNzTmFtZSArICcgJyA6ICcnKSArIHRoaXMuY2xhc3NOYW1lO1xuICAgICAgICBnaWYuc2V0QXR0cmlidXRlKCdkYXRhLXNyYycsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXNyYycpKTtcbiAgICAgICAgZ2lmLnNldEF0dHJpYnV0ZSgnYWx0JywgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYWx0JykgfHwgZWxlbWVudC5hbHQgfHwgdGhpcy5naWYuYWx0KTtcblxuICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGdpZiwgZWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIGdpZjtcbiAgICB9O1xuXG4gICAgSW1hZ2VyLnByb3RvdHlwZS5jaGFuZ2VEaXZzVG9FbXB0eUltYWdlcyA9IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgYXBwbHlFYWNoKGVsZW1lbnRzLCBmdW5jdGlvbiAoZWxlbWVudCwgaSkge1xuICAgICAgICAgICAgZWxlbWVudHNbaV0gPSBzZWxmLmNyZWF0ZUdpZihlbGVtZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tJbWFnZXNOZWVkUmVwbGFjaW5nKGVsZW1lbnRzKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgYW4gZWxlbWVudCBpcyBhbiBJbWFnZXIgcGxhY2Vob2xkZXJcbiAgICAgKlxuICAgICAqIEBzaW5jZSAxLjMuMVxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudH0gZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIEltYWdlci5wcm90b3R5cGUuaXNQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnNyYyA9PT0gdGhpcy5naWYuc3JjO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW4gZWxlbWVudCBpcyBsb2NhdGVkIHdpdGhpbiBhIHNjcmVlbiBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgSW1hZ2VyLnByb3RvdHlwZS5pc1RoaXNFbGVtZW50T25TY3JlZW4gPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAvLyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCB3YXMgd29ya2luZyBpbiBDaHJvbWUgYnV0IGRpZG4ndCB3b3JrIG9uIEZpcmVmb3gsIHNvIGhhZCB0byByZXNvcnQgdG8gd2luZG93LnBhZ2VZT2Zmc2V0XG4gICAgICAgIC8vIGJ1dCBjYW4ndCBmYWxsYmFjayB0byBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCBhcyB0aGF0IGRvZXNuJ3Qgd29yayBpbiBJRSB3aXRoIGEgZG9jdHlwZSAoPykgc28gaGF2ZSB0byB1c2UgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcFxuICAgICAgICB2YXIgZWxlbWVudE9mZnNldFRvcCA9IDA7XG4gICAgICAgIHZhciBvZmZzZXQgPSBJbWFnZXIuZ2V0UGFnZU9mZnNldCgpICsgdGhpcy5sYXp5bG9hZE9mZnNldDtcblxuICAgICAgICBpZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50T2Zmc2V0VG9wICs9IGVsZW1lbnQub2Zmc2V0VG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWxlbWVudE9mZnNldFRvcCA8ICh0aGlzLnZpZXdwb3J0SGVpZ2h0ICsgb2Zmc2V0KTtcbiAgICB9O1xuXG4gICAgSW1hZ2VyLnByb3RvdHlwZS5jaGVja0ltYWdlc05lZWRSZXBsYWNpbmcgPSBmdW5jdGlvbiAoaW1hZ2VzLCBmaWx0ZXJGbikge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGZpbHRlckZuID0gZmlsdGVyRm4gfHwgdHJ1ZUZuO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1Jlc2l6aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmlzUmVzaXppbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoUGl4ZWxSYXRpbygpO1xuXG4gICAgICAgICAgICBhcHBseUVhY2goaW1hZ2VzLCBmdW5jdGlvbiAoaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyRm4oaW1hZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYucmVwbGFjZUltYWdlc0Jhc2VkT25TY3JlZW5EaW1lbnNpb25zKGltYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5pc1Jlc2l6aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLm9uSW1hZ2VzUmVwbGFjZWQoaW1hZ2VzKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGdyYWRlcyBhbiBpbWFnZSBmcm9tIGFuIGVtcHR5IHBsYWNlaG9sZGVyIHRvIGEgZnVsbHkgc291cmNlZCBpbWFnZSBlbGVtZW50XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnR9IGltYWdlXG4gICAgICovXG4gICAgSW1hZ2VyLnByb3RvdHlwZS5yZXBsYWNlSW1hZ2VzQmFzZWRPblNjcmVlbkRpbWVuc2lvbnMgPSBmdW5jdGlvbiAoaW1hZ2UpIHtcbiAgICAgICAgdmFyIGNvbXB1dGVkV2lkdGgsIG5hdHVyYWxXaWR0aDtcblxuXHRuYXR1cmFsV2lkdGggPSBJbWFnZXIuZ2V0TmF0dXJhbFdpZHRoKGltYWdlKTtcbiAgICAgICAgY29tcHV0ZWRXaWR0aCA9IHR5cGVvZiB0aGlzLmF2YWlsYWJsZVdpZHRocyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuYXZhaWxhYmxlV2lkdGhzKGltYWdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5kZXRlcm1pbmVBcHByb3ByaWF0ZVJlc29sdXRpb24oaW1hZ2UpO1xuXG4gICAgICAgIGltYWdlLndpZHRoID0gY29tcHV0ZWRXaWR0aDtcblxuICAgICAgICBpZiAoIXRoaXMuaXNQbGFjZWhvbGRlcihpbWFnZSkgJiYgY29tcHV0ZWRXaWR0aCA8PSBuYXR1cmFsV2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGltYWdlLnNyYyA9IHRoaXMuY2hhbmdlSW1hZ2VTcmNUb1VzZU5ld0ltYWdlRGltZW5zaW9ucyhpbWFnZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3JjJyksIGNvbXB1dGVkV2lkdGgpO1xuICAgICAgICBpbWFnZS5yZW1vdmVBdHRyaWJ1dGUoJ3dpZHRoJyk7XG4gICAgICAgIGltYWdlLnJlbW92ZUF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG4gICAgfTtcblxuICAgIEltYWdlci5wcm90b3R5cGUuZGV0ZXJtaW5lQXBwcm9wcmlhdGVSZXNvbHV0aW9uID0gZnVuY3Rpb24gKGltYWdlKSB7XG4gICAgICByZXR1cm4gSW1hZ2VyLmdldENsb3Nlc3RWYWx1ZShpbWFnZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtd2lkdGgnKSB8fCBpbWFnZS5wYXJlbnROb2RlLmNsaWVudFdpZHRoLCB0aGlzLmF2YWlsYWJsZVdpZHRocyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGRldmljZSBwaXhlbCByYXRpbyB2YWx1ZSB1c2VkIGJ5IEltYWdlclxuICAgICAqXG4gICAgICogSXQgaXMgcGVyZm9ybWVkIGJlZm9yZSBlYWNoIHJlcGxhY2VtZW50IGxvb3AsIGluIGNhc2UgYSB1c2VyIHpvb21lZCBpbi9vdXRcbiAgICAgKiBhbmQgdGh1cyB1cGRhdGVkIHRoZSBgd2luZG93LmRldmljZVBpeGVsUmF0aW9gIHZhbHVlLlxuICAgICAqXG4gICAgICogQGFwaVxuICAgICAqIEBzaW5jZSAxLjAuMVxuICAgICAqL1xuICAgIEltYWdlci5wcm90b3R5cGUucmVmcmVzaFBpeGVsUmF0aW8gPSBmdW5jdGlvbiByZWZyZXNoUGl4ZWxSYXRpbygpIHtcbiAgICAgICAgdGhpcy5kZXZpY2VQaXhlbFJhdGlvID0gSW1hZ2VyLmdldENsb3Nlc3RWYWx1ZShJbWFnZXIuZ2V0UGl4ZWxSYXRpbygpLCB0aGlzLmF2YWlsYWJsZVBpeGVsUmF0aW9zKTtcbiAgICB9O1xuXG4gICAgSW1hZ2VyLnByb3RvdHlwZS5jaGFuZ2VJbWFnZVNyY1RvVXNlTmV3SW1hZ2VEaW1lbnNpb25zID0gZnVuY3Rpb24gKHNyYywgc2VsZWN0ZWRXaWR0aCkge1xuICAgICAgICByZXR1cm4gc3JjXG4gICAgICAgICAgICAucmVwbGFjZSgve3dpZHRofS9nLCBJbWFnZXIudHJhbnNmb3Jtcy53aWR0aChzZWxlY3RlZFdpZHRoLCB0aGlzLndpZHRoc01hcCkpXG4gICAgICAgICAgICAucmVwbGFjZSgve3BpeGVsX3JhdGlvfS9nLCBJbWFnZXIudHJhbnNmb3Jtcy5waXhlbFJhdGlvKHRoaXMuZGV2aWNlUGl4ZWxSYXRpbykpO1xuICAgIH07XG5cbiAgICBJbWFnZXIuZ2V0UGl4ZWxSYXRpbyA9IGZ1bmN0aW9uIGdldFBpeGVsUmF0aW8oY29udGV4dCkge1xuICAgICAgICByZXR1cm4gKGNvbnRleHQgfHwgd2luZG93KVsnZGV2aWNlUGl4ZWxSYXRpbyddIHx8IDE7XG4gICAgfTtcblxuICAgIEltYWdlci5jcmVhdGVXaWR0aHNNYXAgPSBmdW5jdGlvbiBjcmVhdGVXaWR0aHNNYXAgKHdpZHRocywgaW50ZXJwb2xhdG9yLCBwaXhlbFJhdGlvKSB7XG4gICAgICAgIHZhciBtYXAgPSB7fSxcbiAgICAgICAgICAgIGkgICA9IHdpZHRocy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgbWFwW3dpZHRoc1tpXV0gPSBpbnRlcnBvbGF0b3Iod2lkdGhzW2ldLCBwaXhlbFJhdGlvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfTtcblxuICAgIEltYWdlci50cmFuc2Zvcm1zID0ge1xuICAgICAgICBwaXhlbFJhdGlvOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMSA/ICcnIDogJy0nICsgdmFsdWUgKyAneCc7XG4gICAgICAgIH0sXG4gICAgICAgIHdpZHRoOiBmdW5jdGlvbiAod2lkdGgsIG1hcCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcFt3aWR0aF0gfHwgd2lkdGg7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY2xvc2VzdCB1cHBlciB2YWx1ZS5cbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogdmFyIGNhbmRpZGF0ZXMgPSBbMSwgMS41LCAyXTtcbiAgICAgKlxuICAgICAqIEltYWdlci5nZXRDbG9zZXN0VmFsdWUoMC44LCBjYW5kaWRhdGVzKTsgLy8gLT4gMVxuICAgICAqIEltYWdlci5nZXRDbG9zZXN0VmFsdWUoMSwgY2FuZGlkYXRlcyk7IC8vIC0+IDFcbiAgICAgKiBJbWFnZXIuZ2V0Q2xvc2VzdFZhbHVlKDEuMywgY2FuZGlkYXRlcyk7IC8vIC0+IDEuNVxuICAgICAqIEltYWdlci5nZXRDbG9zZXN0VmFsdWUoMywgY2FuZGlkYXRlcyk7IC8vIC0+IDJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBhcGlcbiAgICAgKiBAc2luY2UgMS4wLjFcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYmFzZVZhbHVlXG4gICAgICogQHBhcmFtIHtBcnJheS48TnVtYmVyPn0gY2FuZGlkYXRlc1xuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gICAgICovXG4gICAgSW1hZ2VyLmdldENsb3Nlc3RWYWx1ZSA9IGZ1bmN0aW9uIGdldENsb3Nlc3RWYWx1ZShiYXNlVmFsdWUsIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgdmFyIGkgICAgICAgICAgICAgPSBjYW5kaWRhdGVzLmxlbmd0aCxcbiAgICAgICAgICAgIHNlbGVjdGVkV2lkdGggPSBjYW5kaWRhdGVzW2kgLSAxXTtcblxuICAgICAgICBiYXNlVmFsdWUgPSBwYXJzZUZsb2F0KGJhc2VWYWx1ZSk7XG5cbiAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgaWYgKGJhc2VWYWx1ZSA8PSBjYW5kaWRhdGVzW2ldKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRXaWR0aCA9IGNhbmRpZGF0ZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VsZWN0ZWRXaWR0aDtcbiAgICB9O1xuXG4gICAgSW1hZ2VyLnByb3RvdHlwZS5yZWdpc3RlclJlc2l6ZUV2ZW50ID0gZnVuY3Rpb24gKGZpbHRlckZuKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICBhZGRFdmVudCh3aW5kb3csICdyZXNpemUnLCBkZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLmNoZWNrSW1hZ2VzTmVlZFJlcGxhY2luZyhzZWxmLmRpdnMsIGZpbHRlckZuKTtcbiAgICAgICAgfSwgMTAwKSk7XG4gICAgfTtcblxuICAgIEltYWdlci5wcm90b3R5cGUucmVnaXN0ZXJTY3JvbGxFdmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuc2Nyb2xsZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmludGVydmFsID0gd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYuc2Nyb2xsQ2hlY2soKTtcbiAgICAgICAgfSwgc2VsZi5zY3JvbGxEZWxheSk7XG5cbiAgICAgICAgYWRkRXZlbnQod2luZG93LCAnc2Nyb2xsJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5zY3JvbGxlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFkZEV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYudmlld3BvcnRIZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgc2VsZi5zY3JvbGxlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBJbWFnZXIuZ2V0UGFnZU9mZnNldEdlbmVyYXRvciA9IGZ1bmN0aW9uIGdldFBhZ2VWZXJ0aWNhbE9mZnNldCh0ZXN0Q2FzZSkge1xuICAgICAgICBpZiAodGVzdENhc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiB3aW5kb3cucGFnZVlPZmZzZXQ7IH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsgfTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBuYXR1cmFsV2lkdGggb2YgYW4gaW1hZ2UgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAxLjMuMVxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudH0gaW1hZ2VcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IEltYWdlIHdpZHRoIGluIHBpeGVsc1xuICAgICAqL1xuICAgIEltYWdlci5nZXROYXR1cmFsV2lkdGggPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoJ25hdHVyYWxXaWR0aCcgaW4gKG5ldyBJbWFnZSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChpbWFnZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbWFnZS5uYXR1cmFsV2lkdGg7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vbi1IVE1MNSBicm93c2VycyB3b3JrYXJvdW5kXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoaW1hZ2UpIHtcbiAgICAgICAgICAgIHZhciBpbWFnZUNvcHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgICAgICAgIGltYWdlQ29weS5zcmMgPSBpbWFnZS5zcmM7XG4gICAgICAgICAgICByZXR1cm4gaW1hZ2VDb3B5LndpZHRoO1xuICAgICAgICB9O1xuICAgIH0pKCk7XG5cbiAgICAvLyBUaGlzIGZvcm0gaXMgdXNlZCBiZWNhdXNlIGl0IHNlZW1zIGltcG9zc2libGUgdG8gc3R1YiBgd2luZG93LnBhZ2VZT2Zmc2V0YFxuICAgIEltYWdlci5nZXRQYWdlT2Zmc2V0ID0gSW1hZ2VyLmdldFBhZ2VPZmZzZXRHZW5lcmF0b3IoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHdpbmRvdywgJ3BhZ2VZT2Zmc2V0JykpO1xuXG4gICAgLy8gRXhwb3J0aW5nIGZvciB0ZXN0aW5nIGFuZCBjb252ZW5pZW5jZSBwdXJwb3NlXG4gICAgSW1hZ2VyLmFwcGx5RWFjaCA9IGFwcGx5RWFjaDtcbiAgICBJbWFnZXIuYWRkRXZlbnQgPSBhZGRFdmVudDtcbiAgICBJbWFnZXIuZGVib3VuY2UgPSBkZWJvdW5jZTtcblxuICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBDb21tb25KUywganVzdCBleHBvcnRcbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gSW1hZ2VyO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIEFNRCBzdXBwb3J0XG4gICAgICAgIGRlZmluZShmdW5jdGlvbiAoKSB7IHJldHVybiBJbWFnZXI7IH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gSWYgbm8gQU1EIGFuZCB3ZSBhcmUgaW4gdGhlIGJyb3dzZXIsIGF0dGFjaCB0byB3aW5kb3dcbiAgICAgICAgd2luZG93LkltYWdlciA9IEltYWdlcjtcbiAgICB9XG4gICAgLyoganNoaW50IGlnbm9yZTplbmQgKi9cblxufSh3aW5kb3csIGRvY3VtZW50KSk7XG4iLCIvLyB0aGUgd2hhdHdnLWZldGNoIHBvbHlmaWxsIGluc3RhbGxzIHRoZSBmZXRjaCgpIGZ1bmN0aW9uXG4vLyBvbiB0aGUgZ2xvYmFsIG9iamVjdCAod2luZG93IG9yIHNlbGYpXG4vL1xuLy8gUmV0dXJuIHRoYXQgYXMgdGhlIGV4cG9ydCBmb3IgdXNlIGluIFdlYnBhY2ssIEJyb3dzZXJpZnkgZXRjLlxucmVxdWlyZSgnd2hhdHdnLWZldGNoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHNlbGYuZmV0Y2guYmluZChzZWxmKTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcbiAgKGZhY3RvcnkoKGdsb2JhbC5XSEFUV0dGZXRjaCA9IHt9KSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBnbG9iYWwgPVxuICAgICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpcykgfHxcbiAgICAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYpIHx8XG4gICAgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbCk7XG5cbiAgdmFyIHN1cHBvcnQgPSB7XG4gICAgc2VhcmNoUGFyYW1zOiAnVVJMU2VhcmNoUGFyYW1zJyBpbiBnbG9iYWwsXG4gICAgaXRlcmFibGU6ICdTeW1ib2wnIGluIGdsb2JhbCAmJiAnaXRlcmF0b3InIGluIFN5bWJvbCxcbiAgICBibG9iOlxuICAgICAgJ0ZpbGVSZWFkZXInIGluIGdsb2JhbCAmJlxuICAgICAgJ0Jsb2InIGluIGdsb2JhbCAmJlxuICAgICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG5ldyBCbG9iKCk7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgIGZvcm1EYXRhOiAnRm9ybURhdGEnIGluIGdsb2JhbCxcbiAgICBhcnJheUJ1ZmZlcjogJ0FycmF5QnVmZmVyJyBpbiBnbG9iYWxcbiAgfTtcblxuICBmdW5jdGlvbiBpc0RhdGFWaWV3KG9iaikge1xuICAgIHJldHVybiBvYmogJiYgRGF0YVZpZXcucHJvdG90eXBlLmlzUHJvdG90eXBlT2Yob2JqKVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIpIHtcbiAgICB2YXIgdmlld0NsYXNzZXMgPSBbXG4gICAgICAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAgICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICAgICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgICAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgICAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgVWludDMyQXJyYXldJyxcbiAgICAgICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgRmxvYXQ2NEFycmF5XSdcbiAgICBdO1xuXG4gICAgdmFyIGlzQXJyYXlCdWZmZXJWaWV3ID1cbiAgICAgIEFycmF5QnVmZmVyLmlzVmlldyB8fFxuICAgICAgZnVuY3Rpb24ob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogJiYgdmlld0NsYXNzZXMuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSkgPiAtMVxuICAgICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZU5hbWUobmFtZSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWUgPSBTdHJpbmcobmFtZSk7XG4gICAgfVxuICAgIGlmICgvW15hLXowLTlcXC0jJCUmJyorLl5fYHx+IV0vaS50ZXN0KG5hbWUpIHx8IG5hbWUgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZTogXCInICsgbmFtZSArICdcIicpXG4gICAgfVxuICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvLyBCdWlsZCBhIGRlc3RydWN0aXZlIGl0ZXJhdG9yIGZvciB0aGUgdmFsdWUgbGlzdFxuICBmdW5jdGlvbiBpdGVyYXRvckZvcihpdGVtcykge1xuICAgIHZhciBpdGVyYXRvciA9IHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpO1xuICAgICAgICByZXR1cm4ge2RvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZX1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgICAgIGl0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBpdGVyYXRvclxuICB9XG5cbiAgZnVuY3Rpb24gSGVhZGVycyhoZWFkZXJzKSB7XG4gICAgdGhpcy5tYXAgPSB7fTtcblxuICAgIGlmIChoZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIHZhbHVlKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKGhlYWRlcikge1xuICAgICAgICB0aGlzLmFwcGVuZChoZWFkZXJbMF0sIGhlYWRlclsxXSk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9IGVsc2UgaWYgKGhlYWRlcnMpIHtcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgICB0aGlzLmFwcGVuZChuYW1lLCBoZWFkZXJzW25hbWVdKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIEhlYWRlcnMucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSk7XG4gICAgdmFsdWUgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5tYXBbbmFtZV07XG4gICAgdGhpcy5tYXBbbmFtZV0gPSBvbGRWYWx1ZSA/IG9sZFZhbHVlICsgJywgJyArIHZhbHVlIDogdmFsdWU7XG4gIH07XG5cbiAgSGVhZGVycy5wcm90b3R5cGVbJ2RlbGV0ZSddID0gZnVuY3Rpb24obmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXTtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuaGFzKG5hbWUpID8gdGhpcy5tYXBbbmFtZV0gOiBudWxsXG4gIH07XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShub3JtYWxpemVOYW1lKG5hbWUpKVxuICB9O1xuXG4gIEhlYWRlcnMucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gIH07XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzLm1hcCkge1xuICAgICAgaWYgKHRoaXMubWFwLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcy5tYXBbbmFtZV0sIG5hbWUsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICBpdGVtcy5wdXNoKG5hbWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGl0ZW1zLnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICBpdGVtcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgIH0pO1xuICAgIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbiAgfTtcblxuICBpZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICAgIEhlYWRlcnMucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBIZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzO1xuICB9XG5cbiAgZnVuY3Rpb24gY29uc3VtZWQoYm9keSkge1xuICAgIGlmIChib2R5LmJvZHlVc2VkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJykpXG4gICAgfVxuICAgIGJvZHkuYm9keVVzZWQgPSB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gZmlsZVJlYWRlclJlYWR5KHJlYWRlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmVzb2x2ZShyZWFkZXIucmVzdWx0KTtcbiAgICAgIH07XG4gICAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QocmVhZGVyLmVycm9yKTtcbiAgICAgIH07XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRCbG9iQXNBcnJheUJ1ZmZlcihibG9iKSB7XG4gICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKTtcbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRCbG9iQXNUZXh0KGJsb2IpIHtcbiAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpO1xuICAgIHJlYWRlci5yZWFkQXNUZXh0KGJsb2IpO1xuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICBmdW5jdGlvbiByZWFkQXJyYXlCdWZmZXJBc1RleHQoYnVmKSB7XG4gICAgdmFyIHZpZXcgPSBuZXcgVWludDhBcnJheShidWYpO1xuICAgIHZhciBjaGFycyA9IG5ldyBBcnJheSh2aWV3Lmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZSh2aWV3W2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoYXJzLmpvaW4oJycpXG4gIH1cblxuICBmdW5jdGlvbiBidWZmZXJDbG9uZShidWYpIHtcbiAgICBpZiAoYnVmLnNsaWNlKSB7XG4gICAgICByZXR1cm4gYnVmLnNsaWNlKDApXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ5dGVMZW5ndGgpO1xuICAgICAgdmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmKSk7XG4gICAgICByZXR1cm4gdmlldy5idWZmZXJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBCb2R5KCkge1xuICAgIHRoaXMuYm9keVVzZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuX2luaXRCb2R5ID0gZnVuY3Rpb24oYm9keSkge1xuICAgICAgLypcbiAgICAgICAgZmV0Y2gtbW9jayB3cmFwcyB0aGUgUmVzcG9uc2Ugb2JqZWN0IGluIGFuIEVTNiBQcm94eSB0b1xuICAgICAgICBwcm92aWRlIHVzZWZ1bCB0ZXN0IGhhcm5lc3MgZmVhdHVyZXMgc3VjaCBhcyBmbHVzaC4gSG93ZXZlciwgb25cbiAgICAgICAgRVM1IGJyb3dzZXJzIHdpdGhvdXQgZmV0Y2ggb3IgUHJveHkgc3VwcG9ydCBwb2xseWZpbGxzIG11c3QgYmUgdXNlZDtcbiAgICAgICAgdGhlIHByb3h5LXBvbGx5ZmlsbCBpcyB1bmFibGUgdG8gcHJveHkgYW4gYXR0cmlidXRlIHVubGVzcyBpdCBleGlzdHNcbiAgICAgICAgb24gdGhlIG9iamVjdCBiZWZvcmUgdGhlIFByb3h5IGlzIGNyZWF0ZWQuIFRoaXMgY2hhbmdlIGVuc3VyZXNcbiAgICAgICAgUmVzcG9uc2UuYm9keVVzZWQgZXhpc3RzIG9uIHRoZSBpbnN0YW5jZSwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlXG4gICAgICAgIHNlbWFudGljIG9mIHNldHRpbmcgUmVxdWVzdC5ib2R5VXNlZCBpbiB0aGUgY29uc3RydWN0b3IgYmVmb3JlXG4gICAgICAgIF9pbml0Qm9keSBpcyBjYWxsZWQuXG4gICAgICAqL1xuICAgICAgdGhpcy5ib2R5VXNlZCA9IHRoaXMuYm9keVVzZWQ7XG4gICAgICB0aGlzLl9ib2R5SW5pdCA9IGJvZHk7XG4gICAgICBpZiAoIWJvZHkpIHtcbiAgICAgICAgdGhpcy5fYm9keVRleHQgPSAnJztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keTtcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5ibG9iICYmIEJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgICAgdGhpcy5fYm9keUJsb2IgPSBib2R5O1xuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LmZvcm1EYXRhICYmIEZvcm1EYXRhLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICAgIHRoaXMuX2JvZHlGb3JtRGF0YSA9IGJvZHk7XG4gICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkudG9TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiBzdXBwb3J0LmJsb2IgJiYgaXNEYXRhVmlldyhib2R5KSkge1xuICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIgPSBidWZmZXJDbG9uZShib2R5LmJ1ZmZlcik7XG4gICAgICAgIC8vIElFIDEwLTExIGNhbid0IGhhbmRsZSBhIERhdGFWaWV3IGJvZHkuXG4gICAgICAgIHRoaXMuX2JvZHlJbml0ID0gbmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pO1xuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIChBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSB8fCBpc0FycmF5QnVmZmVyVmlldyhib2R5KSkpIHtcbiAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYm9keSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QmxvYiAmJiB0aGlzLl9ib2R5QmxvYi50eXBlKSB7XG4gICAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgdGhpcy5fYm9keUJsb2IudHlwZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgICAgdGhpcy5ibG9iID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpO1xuICAgICAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIGJsb2InKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlUZXh0XSkpXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMuYXJyYXlCdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICAgIHZhciBpc0NvbnN1bWVkID0gY29uc3VtZWQodGhpcyk7XG4gICAgICAgICAgaWYgKGlzQ29uc3VtZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpc0NvbnN1bWVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodGhpcy5fYm9keUFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ1ZmZlci5zbGljZShcbiAgICAgICAgICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZU9mZnNldCxcbiAgICAgICAgICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZU9mZnNldCArIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJsb2IoKS50aGVuKHJlYWRCbG9iQXNBcnJheUJ1ZmZlcilcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLnRleHQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpO1xuICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgIHJldHVybiByZWplY3RlZFxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fYm9keUJsb2IpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRCbG9iQXNUZXh0KHRoaXMuX2JvZHlCbG9iKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZWFkQXJyYXlCdWZmZXJBc1RleHQodGhpcy5fYm9keUFycmF5QnVmZmVyKSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChzdXBwb3J0LmZvcm1EYXRhKSB7XG4gICAgICB0aGlzLmZvcm1EYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKGRlY29kZSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5qc29uID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gSFRUUCBtZXRob2RzIHdob3NlIGNhcGl0YWxpemF0aW9uIHNob3VsZCBiZSBub3JtYWxpemVkXG4gIHZhciBtZXRob2RzID0gWydERUxFVEUnLCAnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUycsICdQT1NUJywgJ1BVVCddO1xuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZChtZXRob2QpIHtcbiAgICB2YXIgdXBjYXNlZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICAgIHJldHVybiBtZXRob2RzLmluZGV4T2YodXBjYXNlZCkgPiAtMSA/IHVwY2FzZWQgOiBtZXRob2RcbiAgfVxuXG4gIGZ1bmN0aW9uIFJlcXVlc3QoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVxdWVzdCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BsZWFzZSB1c2UgdGhlIFwibmV3XCIgb3BlcmF0b3IsIHRoaXMgRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJylcbiAgICB9XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keTtcblxuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIGlmIChpbnB1dC5ib2R5VXNlZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKVxuICAgICAgfVxuICAgICAgdGhpcy51cmwgPSBpbnB1dC51cmw7XG4gICAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5wdXQuY3JlZGVudGlhbHM7XG4gICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbnB1dC5oZWFkZXJzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kO1xuICAgICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZTtcbiAgICAgIHRoaXMuc2lnbmFsID0gaW5wdXQuc2lnbmFsO1xuICAgICAgaWYgKCFib2R5ICYmIGlucHV0Ll9ib2R5SW5pdCAhPSBudWxsKSB7XG4gICAgICAgIGJvZHkgPSBpbnB1dC5fYm9keUluaXQ7XG4gICAgICAgIGlucHV0LmJvZHlVc2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cmwgPSBTdHJpbmcoaW5wdXQpO1xuICAgIH1cblxuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzIHx8IHRoaXMuY3JlZGVudGlhbHMgfHwgJ3NhbWUtb3JpZ2luJztcbiAgICBpZiAob3B0aW9ucy5oZWFkZXJzIHx8ICF0aGlzLmhlYWRlcnMpIHtcbiAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7XG4gICAgfVxuICAgIHRoaXMubWV0aG9kID0gbm9ybWFsaXplTWV0aG9kKG9wdGlvbnMubWV0aG9kIHx8IHRoaXMubWV0aG9kIHx8ICdHRVQnKTtcbiAgICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlIHx8IG51bGw7XG4gICAgdGhpcy5zaWduYWwgPSBvcHRpb25zLnNpZ25hbCB8fCB0aGlzLnNpZ25hbDtcbiAgICB0aGlzLnJlZmVycmVyID0gbnVsbDtcblxuICAgIGlmICgodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpICYmIGJvZHkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzJylcbiAgICB9XG4gICAgdGhpcy5faW5pdEJvZHkoYm9keSk7XG5cbiAgICBpZiAodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpIHtcbiAgICAgIGlmIChvcHRpb25zLmNhY2hlID09PSAnbm8tc3RvcmUnIHx8IG9wdGlvbnMuY2FjaGUgPT09ICduby1jYWNoZScpIHtcbiAgICAgICAgLy8gU2VhcmNoIGZvciBhICdfJyBwYXJhbWV0ZXIgaW4gdGhlIHF1ZXJ5IHN0cmluZ1xuICAgICAgICB2YXIgcmVQYXJhbVNlYXJjaCA9IC8oWz8mXSlfPVteJl0qLztcbiAgICAgICAgaWYgKHJlUGFyYW1TZWFyY2gudGVzdCh0aGlzLnVybCkpIHtcbiAgICAgICAgICAvLyBJZiBpdCBhbHJlYWR5IGV4aXN0cyB0aGVuIHNldCB0aGUgdmFsdWUgd2l0aCB0aGUgY3VycmVudCB0aW1lXG4gICAgICAgICAgdGhpcy51cmwgPSB0aGlzLnVybC5yZXBsYWNlKHJlUGFyYW1TZWFyY2gsICckMV89JyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBPdGhlcndpc2UgYWRkIGEgbmV3ICdfJyBwYXJhbWV0ZXIgdG8gdGhlIGVuZCB3aXRoIHRoZSBjdXJyZW50IHRpbWVcbiAgICAgICAgICB2YXIgcmVRdWVyeVN0cmluZyA9IC9cXD8vO1xuICAgICAgICAgIHRoaXMudXJsICs9IChyZVF1ZXJ5U3RyaW5nLnRlc3QodGhpcy51cmwpID8gJyYnIDogJz8nKSArICdfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIFJlcXVlc3QucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMsIHtib2R5OiB0aGlzLl9ib2R5SW5pdH0pXG4gIH07XG5cbiAgZnVuY3Rpb24gZGVjb2RlKGJvZHkpIHtcbiAgICB2YXIgZm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGJvZHlcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgnJicpXG4gICAgICAuZm9yRWFjaChmdW5jdGlvbihieXRlcykge1xuICAgICAgICBpZiAoYnl0ZXMpIHtcbiAgICAgICAgICB2YXIgc3BsaXQgPSBieXRlcy5zcGxpdCgnPScpO1xuICAgICAgICAgIHZhciBuYW1lID0gc3BsaXQuc2hpZnQoKS5yZXBsYWNlKC9cXCsvZywgJyAnKTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBzcGxpdC5qb2luKCc9JykucmVwbGFjZSgvXFwrL2csICcgJyk7XG4gICAgICAgICAgZm9ybS5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KG5hbWUpLCBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgcmV0dXJuIGZvcm1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSB7XG4gICAgdmFyIGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgIC8vIFJlcGxhY2UgaW5zdGFuY2VzIG9mIFxcclxcbiBhbmQgXFxuIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IG9uZSBzcGFjZSBvciBob3Jpem9udGFsIHRhYiB3aXRoIGEgc3BhY2VcbiAgICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMlxuICAgIHZhciBwcmVQcm9jZXNzZWRIZWFkZXJzID0gcmF3SGVhZGVycy5yZXBsYWNlKC9cXHI/XFxuW1xcdCBdKy9nLCAnICcpO1xuICAgIC8vIEF2b2lkaW5nIHNwbGl0IHZpYSByZWdleCB0byB3b3JrIGFyb3VuZCBhIGNvbW1vbiBJRTExIGJ1ZyB3aXRoIHRoZSBjb3JlLWpzIDMuNi4wIHJlZ2V4IHBvbHlmaWxsXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dpdGh1Yi9mZXRjaC9pc3N1ZXMvNzQ4XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzc1MVxuICAgIHByZVByb2Nlc3NlZEhlYWRlcnNcbiAgICAgIC5zcGxpdCgnXFxyJylcbiAgICAgIC5tYXAoZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICAgIHJldHVybiBoZWFkZXIuaW5kZXhPZignXFxuJykgPT09IDAgPyBoZWFkZXIuc3Vic3RyKDEsIGhlYWRlci5sZW5ndGgpIDogaGVhZGVyXG4gICAgICB9KVxuICAgICAgLmZvckVhY2goZnVuY3Rpb24obGluZSkge1xuICAgICAgICB2YXIgcGFydHMgPSBsaW5lLnNwbGl0KCc6Jyk7XG4gICAgICAgIHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpLnRyaW0oKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHBhcnRzLmpvaW4oJzonKS50cmltKCk7XG4gICAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICBCb2R5LmNhbGwoUmVxdWVzdC5wcm90b3R5cGUpO1xuXG4gIGZ1bmN0aW9uIFJlc3BvbnNlKGJvZHlJbml0LCBvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlc3BvbnNlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGxlYXNlIHVzZSB0aGUgXCJuZXdcIiBvcGVyYXRvciwgdGhpcyBET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4nKVxuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLnR5cGUgPSAnZGVmYXVsdCc7XG4gICAgdGhpcy5zdGF0dXMgPSBvcHRpb25zLnN0YXR1cyA9PT0gdW5kZWZpbmVkID8gMjAwIDogb3B0aW9ucy5zdGF0dXM7XG4gICAgdGhpcy5vayA9IHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMDtcbiAgICB0aGlzLnN0YXR1c1RleHQgPSBvcHRpb25zLnN0YXR1c1RleHQgPT09IHVuZGVmaW5lZCA/ICcnIDogJycgKyBvcHRpb25zLnN0YXR1c1RleHQ7XG4gICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcbiAgICB0aGlzLnVybCA9IG9wdGlvbnMudXJsIHx8ICcnO1xuICAgIHRoaXMuX2luaXRCb2R5KGJvZHlJbml0KTtcbiAgfVxuXG4gIEJvZHkuY2FsbChSZXNwb25zZS5wcm90b3R5cGUpO1xuXG4gIFJlc3BvbnNlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5fYm9keUluaXQsIHtcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgICAgdXJsOiB0aGlzLnVybFxuICAgIH0pXG4gIH07XG5cbiAgUmVzcG9uc2UuZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogMCwgc3RhdHVzVGV4dDogJyd9KTtcbiAgICByZXNwb25zZS50eXBlID0gJ2Vycm9yJztcbiAgICByZXR1cm4gcmVzcG9uc2VcbiAgfTtcblxuICB2YXIgcmVkaXJlY3RTdGF0dXNlcyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF07XG5cbiAgUmVzcG9uc2UucmVkaXJlY3QgPSBmdW5jdGlvbih1cmwsIHN0YXR1cykge1xuICAgIGlmIChyZWRpcmVjdFN0YXR1c2VzLmluZGV4T2Yoc3RhdHVzKSA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlJylcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHtzdGF0dXM6IHN0YXR1cywgaGVhZGVyczoge2xvY2F0aW9uOiB1cmx9fSlcbiAgfTtcblxuICBleHBvcnRzLkRPTUV4Y2VwdGlvbiA9IGdsb2JhbC5ET01FeGNlcHRpb247XG4gIHRyeSB7XG4gICAgbmV3IGV4cG9ydHMuRE9NRXhjZXB0aW9uKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGV4cG9ydHMuRE9NRXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSwgbmFtZSkge1xuICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICB2YXIgZXJyb3IgPSBFcnJvcihtZXNzYWdlKTtcbiAgICAgIHRoaXMuc3RhY2sgPSBlcnJvci5zdGFjaztcbiAgICB9O1xuICAgIGV4cG9ydHMuRE9NRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbiAgICBleHBvcnRzLkRPTUV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBleHBvcnRzLkRPTUV4Y2VwdGlvbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZldGNoKGlucHV0LCBpbml0KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdCk7XG5cbiAgICAgIGlmIChyZXF1ZXN0LnNpZ25hbCAmJiByZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybiByZWplY3QobmV3IGV4cG9ydHMuRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgIH1cblxuICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgICBmdW5jdGlvbiBhYm9ydFhocigpIHtcbiAgICAgICAgeGhyLmFib3J0KCk7XG4gICAgICB9XG5cbiAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgc3RhdHVzOiB4aHIuc3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0LFxuICAgICAgICAgIGhlYWRlcnM6IHBhcnNlSGVhZGVycyh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkgfHwgJycpXG4gICAgICAgIH07XG4gICAgICAgIG9wdGlvbnMudXJsID0gJ3Jlc3BvbnNlVVJMJyBpbiB4aHIgPyB4aHIucmVzcG9uc2VVUkwgOiBvcHRpb25zLmhlYWRlcnMuZ2V0KCdYLVJlcXVlc3QtVVJMJyk7XG4gICAgICAgIHZhciBib2R5ID0gJ3Jlc3BvbnNlJyBpbiB4aHIgPyB4aHIucmVzcG9uc2UgOiB4aHIucmVzcG9uc2VUZXh0O1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKGJvZHksIG9wdGlvbnMpKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9O1xuXG4gICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJykpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH07XG5cbiAgICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcignTmV0d29yayByZXF1ZXN0IGZhaWxlZCcpKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9O1xuXG4gICAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJlamVjdChuZXcgZXhwb3J0cy5ET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9O1xuXG4gICAgICBmdW5jdGlvbiBmaXhVcmwodXJsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHVybCA9PT0gJycgJiYgZ2xvYmFsLmxvY2F0aW9uLmhyZWYgPyBnbG9iYWwubG9jYXRpb24uaHJlZiA6IHVybFxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHhoci5vcGVuKHJlcXVlc3QubWV0aG9kLCBmaXhVcmwocmVxdWVzdC51cmwpLCB0cnVlKTtcblxuICAgICAgaWYgKHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdpbmNsdWRlJykge1xuICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ29taXQnKSB7XG4gICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCdyZXNwb25zZVR5cGUnIGluIHhocikge1xuICAgICAgICBpZiAoc3VwcG9ydC5ibG9iKSB7XG4gICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJztcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBzdXBwb3J0LmFycmF5QnVmZmVyICYmXG4gICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykgJiZcbiAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKS5pbmRleE9mKCdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKSAhPT0gLTFcbiAgICAgICAgKSB7XG4gICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQgJiYgdHlwZW9mIGluaXQuaGVhZGVycyA9PT0gJ29iamVjdCcgJiYgIShpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSkge1xuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbml0LmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIG5vcm1hbGl6ZVZhbHVlKGluaXQuaGVhZGVyc1tuYW1lXSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlcXVlc3Quc2lnbmFsKSB7XG4gICAgICAgIHJlcXVlc3Quc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRYaHIpO1xuXG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBET05FIChzdWNjZXNzIG9yIGZhaWx1cmUpXG4gICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgICByZXF1ZXN0LnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHhoci5zZW5kKHR5cGVvZiByZXF1ZXN0Ll9ib2R5SW5pdCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogcmVxdWVzdC5fYm9keUluaXQpO1xuICAgIH0pXG4gIH1cblxuICBmZXRjaC5wb2x5ZmlsbCA9IHRydWU7XG5cbiAgaWYgKCFnbG9iYWwuZmV0Y2gpIHtcbiAgICBnbG9iYWwuZmV0Y2ggPSBmZXRjaDtcbiAgICBnbG9iYWwuSGVhZGVycyA9IEhlYWRlcnM7XG4gICAgZ2xvYmFsLlJlcXVlc3QgPSBSZXF1ZXN0O1xuICAgIGdsb2JhbC5SZXNwb25zZSA9IFJlc3BvbnNlO1xuICB9XG5cbiAgZXhwb3J0cy5IZWFkZXJzID0gSGVhZGVycztcbiAgZXhwb3J0cy5SZXF1ZXN0ID0gUmVxdWVzdDtcbiAgZXhwb3J0cy5SZXNwb25zZSA9IFJlc3BvbnNlO1xuICBleHBvcnRzLmZldGNoID0gZmV0Y2g7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpKTtcbiJdfQ==\n"]}